使用Db2时,我尝试使用一个“防错”函数来检查给定的函数/存储过程是否存在,如果为真,则将其删除。对于非重载函数,它可以很好地工作,但如果相同的函数具有另一个签名,但具有相同数量的参数,则该函数将无法工作。
示例:
create function aaa.a_drop(in a integer, in b varchar(32))
returns integer
begin
return(1)
end;
create function aaa.a_drop(in a varchar(32), in b integer)
returns integer
begin
return(1)
end;
这两个函数具有相同的名称和参数计数,但签名不同。
我使用这段代码来检查对象,如果它存在,则返回1
。
call aaa.drop_if_exists('aaa','a_drop',2,'integer,varchar(32)');
create function drop_if_exists(in v_schema varchar(128),in v_function_name varchar(128), in v_params_counter integer, in v_params_signature varchar(128) default null)
returns integer
begin
declare v_count integer;--
select count(1)
into v_count
from syscat.routines
where ROUTINESCHEMA = v_schema
and routinename = v_function_name
and routinetype = 'f'
and parm_count = v_params_counter
return v_count;--
end;
这将返回两个函数。我可以在函数中给出签名,但在syscat.routineparms中找不到单独的函数。
如何验证函数/存储过程是否存在于Db2中?
发布于 2020-06-29 17:54:05
使用PARMS
列的不同值尝试此操作。
SELECT *
FROM
(
SELECT P.ROUTINESCHEMA, P.SPECIFICNAME, LISTAGG(P.TYPENAME, ',') WITHIN GROUP (ORDER BY P.ORDINAL) AS PARMS
FROM SYSCAT.ROUTINES R
JOIN SYSCAT.ROUTINEPARMS P ON P.ROUTINESCHEMA = R.ROUTINESCHEMA AND P.SPECIFICNAME = R.SPECIFICNAME
WHERE P.ROWTYPE IN ('B', 'O', 'P')
AND R.ROUTINESCHEMA = 'SYSPROC' AND R.ROUTINENAME = 'SNAP_GET_DB'
GROUP BY P.ROUTINESCHEMA, P.SPECIFICNAME
)
WHERE PARMS =
--'VARCHAR'
'VARCHAR,INTEGER'
;
在Db2中有两个用于查找表的SYSPROC.SNAP_GET_DB
函数。
您可以选择所需的参数,通过传递字符串枚举其参数类型,如本例所示。请注意,不需要传递参数长度-您不能创建2个具有相同参数编号、顺序和数据类型的函数,但具有不同的(Var)字符长度。
发布于 2020-06-29 17:20:08
如果您的db2版本中提供了语法create or replace function
,请考虑使用它。
您还可以选择为每个重载版本提供不同的specific
名称,然后在syscat.routines
中搜索该特定名称,并使用可能有用的drop specific function...
语法。
否则,您可以在每个签名的每个参数的syscat.routineparms
中进行搜索,尽管对于这样简单的事情,这似乎比使用create or replace
更费力。
https://stackoverflow.com/questions/62642810
复制相似问题