Лучшее решение случая выключателя - PullRequest
0 голосов
/ 18 октября 2019

Здравствуйте, мне нужна помощь по поводу лучшего варианта решения Switch на 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';

Спасибо за помощь

1 Ответ

0 голосов
/ 18 октября 2019

Вы можете использовать CASE WHEN, но внутри своего вызова функции.

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;

Cheers !!

...