2012-05-13 10 views
3

plpgsql関数で動的選択クエリを使用して配列を作成しようとしています。残念ながら、私は構文エラーを取得します。PL/pgSQLで動的クエリを使用して配列を作成する

ERROR: syntax error at or near "EXECUTE" 
ZEILE 19: SELECT DISTINCT INTO outputIdsToDelete ARRAY(EXECUTE findA... 
                 ^

誰かが私を助けてくれますか?ここ は、関数自体です:

CREATE OR REPLACE FUNCTION deleteMAPPINGs(
    mapTable1_key text, mapping_table text, mapTable2_key text, 
    table2 text, table2_key text, 
    inputIdsToDelete bigint[]) RETURNS bigint[] AS 
$BODY$ 
DECLARE 
    outputIdsToDelete bigint[]; 
    findAllQuery text; 
    findUnreferencedQuery text; 
    BEGIN 
    findAllQuery := 'SELECT DISTINCT ' || mapTable2_key || 
     ' FROM ' || mapping_table || 
     ' WHERE ' || mapTable1_key || ' = ANY(inputIdsToDelete)'; 
    findUnreferencedQuery := 'SELECT DISTINCT ' || table2_key || --find unused 
     ' FROM ' || table2 || 
     ' WHERE ' || table2_key || ' NOT IN (' || 
      'SELECT DISTINCT ' || mapTable2_key || --all used 
      ' FROM ' || mapping_table || ')'; 

    SELECT DISTINCT INTO outputIdsToDelete ARRAY(EXECUTE findAllQuery); 

    DELETE FROM mapping_table WHERE 
     mapTable1_key = ANY(inputIdsToDelete) AND 
     mapTable2_key = ANY(outputIdsToDelete); 

    SELECT DISTINCT INTO outputIdsToDelete --overwrite with unused 
     ARRAY(EXECUTE findUnreferencedQuery); 

    RETURN outputIdsToDelete; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100; 

答えて

5

あなたは、SQLステートメント内でEXECUTE使用することはできません - EXECUTEのみplpgsqlが声明されているので、それはSQL内ですることはできません -

EXECUTE string INTO variable 
+0

なるほど、ありがとう。 EXECUTEクエリから配列を作成するにはどうすればよいですか? –

+1

EXECUTE 'SELECT ARRAY(mytableからmytableを選択)' INTO avar;またはあなたのexampleL:EXECUTE 'SELECT ARRAY(' || findAllQuery || ')' INTO ... ちょっとメモ - SQLインジェクションに対して脆弱ではない - 動的SQL内の識別子の安全なクォートのためにquote_ident関数を使うべきです –

+0

もう一度ありがとう!これは動作しています:)。私はあなたが私のクエリ**注射**に** vulnarableであることを意味し、私はそれを 'findAllQuery:= 'SELECT DISTINCT' || quote_ident(mapTable2_key)|| 'FROM' || quote_ident(mapping_table)|| 'WHERE' || quote_ident(mapTable1_key)|| '= ANY(inputIdsToDelete)'; '?私の唯一の問題は、入力配列 'inputIdsToDelete'をselectクエリにバインドすることです。エラーのような別のエラーが表示されます。列inputIdsToDeleteが存在しません。私はanoterの質問を開くか、ここで私を助けることができますか? –

関連する問題