Oracle 开关柜的较好解决方案
您好,我需要有关oracle上交换机案例更好解决方案的帮助。 所以我有一个函数Oracle 开关柜的较好解决方案,oracle,execute-immediate,Oracle,Execute Immediate,您好,我需要有关oracle上交换机案例更好解决方案的帮助。 所以我有一个函数 FUNCTION GETSTAT(i_json_stats clob) RETURN CRESPONSE AS BEGIN IF JSON_GET_STAT IS NOT NULL THEN FOR i IN 1..JSON_GET_STAT.count LOOP V_FUNCTION := json_ext.get_string(json(JSON_GET_STAT.get(i)
FUNCTION GETSTAT(i_json_stats clob)
RETURN CRESPONSE AS
BEGIN
IF JSON_GET_STAT IS NOT NULL THEN
FOR i IN 1..JSON_GET_STAT.count LOOP
V_FUNCTION := json_ext.get_string(json(JSON_GET_STAT.get(i)), 'CLE');
O_RETURN_RESPONSE := new CRESPONSE;
THE FIRST / THE SECOND SOLUTION BELOW
END LOOP;
END IF;
我有两种解决方案,第一种是使用switch和case
但是我想动态调用这个函数,如果不是的话,我必须做50个case
第一个解决方案:
case V_FUNCTION
when 'COUVERTURE_MAGASIN' then v_json_collect.put(V_FUNCTION,COUVERTURE_MAGASIN(i_json_stats));
when 'COUVERTURE_VOLUMES' then v_json_collect.put(V_FUNCTION,COUVERTURE_VOLUMES(i_json_stats));
end case;
第二个解决方案:但是我不知道如何将它插入我的GETSTAT函数中
execute immediate' begin v_json_collect.put(V_FUNCTION,'||V_FUNCTION||'(i_json_stats)); end';
感谢您的帮助您可以在但在函数调用中使用CASE
v_json_collect.put(
V_FUNCTION,
case V_FUNCTION
when 'COUVERTURE_MAGASIN'
then COUVERTURE_MAGASIN(i_json_stats)
when 'COUVERTURE_VOLUMES'
then COUVERTURE_VOLUMES(i_json_stats)
end
);
如果要使用动态查询,请使用以下命令:
execute immediate
'SELECT v_json_collect.put('|| V_FUNCTION|| ',' ||V_FUNCTION||'('||i_json_stats||'))' into return_value;
干杯 谢谢这个解决方案,但我也必须写下我所有的50个案例:/是的,当你发表评论时,我正在写其他的解决方案。。hahaYou应该使用
CASE
语句。不要使用executeimmediate
,因为PL/SQL编译器无法检测您将采用哪个分支并优化其执行;它必须动态地评估一切。它还将有助于防止SQL注入攻击,因为您可以白名单函数调用名称,并且不会对恶意JSON数据造成严重破坏。