如何在oracle pl/sql循环中连接字符串?

如何在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

我从变量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,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%