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)

您好,我需要有关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)), '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数据造成严重破坏。