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;
なるほど、ありがとう。 EXECUTEクエリから配列を作成するにはどうすればよいですか? –
EXECUTE 'SELECT ARRAY(mytableからmytableを選択)' INTO avar;またはあなたのexampleL:EXECUTE 'SELECT ARRAY(' || findAllQuery || ')' INTO ... ちょっとメモ - SQLインジェクションに対して脆弱ではない - 動的SQL内の識別子の安全なクォートのためにquote_ident関数を使うべきです –
もう一度ありがとう!これは動作しています:)。私はあなたが私のクエリ**注射**に** vulnarableであることを意味し、私はそれを 'findAllQuery:= 'SELECT DISTINCT' || quote_ident(mapTable2_key)|| 'FROM' || quote_ident(mapping_table)|| 'WHERE' || quote_ident(mapTable1_key)|| '= ANY(inputIdsToDelete)'; '?私の唯一の問題は、入力配列 'inputIdsToDelete'をselectクエリにバインドすることです。エラーのような別のエラーが表示されます。列inputIdsToDeleteが存在しません。私はanoterの質問を開くか、ここで私を助けることができますか? –