2017-12-14 17 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ウィリーニリーを使用しています。私が作成しているクエリは、フロントエンド用に設計されておらず、私が変更しているライブラリで既に設定されているデザインパターンに従っています。

+0

PL/pgSQL関数内では 'execute'しか使用できません –

+0

SQL実行とplpgsql実行を混同します。 –

答えて

2

あなたはSQLの実行とplpgsqlの実行を混同します - 最初に準備された文を実行し、SQLで(試してみると)実行されます。第2の機能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関数、つまり、異なる タブを含むコマンドそれらが実行されるたびに異なるデータ型を使用します。 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が:

updtae

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 

をダイナミックを使用して注入を避けるために、コード、関数を使用format https://www.postgresql.org/docs/current/static/functions-string.html

フォーマット文字列に従ったフォーマット引数。この関数は、C関数sprintfに似た です。