如何在oracle pl/sql循环中连接字符串?
我从变量Pvalue1=a中的应用程序中获取一个数据字符串;BCe%;f%;h%;这是从excel输入的。在我的pl/sql代码中,我希望将它们存储在两个不同的变量中,如下所示 v1='a';'b';'c′; v2=e%f%h% 我正在使用下面的代码,但这似乎不是预期的工作如何在oracle pl/sql循环中连接字符串?,oracle,for-loop,plsql,Oracle,For Loop,Plsql,我从变量Pvalue1=a中的应用程序中获取一个数据字符串;BCe%;f%;h%;这是从excel输入的。在我的pl/sql代码中,我希望将它们存储在两个不同的变量中,如下所示 v1='a';'b';'c′; v2=e%f%h% 我正在使用下面的代码,但这似乎不是预期的工作 FOR i in 1..FileRowCount LOOP if instr(v1,'%')=0 then v1 := SUBSTR(Pvalue1,0,INSTR(Pvalue1, ';',1
FOR i in 1..FileRowCount LOOP
if instr(v1,'%')=0 then
v1 := SUBSTR(Pvalue1,0,INSTR(Pvalue1, ';',1,1)-1)||v1
elsif instr(v1,'%')<>0 then
v2 := SUBSTR(Pvalue1,0,INSTR(Pvalue1, ';',1,1)-1)||v2
end if;
Pvalue1 := SUBSTR(Pvalue1,INSTR(Pvalue1, ';',1,1)+1);
end loop;
您可以连续使用REGEXP_SUBSTR来确定由分号分隔的每个子字符串,使用INSTR来确定包含或不包含%字符的子字符串。然后通过使用LISTAGG组合字符串,例如
这个很好用!!谢谢!
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
Pvalue1 VARCHAR2(100):='a;b;c;e%;f%;h%;';
v1 VARCHAR2(100);
v2 VARCHAR2(100);
BEGIN
WITH t AS
(
SELECT REGEXP_SUBSTR( Pvalue1, '[^;]+', 1, level ) AS piece, level AS lvl
FROM dual
CONNECT BY level <= REGEXP_COUNT( Pvalue1, ';' )
)
SELECT LISTAGG(CASE WHEN INSTR( piece,'%')=0 THEN ''''||piece||'''' END,';') WITHIN GROUP (ORDER BY lvl) AS v1,
LISTAGG(CASE WHEN INSTR( piece,'%')>0 THEN piece END) WITHIN GROUP (ORDER BY lvl) AS v2
INTO v1, v2
FROM t;
DBMS_OUTPUT.PUT_LINE( 'v1 : '||v1 );
DBMS_OUTPUT.PUT_LINE( 'v2 : '||v2 );
END;
/
v1 : 'a';'b';'c'
v2 : e%f%h%