在oracle存储过程中解析逗号分隔的字符串

时间:2014-11-10 06:58:51

标签: oracle stored-procedures plsql

您好我有一个逗号分隔的GUI ID,我需要传递给程序,我将解析。下面的程序工作到30个字符长度,我的GUI ID是36个字符长度,所以它给出错误。有人可以帮帮我吗         我的逗号SeparatedString ='“06b7930e-293f-6604-e053-2176a8c09440”,“06b7930e-293f-6604-e053-2176a8c09440”';

我需要将commaSeparatedString传递给过程并获取o / p as         06b7930e-293f-6604-e053-2176a8c09440和         06b7930e-293F-6604-e053-2176a8c09440 请改变我的程序。提前致谢

create or replace 
        procedure PROC_ASSIGN_SUBSETS_TESTING(
        subsetIdString in varchar2,
        userId in varchar2,
        type in varchar2
        ) is

    subsetIdArray STR_ARRAY;
    subsetId varchar(255);
    shopCount number;
    shopId varchar(255);
    userAccessId varchar(255);

       ltab_lname dbms_utility.lname_array;
       ln_len     BINARY_INTEGER;
    BEGIN
    dbms_utility.comma_to_table(list   =>subsetIdString
                                  ,tablen => ln_len
                                  ,tab    => ltab_lname);
      FOR i IN 1 .. ln_len LOOP
          dbms_output.put_line('element ' || i || ' is ' || replace(ltab_lname(i),'"'));     
       END LOOP;
    END;

2 个答案:

答案 0 :(得分:2)

类型lname_array只能存储多达4000个字符, name_array限制为30个字符,因此它应该适用于该情况,因为代码仅使用lname数组。

Oracle reference

lname_array TYPE lname_array IS TABLE OF VARCHAR2(4000) index by BINARY_INTEGER;

Long NAME列表应存储在此处,它包含完全限定的属性名称。

name_array  TYPE name_array IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;

NAME列表应存储在此处。

此外,您可以使用以下查询转换',而不是调用dbms_utility.comma_to_table。表格的分离值

 select replace(
regexp_substr('"06b7930e-293f-6604-e053-2176a8c09440",
"06b7930e-293f-6604-e053-2176a8c09440"','[^,]+',1,level),'"')
from dual
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE('"06b7930e-293f-6604-e053-2176a8c09440",
"06b7930e-293f-6604-e053-2176a8c09440"' , '[^,]+')) + 1;

答案 1 :(得分:1)

您可以使用以下技巧:

REGEXP_SUBSTR方法

SQL> WITH DATA AS(
  2      SELECT q'["06b7930e-293f-6604-e053-2176a8c09440","06b7930e-293f-6604-e053-2176a8c09440"]' str
  3    FROM dual)
  4  SELECT regexp_substr(str,'[^,]+',1,level) str
  5    FROM DATA
  6  CONNECT BY regexp_substr(str, '[^,]+', 1, level) IS NOT NULL
  7  /

STR
-----------------------------------------------------------------------------
"06b7930e-293f-6604-e053-2176a8c09440"
"06b7930e-293f-6604-e053-2176a8c09440"

SQL>

我在getting "comma-separated list near 'xx.yy' invalid" with dbms_utility.comma_to_table使用其他方法回答了类似问题,例如 XML,表函数,流水线函数