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

在oracle存储过程中解析逗号分隔字符串,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,嗨,我有一个逗号分隔的GUI ID,我需要将其传递给过程,然后在那个里我将进行解析。下面的程序一直工作到30个字符长,我的GUI ID是36个字符长,所以它的给出错误。谁能帮帮我吗。 我的逗号分隔字符串='06b7930e-293f-6604-e053-2176a8c09440'、'06b7930e-293f-6604-e053-2176a8c09440' 我需要将commaSeparatedString传递给过程,并将o/p作为 06b7930e-293f-6604-e053-2176a8c0

嗨,我有一个逗号分隔的GUI ID,我需要将其传递给过程,然后在那个里我将进行解析。下面的程序一直工作到30个字符长,我的GUI ID是36个字符长,所以它的给出错误。谁能帮帮我吗。
我的逗号分隔字符串='06b7930e-293f-6604-e053-2176a8c09440'、'06b7930e-293f-6604-e053-2176a8c09440'

我需要将commaSeparatedString传递给过程,并将o/p作为 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;

您可以使用以下技术:

REGEXP\u 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>

我在这里用其他方法回答了一个类似的问题,如XML、表函数、流水线函数

type
lname\u数组
最多只能存储4000个字符,
name\u数组
被限制为30个字符,因此在这种情况下应该可以工作,因为代码只使用lname数组

lname_数组类型lname_数组是由二进制_整数组成的VARCHAR2(4000)索引表

长名称列表应该存储在这里,它包括完全限定的属性名称

name_array  TYPE name_array IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
姓名列表应存储在此处

另外,您可以使用下面的查询将“,”分隔值转换为表,而不是将dbms_utility.comma_调用到_表

 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;
选择替换(
regexp_substr(“'06b7930e-293f-6604-e053-2176a8c09440”,
“06b7930e-293f-6604-e053-2176a8c09440”,“[^,]+”,1级),“”)
来自双重

按级别连接30个字符的限制是因为
dbms\u实用程序。comma\u to\u table
以及附带的
dbms\u实用程序。lname\u array
是为逗号分隔的Oracle对象名称字符串而设计的,根据定义,这些名称最多可以包含30个字符。@Kim,还有其他方法来解析这个逗号分隔的字符串吗??@PratapA.K,您可以使用普通的
SQL
来实现这一点,请参阅我的答案。或者,您可以编写自己的
函数
。请参阅我在答案中发布的链接中的其他技术。@KimBergHansen类型的lname\u数组最多可以存储4000个字符。只有name\u数组限制为30个字符,因此在这种情况下它应该可以工作,因为代码只使用lname数组
lname\u数组
TYPE lname\u数组是VARCHAR2(4000)按二进制整数索引的表;长名称列表应存储在此处,它包括完全限定的属性名称。
NAME\u数组
TYPE NAME\u数组是VARCHAR2(30)的表按二进制整数编制索引;名称列表应存储在此处。@arunb2w如果Pratap包含此错误,则会有所帮助。错误为
PLS-00114:identifier'06b7930e-293f-6604-e053-2176a8'太长
。因此,
lname\u数组
可以包含更长的元素,因为它可以包含完全限定的对象标识符但由于该函数是为Oracle对象标识符设计的,它似乎在检查逗号分隔字符串中的对象标识符的有效性。因此,使用
dbms\u实用程序。逗号到\u表
作为通用的逗号分隔字符串解析器不是一个好主意。非常感谢Lalit