을 함수하지 않는 단순히 당신이 제공 한 변수를 연결하고 결과 SQL을 실행하면 전체 WHERE 절을 이와 같은 매개 변수로 전달할 수 없습니다.
가장 큰 이유는 보안입니다. 함수에 대한 입력이 궁극적으로 신뢰할 수없는 사용자 (예 : 웹 사이트의 입력)에서 발생했을 수 있으며 사용자가 임의로 검색어를 변경할 수 없게하려는 경우가 있습니다. 또한 사용하기가 어색 할 것입니다 : O'Reilly
성을 검색하려면 '
이 이스케이프되었는지 여부를 추적하지 않으면 기능이 중단됩니다.
대신 쿼리와 데이터가 별도로 유지됩니다. WHERE $1
이 작동하는 유일한 시간은 $1
이 부울 인 경우입니다. 마찬가지로, WHERE name=$1
은 오직 등 적절한 값 (아마 text
또는 varchar
)에 대해 name
을 비교합니다
당신은 정말 자주 경우 가끔 발생하는 동적 SQL 쿼리를 위해 필요하지만,하지 않은 경우 말했다 모든 DB를 잘 디자인 했으니 a plpgsql
function with an EXECUTE
statement을 사용할 수 있습니다.
이
SELECT code, name from tbl where code = $1;
그런 다음 다른 사용 사례에 대해 변형 함수를 추가 할 수 있습니다, 또는 명시 적있다 :이 경우
, 당신은 아마 명시 적으로 그것을 확인하기 위해 입력
code
의 값과 쿼리가되고 싶어요과 같은 부울 플래그는 동적 SQL의 위험과 복잡성이 없어도 다른 쿼리를 선택합니다.
'$ 1'은'$ 1'을 의미합니다 - 그리고 varchar를 정의하십시오 ... 어쩌면 당신은 '이름 = $ 1;'tbl에서 이름을 선택 했습니까?'.. –
당신은 where 절에 오류가 있습니다. ,'where column = $ 1'와 같아야합니다. – JustMe
알아요. 그러나 함수의 매개 변수는 'name = ...'입니다. – NiemNV