加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – DROP FUNCTION不知道参数的数量/类型?

发布时间:2020-12-13 16:44:30 所属栏目:百科 来源:网络整理
导读:我保持我的所有功能在一个文本文件与’创建或替换功能somefunction’。 所以如果我添加或更改一些功能我只是馈送文件到psql。 现在,如果我添加或删除参数到一个现有的函数,它创建一个具有相同名称的重载,并删除原来我需要类型在所有的参数类型,确切的顺
我保持我的所有功能在一个文本文件与’创建或替换功能somefunction’。
所以如果我添加或更改一些功能我只是馈送文件到psql。

现在,如果我添加或删除参数到一个现有的函数,它创建一个具有相同名称的重载,并删除原来我需要类型在所有的参数类型,确切的顺序是繁琐的。

是否有某种通配符,我可以使用DROP所有函数给定的名称,所以我可以只添加DROP FUNCTION行到我的文件的顶部?

您需要编写一个函数,该函数使用函数名,并使用来自information_schema的参数类型查找每个重载,然后为每个重构创建并执行一个DROP。

编辑:结果是比我想象的困难很多。看来,information_schema不会在其例程目录中保留必要的参数信息。所以你需要使用PostgreSQL的补充表pg_proc和pg_type:

CREATE OR REPLACE FUNCTION udf_dropfunction(functionname text)
  RETURNS text AS
$BODY$
DECLARE
    funcrow RECORD;
    numfunctions smallint := 0;
    numparameters int;
    i int;
    paramtext text;
BEGIN
FOR funcrow IN SELECT proargtypes FROM pg_proc WHERE proname = functionname LOOP

    --for some reason array_upper is off by one for the oidvector type,hence the +1
    numparameters = array_upper(funcrow.proargtypes,1) + 1;

    i = 0;
    paramtext = '';

    LOOP
        IF i < numparameters THEN
            IF i > 0 THEN
                paramtext = paramtext || ',';
            END IF;
            paramtext = paramtext || (SELECT typname FROM pg_type WHERE oid = funcrow.proargtypes[i]);
            i = i + 1;
        ELSE
            EXIT;
        END IF;
    END LOOP;

    EXECUTE 'DROP FUNCTION ' || functionname || '(' || paramtext || ');';
    numfunctions = numfunctions + 1;

END LOOP;

RETURN 'Dropped ' || numfunctions || ' functions';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

我成功测试这个在一个重载的函数。它被抛在一起很快,但作为一个效用函数很好。我建议在实践中使用它之前测试更多,以防我忽略了一些东西。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读