PLSQL извлекает значения из динамической строки - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть строка, которая может иметь разные параметры и разное количество параметров.Я пытаюсь получить имя параметра и значение параметра.Примером может быть:

FIRST_PARAM=1^SECOND_PARAM=2^THIRD_PARAM=3^FOURTH_PARAM=4^

Я могу получить значение параметра через существующий пакет, но это имя, с которым у меня возникают трудности.То, что я сделал до сих пор:

param_count_ := length(params_) - length(replace(params_,'^',null));
DBMS_OUTPUT.PUT_LINE('Param Count: '||param_count_);

WHILE(index_ <= param_count_)
LOOP       
    param_value_ := client_sys.Get_Key_Reference_Value(params_,index_);

    IF(index_ = 1) THEN         
        param_name_ := NVL(SUBSTR(params_, 0, INSTR(params_, '=')-1), params_);
    ELSE
        param_name_ := SUBSTR(params_,
                        INSTR(params_, '^',1,index_) + 1,
                        INSTR(params_, '=',1,index_+1) - INSTR(params_, '^',1,index_) - 1);
    END IF;      
    DBMS_OUTPUT.PUT_LINE('Reference Name: '||param_name_);
    DBMS_OUTPUT.PUT_LINE('Reference Value: '||param_value_);  
    index_ := index_+1;
END LOOP;

Это приводит к следующему выводу:

Param Count: 4
Reference Name: FIRST_PARAM
Reference Value: 1
Reference Name: THIRD_PARAM
Reference Value: 2
Reference Name: FOURTH_PARAM
Reference Value: 3
Reference Name: 
Reference Value: 4

Кажется, что он не к месту.Как я могу это исправить, пожалуйста?

1 Ответ

0 голосов
/ 21 февраля 2019

Вот один из способов выполнить ваше требование:

BEGIN
FOR cur IN (SELECT REGEXP_SUBSTR(PARAM_, '[^= ]+', 1, 1) AS "KEY",
                   REGEXP_SUBSTR(PARAM_, '[^= ^]+', 1, 2) AS "VALUE"
                 FROM
                (SELECT REGEXP_SUBSTR(str, '[^\^ ]+', 1, LEVEL) AS PARAM_
                   FROM (SELECT 'FIRST_PARAM=1^SECOND_PARAM=2^THIRD_PARAM=3^FOURTH_PARAM=4^' 
                         AS STR FROM DUAL) T
                CONNECT BY REGEXP_SUBSTR(str, '[^\^ ]+', 1, LEVEL) IS NOT NULL
                ))
  LOOP
    DBMS_OUTPUT.PUT_LINE('Reference Name: '|| cur.KEY ||
    ' <=> '|| 'Reference Value: '|| cur.VALUE);
  END LOOP;
END;

Вывод:

Reference Name: FIRST_PARAM <=> Reference Value: 1
Reference Name: SECOND_PARAM <=> Reference Value: 2
Reference Name: THIRD_PARAM <=> Reference Value: 3
Reference Name: FOURTH_PARAM <=> Reference Value: 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...