2012-02-28 10 views
0

PostgreSQLデータベースには、PL/pgSQLで書かれた関数が含まれています。私はこのようなSQLクエリウィンドウからうまくそれを実行することができます:pgAdmin pgScriptからPL/pgSQL関数を呼び出せないのはなぜですか?

BEGIN TRANSACTION; 
SELECT sg_copy_form(414, 2621, 1, 1035); 
ROLLBACK TRANSACTION; 

しかし、私は正確にpgScript上記と同じSQLを実行する場合(例えば、実行pgScript pgAdminで中ボタンの代わりに、は、[実行]をクリックしますクエリ)が、私は次のエラーを取得する:

[QUERY ] BEGIN TRANSACTION 
[WARNING ] SELECT sg_copy_form(414, 2621, 1, 1035) 
     ERROR: function sg_copy_form(integer, integer, integer, integer) does not exist 
     LINE 1: SELECT sg_copy_form(414, 2621, 1, 1035) 
        ^
     HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
[QUERY ] ROLLBACK TRANSACTION 

これはなぜでしょうか? pgScriptからPL/pgSQL関数を呼び出すことは可能ですか?

関連する場合:私はPostgreSQL 8.3.14でpgAdmin III 1.12.2を使用してこれを試しています。


編集:私はEelkeにより示唆されるように、このように、関数の名前を完全修飾しようとした:通常のSQLクエリとして実行したとき

BEGIN TRANSACTION; 
SELECT db_dev.public.sg_copy_form(414, 2621, 1, 1035); 
ROLLBACK TRANSACTION; 

それはまだ正常に動作しますが、今私はpgScriptとして、それを実行したとき、私は異なるエラーメッセージが表示されます。

[QUERY ] BEGIN TRANSACTION 
[WARNING ] SELECT db_dev.public.sg_copy_form(414, 2621, 1, 1035) 
     ERROR: cross-database references are not implemented: db_dev.public.sg_copy_form 
[QUERY ] ROLLBACK TRANSACTION 
+0

これは、pgScriptが別のデータベースのコンテキスト内で実行されることを意味します。 –

+0

このような文は、 'SELECT mydb.myschema.some_func(..);'は決して動作しません。エラーメッセージには、データベース間参照は実装されていません。データベース名の前に接頭辞を付けることはできません。あなたはあなたの編集で間違っている必要があります。 –

+0

上記の編集のテキストは正しいです。 pgAdminのバグ(下記のコメントを参照)は、間違ったデータベース上でpgScriptを実行することを意味します。したがって、上記のコードをSQLとして実行すると、プレフィックスはデータベース名と一致するため、問題は発生しません。コードをpgScriptとして実行すると別のデータベース上で実行されるため、プレフィックスが一致せず、エラーが発生します。 – gutch

答えて

2

はあなたの時間というあなたのダブルチェックをしましたどちらの場合も同じ環境をお使いですか?確認してください

  • 同じデータベース、
  • 同じユーザ、
  • 同じのsearch_path問題はおそらくpgadmin3でいくつかの設定が異なっていて、あなただけの「見る」していないということです

関数。

編集

次のような設定を比較することができます

(すなわち唯一の "実行")、プレーンSQLとしてこれを実行します。

select current_database(), current_user, current_setting('search_path'); 

はpgScriptとしてこれを実行します。

declare @foo{ @db, @usr, @p }; 
set @foo = select current_database(), current_user, current_setting('search_path'); 
print @foo; 

終了編集

ところで:エラーメッセージはサーバーからのもので、これはに書かれた関数で発生します()。 SQL、pljava)、PL/pgSQLだけではありません。

+0

pgAdminでどのボタンを押しているのかが異なるので、確かに同じデータベース、ユーザ、およびsearch_pathです。 :_Execute query_または_Execute pgScript_ – gutch

+0

検索パスを明示的に設定するか、関数名を完全修飾することができますか?私はそれが必要ではないはずですが、pgAdminは何か不思議なことをしている可能性があることを知っています(バグを含むように)。 – Eelke

+0

私は 'SET search_path TO public;で検索パスを設定しようとしましたが、違いはありません。しかし、私は完全に関数名を品質すると_different_エラーメッセージが表示されます - 上記の私の編集を参照してください! – gutch

関連する問題