我们的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
答案 0 :(得分: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;
结束修改
BTW:由于错误消息来自服务器,所以用任何语言(例如SQL,pljava)编写的函数会发生这种情况,而不仅仅是PL / pgSQL。