为什么我不能从pgAdmin pgScript调用PL / pgSQL函数?

时间:2012-02-28 07:47:27

标签: postgresql plpgsql pgadmin

我们的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函数?

如果相关:我正在使用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

1 个答案:

答案 0 :(得分: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;

结束修改

BTW:由于错误消息来自服务器,所以用任何语言(例如SQL,pljava)编写的函数会发生这种情况,而不仅仅是PL / pgSQL。