检测"参数的所有发生率不止一次使用"在Pl / pgSQL函数中

时间:2014-09-30 11:33:30

标签: sql postgresql plpgsql

我将数据库从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函数?

我无法一个接一个地走,太多了。

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;

SQL Fiddle.

值得一个内置Postgres功能,其中包含重复的参数名称:pg_stat_get_activity。别碰这个。

这种奇怪之处已经提出过,丹尼尔提供了一些解释:

我真的认为这应该是固定的。即使它不会造成伤害,它也是一个不好的例子而且令人困惑。