我将数据库从8.4服务器移动到新的9.1服务器。
在9.1服务器中恢复8.4副本不会引起任何错误,但是一旦我开始使用我的plpgsql函数,我就被命中了'参数被多次使用'错误,似乎9.1不允许将同一名称用作IN和OUT,例如:
CREATE FUNCTION sales_tax(IN total int, OUT total int)
允许在8.4但不在9.1中。使用相同的名称不是故意的,我通常定义相同的objet param,如果它的IN和param 如果它是out,但有时你会错过下划线的位置。
我尝试过使用pg_restore v8.4和pg_restore v9.1,甚至在空数据库上进行了恢复,但它从未抛出错误@CREATE FUNCTION
,它不是&# 39;评价'在恢复时,如果您尝试在9.1中创建具有重复参数名称的新func。
所以我的问题是,有没有你能想到的简单脚本可以找到我所有不兼容的9.1函数?
我无法一个接一个地走,太多了。
答案 0 :(得分:1)
对系统目录pg_proc
的此查询报告所有具有重复参数名称的函数(每个重复名称一行):
SELECT proname, pg_get_function_identity_arguments(oid) AS f_identity_arguments
, arg, count(*) AS ct
FROM pg_proc p
,unnest(p.proargnames) arg
GROUP BY oid, proname, arg
HAVING count(*) > 1
ORDER BY 1, 2, ct DESC;
值得,一个内置Postgres功能,其中包含重复的参数名称:pg_stat_get_activity
。别碰这个。
这种奇怪之处已经提出过,丹尼尔提供了一些解释:
我真的认为这应该是固定的。即使它不会造成伤害,它也是一个不好的例子而且令人困惑。