2017-12-14 1 views
1

쿼리의 문자열 표현을 입력으로 사용하는 PostgreSQL 라이브러리의 확장 기능을 연구 중입니다. 기본적으로이 문자열 기반 쿼리가 생성하는 결과 테이블을 인스턴스화하고 수정 한 다음 다른 함수에 전달해야합니다.PostgreSQL의 EXECUTE 문 구문 오류

은 지금은 단지 임시 테이블로 instatiated 쿼리를 얻기 위해 노력하고, 그래서 나는이 샘플 쿼리를 사용하고 있습니다 :

CREATE TEMPORARY TABLE pgr_table (seq INTEGER, path_seq INTEGER, node INTEGER, edge BIGINT, cost DOUBLE PRECISION, agg_cost DOUBLE PRECISION); 

EXECUTE 'SELECT gid AS id, source, target, cost, reverse_cost FROM ways;' INTO pgr_table; 

을하지만 이것은 단지 EXECUTE 명령 후, 구문 오류가 발생합니다. 올바르게 사용하지 않습니까?

덧붙여서 나는 SQL 주입의 위험성을 알고 EXECUTE willy-nilly를 사용하고 있습니다. 내가 작성한 쿼리는 프런트 엔드 용도로 설계되지 않았으며 내가 수정중인 라이브러리에서 이미 설정 한 디자인 패턴을 따르고 있습니다.

+0

PL/pgSQL 함수 내에서만'execute'를 사용할 수 있습니다 –

+0

SQL 실행과 plpgsql 실행을 혼동합니다. –

답변

2

SQL 실행과 plpgsql 실행을 혼동 - 먼저 준비된 명령문을 실행하고 SQL에서 실행됩니다 (시도 할 때). 두 번째는 기능 plpgsql의 코드의 일부이다

https://www.postgresql.org/docs/current/static/sql-execute.html

EXECUTE - 준비된 명령문

때때로

https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

당신이 당신의 PL 내부 동적 명령을 생성 할 것을 실행/pgSQL 함수, 즉 서로 다른 명령을 포함합니다. 탭 les 또는 다른 데이터 유형을 실행할 때마다. PL/pgSQL의 ( 42.10.2 절에서 설명했듯이) 명령에 대한 계획을 캐시하는 일반적인 시도는 그러한 시나리오에서는 작동하지 않습니다. 문제의이 종류를 처리하기 위해, EXECUTE 문이 제공됩니다

예 :

t=# prepare s as select now(); 
PREPARE 
t=# execute s; 
       now 
------------------------------- 
2017-12-14 12:47:28.844485+00 
(1 row) 

및 plpgsql : 동적 사용하여 주입을 방지하기

t=# do 
$$ 
declare 
t text; 
begin 
execute 'select now()' into t; 
raise info '%',t; 
end; 
$$ 
; 
INFO: 2017-12-14 12:48:45.902768+00 
DO 

updtae을 코드, 함수 사용 format https://www.postgresql.org/docs/current/static/functions-string.html

형식 문자열에 따른 형식 인수. 이 함수는 C 함수 인 sprintf와 비슷한 입니다.