• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:pgAdminIII RAISEの結果取得について)

pgAdminIIIでRAISE文の結果を表示する方法

このQ&Aのポイント
  • SQLからSQLを呼び出す形でRAISE文の結果を表示しようとしていますが、PERFORMに変更すると結果が表示されません。手を加えずに表示させる方法を知っている方、教えてください。
  • SQLからSQLを呼び出す方法でRAISE文の結果を表示しようとしていますが、PERFORMのままでは結果が表示されません。手を加えずに表示させる方法をご存知の方、教えてください。
  • pgAdminIIIでSQLからSQLを呼び出す場合、RAISE文の結果を表示する方法を教えてください。PERFORMに変更すると結果が表示されず、呼び出し先のSQLを変更したくありません。知っている方、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • gacky-79
  • ベストアンサー率100% (14/14)
回答No.2

PL/pgSQL から、出力パラメータ (OUT 引数) のある関数を呼び出す場合、 引数ではなく返値として値を受け取る必要があります。 PERFORM ではなく、SELECT INTO を使ってみてください。 CREATE OR REPLACE FUNCTION fn_raise(OUT o_v1 int, OUT o_v2 int) AS $$ BEGIN o_v1 := 123; o_v2 := 456; END; $$ LANGUAGE plpgsql; DO $$ DECLARE v1 int; v2 int; BEGIN SELECT * INTO v1, v2 FROM fn_raise(); RAISE WARNING 'v1=%, v2=%', v1, v2; END; $$; WARNING: v1=123, v2=456

stagea260
質問者

お礼

度々の回答、誠に有難う御座います。 ここまで回答して頂いて、本当に感謝しております。 下記ファンクションにて実行してみたのですが、うまくいきません。 CREATE OR REPLACE FUNCTION raise_test(in i_data_num numeric, out o_data_num numeric, out o_data_char character varying) RETURNS integedr AS 度重なる質問で、誠に申し訳ございませんが、手法をご教授ください。 よろしくお願いいたします。

その他の回答 (1)

  • gacky-79
  • ベストアンサー率100% (14/14)
回答No.1

サーバのバージョンと、事象を再現できる具体的なコードが必要です。 例えば以下だと、v9.0では期待通りに動作したのですが、違うことをやっているでしょうか? CREATE OR REPLACE FUNCTION fn_raise() RETURNS integer AS $$ BEGIN RETURN 123; END; $$ LANGUAGE plpgsql; DO $$ BEGIN RAISE WARNING '%', fn_raise(); END; $$; WARNING: 123

stagea260
質問者

お礼

回答、ありがとうございます。 ver9.0.4をCentOS上で利用しています。 クライアントPCはWindows7です。 行おうとしていることを下記に記載致します。 (1)TEST_DATAテーブルに下記レコードが存在します。 data_num(numeric(8,0)) | data_char(varchar(8)) 1 | AAAAA 2 | BBBBB 3 | CCCCC 4 | DDDDD 5 | EEEEE (2)呼び出し先のSQLは下記のとおりです。 CREATE OR REPLACE FUNCTION raise_test(i_data_num numeric, o_data_num numeric, o_data_char character varying) RETURNS integer AS $BODY$ DECLARE count int := 0; BEGIN -- RAISE WARNING 'raise_test i_data_num %',i_data_num; SELECT COUNT(DATA_NUM) INTO count FROM TEST_DATA WHERE DATA_NUM = i_data_num; -- RAISE WARNING 'raise_test count %',count; IF count = 0 then o_data_num := 0; o_data_char := NULL; return 1; end if; SELECT DATA_NUM ,DATA_CHAR INTO o_data_num ,o_data_char FROM TEST_DATA WHERE DATA_NUM = i_data_num; -- RAISE WARNING 'raise_test o_data_num %',o_data_num; -- RAISE WARNING 'raise_test o_data_char %',o_data_char; RETURN 0; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION raise_test(numeric, numeric, character varying) OWNER TO postgres; (3)呼び出し元のSQLは下記のとおりです。 CREATE OR REPLACE FUNCTION raise_exe() RETURNS void AS $BODY$ DECLARE x int := 1; o_data_num numeric(8); o_data_char varchar(8); BEGIN --PERFORM raise_test(3,o_data_num ,o_data_char); --SELECT raise_test(10,o_data_num ,o_data_char); RAISE WARNING 'WARNING %', raise_test(3,o_data_num ,o_data_char); RAISE WARNING 'WARNING %',o_data_num; RAISE WARNING 'WARNING %',o_data_char; --RAISE NOTICE 'NOTICE %', raise_test(5,o_data_num ,o_data_char); --RAISE NOTICE 'NOTICE %',o_data_num; --RAISE NOTICE 'NOTICE %',o_data_char; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION raise_exe() OWNER TO postgres; (4)結果が以下となります。 WARNING: WARNING 0 WARNING: WARNING <NULL> WARNING: WARNING <NULL> 根本的に何か間違っているのでしょうか?

関連するQ&A