我们的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
这意味着,pgScript在另一个数据库的上下文中执行。 – 2012-02-28 10:55:41
像这样的语句:'SELECT mydb.myschema.some_func(..);'不能工作。如错误消息所示:跨数据库引用未实现。您不能为数据库名称加前缀。您必须在编辑时误会。 – 2012-02-28 22:22:47
上面的编辑文本是正确的。事实证明,pgAdmin中一个可能的错误(请参阅下面的答案中的注释)意味着它在错误的数据库上执行pgScript。因此,当执行上面的代码作为SQL时,前缀匹配数据库名称,因此不会引起任何问题;当执行代码为pgScript时,它运行在不同的数据库上,所以前缀不匹配并触发错误... – gutch 2012-02-28 23:42:28