2016-08-31 9 views
1

私はget_all_rezultz()と呼ばれるこの関数でそれらを実行しようとしていますが、次のような有効なSQLクエリのみを含む1行のrezultzというテーブルがあります。仕事、任意のアイデアなぜですか? RETURN QUERYの関数からの文字列クエリの実行

ERROR: syntax error at or near ""CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); "" 
    LINE 1: ("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPD... 
    ^
    QUERY: ("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ") 
     CONTEXT: PL/pgSQL function get_all_rezultz() line 10 at RETURN QUERY 

NOTICE: identifier "CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); " will be truncated to "CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE O" 
    CONTEXT: SQL statement "("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ")" 

PL/pgSQL関数のget_all_rezultz()ライン10 **********:ここ

 CREATE OR REPLACE FUNCTION get_all_rezultz() RETURNS SETOF rezultz AS 
    $BODY$ 
    DECLARE 
r rezultz%rowtype; 
    BEGIN 
FOR r IN 
    SELECT * FROM rezultz 
LOOP 
    -- can do some processing here 
    RETURN QUERY EXECUTE r; -- return current row of SELECT 
END LOOP; 
RETURN; 
END 
    $BODY$ 
LANGUAGE plpgsql; 

    SELECT * FROM get_all_rezultz(); 

は、私が手にエラーがありますエラー**********

ERROR: syntax error at or near ""CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman   FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); "" 
    SQL state: 42601 
    Context: PL/pgSQL function get_all_rezultz() line 10 at RETURN QUERY 
+0

ようこそ。 「うまくいかない」とはどういう意味ですか?エラー?予想される結果を提供していませんか? –

+0

エラーが発生した場所で更新されました – Aaron

+0

これはうまくいきません。これで解決しようとしている実際の問題は何ですか?関数が複数の結果を返すことはできず、 'return query'を使ってDDL文を実行することはできません。一歩前に戻って、あなたが持っている根本的な問題を説明してください。 –

答えて

1

変数rは、複数の列を含むレコードです。スカラー値(文字列など)ではありません。

したがって、executeステートメントの列名を使用する必要があります。表の列を想定するとは、あなたが使用する必要がsql_statementと呼ばれる:

RETURN QUERY EXECUTE r.sql_statement; 

そのテーブルに格納されているselect文は、最も確実SETOF rezultzそれで結果を返しません。しかし、これはまだ動作しません。クエリがselect * from mytableの場合はSETOF mytableを返します。

RETURNS SETOF recordを指定する必要がありますが、を呼び出して関数を呼び出すと、結果の列名と構造を指定する必要があります。

さらに、関数が複数のクエリからの複数の結果ではなく、単一の結果しか返さないため、これは機能しません。rezultzに複数の行が含まれている場合に発生します。あなたのSQL文は、あなたが主張しているとして、あなたはCREATE TRIGGER文にRETURN QUERYを使用することはできませんEXECUTEを使用する必要がありますSELECT文は、実際にされていない場合

+0

次のエラーが表示されます。 - エラー:カーソルとしてCREATE TRIGGERクエリを開くことができません。 – Aaron

+0

'return query'で' CREATE TRIGGER'文を実行することはできません。しかし、あなたは、* "* from mytable *のような有効なSQLクエリーを含んでいる"テーブルは、そこに 'create trigger'の言及がないと主張しました。 –

+0

ありがとう、それは働いた非常に良い情報:)! – Aaron

関連する問題