예제가 약간 지저분합니다.
첫 번째 예는 잘못되었습니다. IN
키워드를 잘못 사용했을 가능성이 있으며, quote_literal()
은이 문맥에서 전혀 쓸모가 없습니다. 두번째 것은 아마도 잘못된 것입니다 - val1
이 변수라면. plpgsql 변수는 EXECUTE
문에서 SQL 문자열 내에 표시되지 않습니다. 다음 호는 SQL 문자열에 INTO
입니다. 당신이 USING
절을 사용할 수없는 경우
postgres=# do $$
DECLARE rc int;
val1 varchar := 'Hello';
BEGIN
rc := (SELECT count(*) FROM xxx WHERE xxx.v = val1);
RAISE NOTICE '%', rc;
EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = $1'
USING val1 INTO rc;
RAISE NOTICE '%', rc;
END;
$$;
NOTICE: 1
NOTICE: 1
DO
quote_literal()
는 동적 SQL에 일반적으로 필요하다. 귀하의 예 :
EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = ' || quote_literal(val1)
INTO ...
이것은 SQL 주입을 방지하고 적절한 이탈을 보장합니다.
EXECUTE format('SELECT count(*) FROM xxx WHERE xxx.v = %L', val1) INTO ...
그러나 EXECUTE ... USING
선호한다 :
현대 릴리스는 format()
기능을 가지고있다.
헤더를 포함하여 * complete * 함수 정의를 게시해야 여기에 표시됩니다. –