我保持我的所有功能在一个文本文件与’创建或替换功能somefunction’。
所以如果我添加或更改一些功能我只是馈送文件到psql。
所以如果我添加或更改一些功能我只是馈送文件到psql。
现在,如果我添加或删除参数到一个现有的函数,它创建一个具有相同名称的重载,并删除原来我需要类型在所有的参数类型,确切的顺序是繁琐的。
您需要编写一个函数,该函数使用函数名,并使用来自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;
我成功测试这个在一个重载的函数。它被抛在一起很快,但作为一个效用函数很好。我建议在实践中使用它之前测试更多,以防我忽略了一些东西。