【发布时间】:2012-02-28 07:47:26
【问题描述】:
我们的 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
【问题讨论】:
-
这意味着 pgScript 在另一个数据库的上下文中执行。
-
这样的声明:
SELECT mydb.myschema.some_func(..);永远行不通。如错误消息所述:未实现跨数据库引用。您不能为数据库名称添加前缀。您的编辑一定有误。 -
上面编辑的文字是正确的。事实证明,pgAdmin 中的一个可能的错误(参见下面的答案中的 cmets)意味着它在错误的数据库上执行 pgScript。因此,当将上述代码作为 SQL 执行时,前缀与数据库名称匹配,因此不会导致任何问题;当将代码作为 pgScript 执行时,它在不同的数据库上运行,因此前缀不匹配并触发错误...
标签: postgresql plpgsql pgadmin