3

DBIを使用してPerlスクリプトからPL/PgSQLまたはPL/Perl関数を呼び出すと、関数でRAISE NOTICEまたはelog(NOTICE)が使用されている場合、値が返されないことに気付きました。説明する:

簡単な表:

CREATE TABLE "public"."table1" (
  "fld" INTEGER
) WITHOUT OIDS;

単純な関数:

CREATE OR REPLACE FUNCTION "public"."function1" () RETURNS integer AS
$body$
DECLARE
  myvar INTEGER;
BEGIN
  SELECT INTO myvar fld FROM table1 LIMIT 1;
  RETURN myvar;
END;
$body$
LANGUAGE 'plpgsql'

Perlスクリプトの一部:

use DBI;
...
my $ref = $dbh->selectcol_arrayref('SELECT function1()');
print $$ref[0];

そのまま、テーブルの値を出力します。

ただし、次のようにRAISE NOTICEを追加しても、結果は得られません。

SELECT INTO myvar fld FROM table1 LIMIT 1;
RAISE NOTICE 'Testing';
RETURN myvar;

私は何かが足りないのですか、それともそのような振る舞いは仕様によるものですか?

4

2 に答える 2

2

client_min_messagesデータベースサーバーのpostgresql.confファイルの設定を確認してください。PostgreSQL 8.3ドキュメントから:

client_min_messages(ストリング)

クライアントに送信されるメッセージレベルを制御します。有効な値は、、、、、、、、、、、、、およびPANICです。DEBUG5_ DEBUG4_ 各レベルには、それに続くすべてのレベルが含まれます。レベルが遅いほど、送信されるメッセージは少なくなります。デフォルトはです。ここでは、とはランクが異なることに注意してください。DEBUG3DEBUG2DEBUG1LOGNOTICEWARNINGERRORFATALNOTICELOGlog_min_messages

于 2009-05-14T04:04:43.850 に答える
1

DebianのPerl5.10、DBI 1.605、およびDBD :: Pg2.8.7をPostgreSQL8.3.7に対して使用して、これを再現することはできません。期待どおりに通知が印刷されます。

steve@steve@[local] =# create or replace function public.function1() returns integer language 'plpgsql' as $$ declare myvar integer; begin select into myvar fld from table1 limit 1; raise notice 'Testing'; return myvar; end; $$;
CREATE FUNCTION
steve@steve@[local] =#
[1]+  Stopped                 psql --cluster 8.3/steve
steve@arise:~$ DBI_TRACE=1 perl -MData::Dumper -MDBI -e '$dbh = DBI->connect(qw|dbi:Pg:dbname=steve;port=5433;host=/tmp steve steve|, {RaiseError=>1,PrintError=>0}); print Data::Dumper->new([$dbh->selectcol_arrayref("SELECT function1()")], [qw|result|])->Dump'
    DBI 1.605-ithread default trace level set to 0x0/1 (pid 5739) at DBI.pm line 273 via -e line 0
    Note: perl is running without the recommended perl -w option
    -> DBI->connect(dbi:Pg:dbname=steve;port=5433;host=/tmp, steve, ****, HASH(0x1c9ddf0))
    -> DBI->install_driver(Pg) for linux perl=5.010000 pid=5739 ruid=1000 euid=1000
       install_driver: DBD::Pg version 2.8.7 loaded from /usr/lib/perl5/DBD/Pg.pm
    <- install_driver= DBI::dr=HASH(0x1e06a68)
    !! warn: 0 CLEARED by call to connect method
    <- connect('dbname=steve;port=5433;host=/tmp', 'steve', ...)= DBI::db=HASH(0x1fd8e08) at DBI.pm line 638
    <- STORE('RaiseError', 1)= 1 at DBI.pm line 690
    <- STORE('PrintError', 0)= 1 at DBI.pm line 690
    <- STORE('AutoCommit', 1)= 1 at DBI.pm line 690
    <- STORE('Username', 'steve')= 1 at DBI.pm line 693
    <> FETCH('Username')= 'steve' ('Username' from cache) at DBI.pm line 693
    <- connected('dbi:Pg:dbname=steve;port=5433;host=/tmp', 'steve', ...)= undef at DBI.pm line 699
    <- connect= DBI::db=HASH(0x1fd8e08)
    <- STORE('dbi_connect_closure', CODE(0x1da2280))= 1 at DBI.pm line 708
NOTICE:  Testing
    <- selectcol_arrayref('SELECT function1()')= ( [ '2' ] ) [1 items] at -e line 1
$result = [
            '2'
          ];

問題を小さなスクリプト(上記のような)に分離し、DBI_TRACEかなり高い設定で実行して、どのような違いが見られるかを確認することをお勧めします。たぶん、DBD :: Pgのリリースノートを見て、過去にこれらによって混乱していた可能性があると彼らが言及しているかどうかを確認します。私はこれDBI_TRACE=10を見ます:

PQexec
Begin pg_warn (message: NOTICE:  Testing
 DBIc_WARN: 1 PrintWarn: 1)
NOTICE:  Testing
End pg_warn
Begin _sqlstate

したがって、自分の出力でそのようなものを探す必要があります。

于 2009-05-13T23:18:20.237 に答える