2014-02-16 2 views
0

plpgsql 9.1에서 변수에 정수로 행 수를 지정하려고합니다.
1 시도 : 아무것도 2 시도plpgsql에서 변수에 행 수를 할당 할 수 없습니다.

maz int := (SELECT count(col1) FROM table WHERE col1 = quote_literal(val1)); 

을 할당되지 도착 : INTO

근처에 점점 오류를
EXECUTE 'SELECT count(col1) FROM table 
     WHERE col1 = quote_literal(val1) INTO maz'; 

편집 : 그것은 오타했다으로 "의"삭제.

+0

헤더를 포함하여 * complete * 함수 정의를 게시해야 여기에 표시됩니다. –

답변

3

예제가 약간 지저분합니다.

첫 번째 예는 잘못되었습니다. 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() 기능을 가지고있다.

+0

@Erwin 나는 quote_literal을 SQL 인젝션 및 기타 위협으로부터 보호하기 위해 다른 방법과 차별적으로 사용하고 있습니다. 그러나 동일한 것에 대해 더 많은 지침을 제공 할 수 있다면 크게 감사하겠습니다. 감사합니다 – vedic

+0

@vedic : SQL 인젝션으로부터 보호하는 방법에 대한 포인터? [이 관련 답변에 자세한 내용이 있습니다.] (http://stackoverflow.com/questions/10705616/table-name-as-a-postgresql-function-parameter/10711349#10711349) 또는 [검색을 시도하십시오.] (http : //stackoverflow.com/search?q=[plpgsql]+execute+%22sql+injection%22) –

관련 문제