0

我们的 PostgreSQL 数据库包含一个用 PL/pgSQL 编写的函数。我可以从这样的 SQL 查询窗口很好地运行它:

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

但是,如果我在上面运行与 pgScript 完全相同的 SQL(例如,单击 pgAdmin 中的Execute pgScript按钮而不是Execute query),那么我会收到以下错误:

[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 函数?

如果相关:我正在使用 pgAdmin III 1.12.2 在 PostgreSQL 8.3.14 上尝试这个。


编辑:我尝试按照 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

您是否仔细检查了两种情况下是否具有相同的环境?请检查

  • 同一个数据库,
  • 同一个用户,
  • 相同的搜索路径

问题很可能是 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。

于 2012-02-28T08:16:24.367 回答