1

function があるとしましょうshow_files(IN file text, IN suffix text, OUT statement text)。次のステップで、関数が呼び出されます。

 SELECT * FROM show_files(file := 'example', suffix := '.png');

私の質問は次のとおりです。その関数内からこの関数を呼び出したステートメントを取得できる解決策はありますか?

SELECTつまり、関数の出力を実行した後、次の(OUT statement text)ようになるはずです:'SELECT * FROM show_files(file := 'example', suffix := '.png');'または、このステートメントを関数内の変数に割り当てることは可能ですか?

トリガー プロシージャで 、 などTG_NAMEのような機能が必要です。TG_OP

SELECT current_query FROM pg_stat_activity からこのステートメントを取得することは可能でしょうか?

関数内で使用しようとすると、空のレコードがあります。

CREATE OR REPLACE FUNCTION f_snitch(text)
  RETURNS text AS
$BODY$
declare
rr text;
BEGIN
    RAISE NOTICE '.. from f_snitch.';
    -- do stuff
    SELECT current_query  into rr FROM pg_stat_activity 
    WHERE current_query ilike 'f_snitch';
    RETURN rr;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

どんな助けや提案も大歓迎です!

4

2 に答える 2

1

TG_NAMEと friends は、トリガー関数にのみ存在する特別な変数です。通常の plpgsql 関数にはそのようなものはありません。plpgsqlの呼び出された関数内でこれを取得する方法については、私はまだ考えていません。

関数に追加して、必要な情報を取得できますRAISE NOTICE

CREATE OR REPLACE FUNCTION f_snitch(text)
  RETURNS text LANGUAGE plpgsql AS
$func$
BEGIN
    RAISE NOTICE '.. from f_snitch.';
    -- do stuff
    RETURN 'Snitch says hi!';
END
$func$;

電話:

SELECT f_snitch('foo')

結果に加えて、これは通知を返します。

NOTICE:  .. from f_snitch.

次の 2 つの点で満足できません。

  1. 公告文は通知にありません。
  2. 通知にCONTEXTはありません。

1.の場合は、代わりに使用できますRAISE LOG(または、NOTICESをログに記録するようにクラスターを設定します-通常はそうしませんが、私には冗長すぎます)。標準設定でSTATEMENTは、データベース ログに次の行が追加されます。

LOG:  .. from f_snitch.
STATEMENT:  SELECT f_snitch('foo')

2.については、dba.SEでこの関連する質問をご覧ください。CONTEXT次のようになります。

CONTEXT:  SQL statement "SELECT f_raise('LOG', 'My message')"
    PL/pgSQL function "f_snitch" line 5 at PERFORM
于 2012-10-26T19:58:55.360 に答える
0

わかりました!

CREATE OR REPLACE FUNCTION f_snitch(text)
  RETURNS setof record AS
$BODY$
BEGIN
   RETURN QUERY
    SELECT current_query 
    FROM pg_stat_activity 
    <strike>ORDER BY length(current_query) DESC LIMIT 1;</strike>
    where current_query ilike 'select * from f_snitch%';
    -- much more reliable solution

END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

  select * from f_snitch('koper') AS (tt text);

結果は次のとおりです。

ここに画像の説明を入力

おそらく 100% 信頼できるソリューションではありませんが、小規模なシステム (少数のユーザー向け) では問題ありません。

于 2012-10-30T14:58:31.307 に答える