在oracle存储过程中解析逗号分隔字符串
嗨,我有一个逗号分隔的GUI ID,我需要将其传递给过程,然后在那个里我将进行解析。下面的程序一直工作到30个字符长,我的GUI ID是36个字符长,所以它的给出错误。谁能帮帮我吗。在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
我的逗号分隔字符串='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