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
これは、pgScriptが別のデータベースのコンテキスト内で実行されることを意味します。 –
このような文は、 'SELECT mydb.myschema.some_func(..);'は決して動作しません。エラーメッセージには、データベース間参照は実装されていません。データベース名の前に接頭辞を付けることはできません。あなたはあなたの編集で間違っている必要があります。 –
上記の編集のテキストは正しいです。 pgAdminのバグ(下記のコメントを参照)は、間違ったデータベース上でpgScriptを実行することを意味します。したがって、上記のコードをSQLとして実行すると、プレフィックスはデータベース名と一致するため、問題は発生しません。コードをpgScriptとして実行すると別のデータベース上で実行されるため、プレフィックスが一致せず、エラーが発生します。 – gutch