如何使用regex解析plsql中具有两个分隔符的字符串

如何使用regex解析plsql中具有两个分隔符的字符串,plsql,oracle11g,Plsql,Oracle11g,我有一个类似于0:1的字符串;2:3. 列用冒号分隔,行用分号分隔 我正在尝试实现一个可以拆分字符串的正则表达式,然后将其用于其他目的 我已经写了下面的代码,但不确定它有什么问题。它继续执行,然后耗尽内存 我是PL/SQL新手,所以不确定出了什么问题。有人能推荐一下吗 DECLARE vfirstpos NUMBER; vsecondpos NUMBER; vkey VARCHAR2 (32767); vvalue VARCHAR2

我有一个类似于0:1的字符串;2:3. 列用冒号分隔,行用分号分隔

我正在尝试实现一个可以拆分字符串的正则表达式,然后将其用于其他目的

我已经写了下面的代码,但不确定它有什么问题。它继续执行,然后耗尽内存

我是PL/SQL新手,所以不确定出了什么问题。有人能推荐一下吗

DECLARE
   vfirstpos    NUMBER;
   vsecondpos   NUMBER;
   vkey         VARCHAR2 (32767);
   vvalue       VARCHAR2 (32767);
   vclob        CLOB;                                     
   vgroup       VARCHAR2 (32767);
BEGIN
   vclob := '0:1;2:3';

   IF vclob IS NOT NULL
   THEN
      LOOP
         vgroup :=
            REGEXP_SUBSTR (vclob,
                           '[^;]+',
                           1,
                           1);
         BEGIN
            vfirstpos :=
               INSTR (vgroup,
                      ':',
                      1,
                      1);
            vsecondpos :=
               INSTR (vgroup,
                      ':',
                      1,
                      2);

            vkey := (SUBSTR (vgroup, 1, vfirstpos - 1));
            vvalue :=
               (SUBSTR (vgroup, vfirstpos + 1, (vsecondpos - vfirstpos) - 1));
                        vclob := SUBSTR (vclob, LENGTH (vgroup) + 2);
            EXIT WHEN LENGTH (vclob) = 0;
         END;
      END LOOP;
   END IF;
END;

我通过修改查询解决了这个问题。好像我把它分成了第三层,这就是问题的根源

更改代码

DECLARE
   vclob        CLOB;
   vgroup       VARCHAR2 (32767);
   vfirstpos    NUMBER;
   vkey         VARCHAR2 (32767);
   vvalue       VARCHAR2 (32767);  
   vid            number;
BEGIN
    --this should come from an input parameter
   vclob := '1:1;2:hello@hello.com';

   IF vclob IS NOT NULL
   THEN
      LOOP
         vgroup :=
            REGEXP_SUBSTR (vclob,
                           '[^;]+',
                           1,
                           1);
         BEGIN
            vfirstpos :=
               INSTR (vgroup,
                      ':',
                      1,
                      1);
            vkey := (SUBSTR (vgroup, 1, vfirstpos - 1));            
            vvalue :=
               (SUBSTR (vgroup, vfirstpos + 1));  

         END;
         vclob := SUBSTR (vclob, LENGTH (vgroup) + 2);
         EXIT WHEN LENGTH (vclob) = 0;
      END LOOP;
      commit;
   END IF;
END;