给定一个名称值对字符串,如何在 Oracle PLSQL 中解析该字符串以获取名称和值? [重复]

问题描述 投票:0回答:1

假设一个 Oracle PLSQL 函数获取名称值对字符串(带有分隔符和名称值分隔符)作为 IN 参数。 例如:

'name1=value1;name2=value2'
要求是解析字符串并将名称值对放入关联数组中。 如何解析字符串以将名称值对放入关联数组中并返回它。

oracle plsql
1个回答
0
投票
CREATE or replace PACKAGE myinv AS 
            
       TYPE namevalue_type IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50);
       Procedure Test ( params IN varchar2 );
       Function ParseParams ( params IN varchar2) RETURN namevalue_type;
        
END myinv ; 
/

CREATE OR REPLACE PACKAGE BODY myinv AS  
--   TYPE namevalue_type IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50);

   Function ParseParams ( params IN varchar2) 
   RETURN namevalue_type 
   IS
      nv_pairs SYS.ODCIVARCHAR2LIST;
      nv_pair  SYS.ODCIVARCHAR2LIST;
      i number;
      j number;
      name varchar2(100);
      value varchar2(100);
      nv_t namevalue_type;

   BEGIN 
   
         SELECT regexp_substr(params,'(.*?)(;|$)', 1, level, NULL, 1)
          BULK COLLECT INTO nv_pairs
          FROM   dual
          CONNECT BY level <= regexp_count(params, ';') + 1;
        
          i := nv_pairs.FIRST;  -- Get first element of array
          while i is not null LOOP
                  
              SELECT regexp_substr(nv_pairs(i),'(.*?)(=|$)', 1, level, NULL, 1)
              BULK COLLECT INTO nv_pair
              FROM   dual
              CONNECT BY level <= regexp_count(nv_pairs(i), '=') + 1;
              
              j := nv_pair.FIRST;
              while j is not null LOOP
                name := nv_pair(j);
                j := nv_pairs.NEXT(j); 
                value := nv_pair(j);
                nv_t(name) := value;
                j := nv_pairs.NEXT(j); 
              END LOOP;
              
             i := nv_pairs.NEXT(i);  -- Get next element of array      
          END LOOP;
          
          name := nv_t.FIRST;
          WHILE name IS NOT NULL LOOP
            name := nv_t.NEXT(name);
          END LOOP;
    
        RETURN nv_t;

   END ParseParams; 
   
   
    Procedure Test ( params IN varchar2 )
    AS
    nvt namevalue_type;
    name varchar2(100);
    i number;
    BEGIN
    dbms_output.put_line('  Inside Procedure Test');
        i := 1;
        nvt := ParseParams('param1=10;param2=20');
        name := nvt.FIRST;
        WHILE name IS NOT NULL LOOP
          --dbms_output.put_line('            ' || i ||'. Name: ' || name || '  Value: ' || nvt(name) );
          dbms_output.put_line('            ' || i ||'. Name: ' || name || '  Value: ' || (to_number(nvt(name)) + 10) );
          name := nvt.NEXT(name);
          i := i+1;
        END LOOP;
          
          
    END Test;
END myinv; 
/

BEGIN
  DBMS_OUTPUT.PUT_LINE('Test Parse.........................');
  myinv.Test('Check');
END;
/
© www.soinside.com 2019 - 2024. All rights reserved.