0

PostgreSQLデータベースには、PL/pgSQLで記述された関数が含まれています。次のようなSQLクエリウィンドウから問題なく実行できます。

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

ただし、上記のpgScriptとまったく同じSQLを実行すると(たとえば、クエリの実行ではなく、 pgAdminの[ pgScriptの実行]ボタンをクリックすると)、次のエラーが発生します。

[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関数を呼び出すことは可能ですか?

関連する場合:私はこれをPostgreSQL8.3.14とpgAdminIII1.12.2で試しています。


編集:私は次のように、Eelkeによって提案された関数の名前を完全に修飾しようとしました:

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

通常のSQLクエリとして実行しても正しく機能しますが、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
4

1 に答える 1

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;

編集終了

ところで:エラーメッセージはサーバーから送信されるため、これはPL / pgSQLだけでなく、任意の言語(SQL、pljavaなど)で記述された関数で発生します。

于 2012-02-28T08:16:24.367 に答える