Domanda

How to get two values from string in PL/SQL, like this:

DECLARE
    context VARCHAR2(50) := 'param_a=Value1;param_b=Value2,Value3;';
    paramA VARCHAR(50);
    paramB VARCHAR(50);
BEGIN
    paramA = ... -- expected value: Value1
    paramB = ... -- expected value: Value2,Value3
    dbms_output.put_line(context);
END;
È stato utile?

Soluzione

You can use something like:

  DECLARE
          context VARCHAR2(50) := 'param_a=Value1;param_b=Value2,Value3;';
          paramA VARCHAR(50);
          paramB VARCHAR(50);
 BEGIN
    paramA :=  SUBSTR('param_a=Value1;param_b=Value2,Value3;',instr('param_a=Value1;param_b=Value2,Value3;','=',1,1)+1,instr('param_a=Value1;param_b=Value2,Value3;',';',1,1)-instr('param_a=Value1;param_b=Value2,Value3;','=',1,1)-1);
    paramB := SUBSTR('param_a=Value1;param_b=Value2,Value3;',instr('param_a=Value1;param_b=Value2,Value3;','=',1,2)+1,instr('param_a=Value1;param_b=Value2,Value3;',';',1,2)-instr('param_a=Value1;param_b=Value2,Value3;','=',1,2)-1);

    dbms_output.put_line(paramA);
    dbms_output.put_line(paramb);

  END;

Hope it Helps

Vishad

Altri suggerimenti

DECLARE
  type TStrings IS TABLE OF VARCHAR2(4000);
  ltParams TStrings;
  ltParamsValue TStrings;

  function split(ivStr varchar2, ivDelim varchar2 := ',') return TStrings 
  IS
    ltStrings TStrings;
    lvStr varchar2(4000);
    i number;
  BEGIN
    lvStr := ivStr;
    ltStrings := TStrings();
    loop
      i := instr(lvStr, ivDelim);
      i := case when i = 0 and lvStr is not null then length(lvStr) else i end;
      exit when i = 0 or lvStr is null;
      ltStrings.extend(1);
      ltStrings(ltStrings.count) := rtrim(substr(lvStr, 1, i), ivDelim);
      lvStr := substr(lvStr, i + 1);
    end loop;
    RETURN ltStrings;
  END;

BEGIN
  ltParams := split('param_a=Value1;param_b=Value2,Value3;', ';');
  FOR idx IN ltParams.first .. ltParams.last LOOP
    ltParamsValue := split(ltParams(idx), '=');
    dbms_output.put_line(ltParamsValue(2));
  END LOOP;
end;
Hi Better way to do this kind of separation is by using REGEX(Regular Expressions). 
PLease try this code it may help plus it will reduce the coding length too.

SET serveroutput ON;
DECLARE
  context VARCHAR2(50) := 'param_a=Value1;param_b=Value2,Value3;';
  paramA  VARCHAR(50);
  paramB  VARCHAR(50);
BEGIN
  FOR rec IN
  (SELECT regexp_substr(context,'[^;"]+', 1, level) AS AV_TEST
  FROM dual
    CONNECT BY regexp_substr(context,'[^;"]+', 1, level) IS NOT NULL
  )
  LOOP
    dbms_output.put_line(rec.av_test);
  END LOOP;
END; 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top