2009-05-13 5 views
3

DBIを使用してPerlスクリプトからPL/PgSQLまたはPL/Perl関数を呼び出すと、RAISEこの機能では、通知またはelog(NOTICE)が使用されます。説明するために:Perl + Postgresql:RAISE NOTICEが存在する場合に関数が値を返さない

を単純なテーブル:

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

に単純な関数:Perlスクリプトの

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' 

ピース:

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

を、それが値を出力し、ようにテーブルから。

しかし、次のように、私はRAISE注意を追加した場合、私は何の結果を得るません:

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

私は何かや、そのような行動をしないのですが仕様ですか?

答えて

2

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

client_min_messages(文字列)メッセージレベルをクライアントに送信され

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

+0

Johnさん、postgresql.confファイルを調整して解決しました。 – Denys

1

PostgreSQL 8.3.7に対してDebianのPerl 5.10、DBI 1.605、DBD :: Pg 2.8.7を使用してこれを再現することはできません。私は予告通りに通知を出します。

[email protected]@[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 
[email protected]@[local] =# 
[1]+ Stopped     psql --cluster 8.3/steve 
[email protected]:~$ 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' 
      ]; 

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

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

だから、あなたがあなた自身の出力のようなものを探してください。DBI_TRACE=10で、私はこれを参照してください。

+0

私はPostgresは、別のボックス上で実行されますので、私はDBD :: PGPPを使用することを言及するのを忘れてしまいました。 DBI-> trace()を追加しようとしましたが、私はまだ結果も通知も見ることができません。 postgresql.confのclient_min_messages = errorを設定すると、実際に役に立ちました。 – Denys

+0

ええと、DBD :: PgPPドライバのような音はメッセージに対処しないので、問題を回避しています。 DBD :: Pgを使って別のマシンのpostgresと話すこともできます。サーバービルド全体ではなく、DBD :: Pgを使用するにはlibpqがインストールされている必要があります。 – araqnid

+0

はい、DBD :: PgPP 0.06を使用すると、問題が再現されます。メンテナに報告することをお勧めします。 – araqnid

関連する問題