2012-02-28 54 views
0

我们的PostgreSQL数据库包含一个用PL/pgSQL编写的函数。我可以运行它只是从SQL查询窗口,这样的罚款:为什么我不能从pgAdmin pgScript调用PL/pgSQL函数?

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

但是如果我刚好运行上面相同的SQL作为一个看到pgscript(例如,单击执行看到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的建议,像这样:

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

这意味着,pgScript在另一个数据库的上下文中执行。 – 2012-02-28 10:55:41

+0

像这样的语句:'SELECT mydb.myschema.some_func(..);'不能工作。如错误消息所示:跨数据库引用未实现。您不能为数据库名称加前缀。您必须在编辑时误会。 – 2012-02-28 22:22:47

+0

上面的编辑文本是正确的。事实证明,pgAdmin中一个可能的错误(请参阅下面的答案中的注释)意味着它在错误的数据库上执行pgScript。因此,当执行上面的代码作为SQL时,前缀匹配数据库名称,因此不会引起任何问题;当执行代码为pgScript时,它运行在不同的数据库上,所以前缀不匹配并触发错误... – gutch 2012-02-28 23:42:28

回答

2

你仔细检查你^ h在这两种情况下都是相同的环境?请检查

  • 同一个数据库,
  • 相同的用户,
  • 相同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; 

结束编辑

顺便说一句:作为错误消息来自所述服务器,这将与写入任何语言功能发生(例如SQL,pljava),而不仅仅是PL/pgSQL。

+0

是的,它绝对是相同的数据库,用户和search_path,因为唯一的区别是我在pgAdmin中按哪个按钮:_Execute query_或_Execute pgScript_ – gutch 2012-02-28 08:57:23

+0

您可以尝试显式设置搜索路径还是完全限定函数名称?我知道这不应该被需要,但pgAdmin可能会做一些奇怪的事情(如包含错误)。 – Eelke 2012-02-28 09:39:19

+0

我试着用'SET search_path TO public;'设置搜索路径,它没有区别。但是,当我完全品质的功能名称,然后我得到一个_different_错误消息 - 请参阅我上面的编辑! – gutch 2012-02-28 09:55:41

相关问题