无法调用我的光标输出以用于输出

Unable to call output of my cursor for use in output

我有一个 Oracle Apex 页面,我从该页面接收到 4 个变量。

:P1_COL1
:P1_COL2
:P1_COL3
:P1_COL4

这里的问题是 P1_COL4 可以接收很多值,它们之间用冒号分隔。所以我所做的是我用正则表达式声明了一个游标,用冒号分隔行。

例如,

目前,如果我这样做,输出是这样的:

select :P1_COL1,:P1_COL2,:P1_COL3,:P1_COL4 from dual;

BOB,JONES,M,BLUE:RED:GREEN:YELLOW:PURPLE

而我正在寻找这样的东西...

Bob, Jones, M, BLUE
Bob, Jones, M, RED
Bob, Jones, M, GREEN
Bob, Jones, M, YELLOW
Bob, Jones, M, PURPLE

但目前我的代码无法正常工作

DECLARE CURSOR a1
is
        WITH statement AS
    (
        select :P1_COL4 obj
        from dual
    )
SELECT REGEXP_SUBSTR(OBJ,'[^,:;]+',1,LEVEL) FROM dual CONNECT BY LEVEL<=LENGTH(REGEXP_REPLACE(OBJ,'[^,:;]+'))+1;

begin
for x in a1
loop
dbms_output.put_line(:P1_COL1 ||','|| :P1_Col2 ||','||
     :P1_Col3||','|| a1 || chr(13));
 end loop;
 end;

单独拆分冒号分隔的字符串并使用交叉连接来包含其他列。

SQL Fiddle

WITH data 
     AS (SELECT 'Bob'                          AS P1_COL1, 
                'Jones'                        AS P1_COL2, 
                'M'                            AS P1_COL3, 
                'BLUE:RED:GREEN:YELLOW:PURPLE' AS P1_COL4 
         FROM   dual) 
SELECT d.p1_col1, 
       d.p1_col2, 
       d.p1_col3, 
       s.col 
FROM   data d 
       cross join (SELECT REGEXP_SUBSTR(p1_col4, '[^:]+', 1, LEVEL) AS col 
                     FROM   data 
                   CONNECT BY LEVEL <= REGEXP_COUNT(p1_col4, '[^:]+')) s 

Results:

| P1_COL1 | P1_COL2 | P1_COL3 |    COL |
|---------|---------|---------|--------|
|     Bob |   Jones |       M |   BLUE |
|     Bob |   Jones |       M |    RED |
|     Bob |   Jones |       M |  GREEN |
|     Bob |   Jones |       M | YELLOW |
|     Bob |   Jones |       M | PURPLE |

您还可以在不使用 with 子句的情况下简化查询,并直接从 dual 中选择这些变量。

编辑

I'm trying to use for loop

这就是你可以做到的。

SET SERVEROUTPUT ON

BEGIN
  FOR r IN
  (
   SELECT :p1_col1 as p1_col1
     ,:p1_col2 as p1_col2
     ,:p1_col3 as p1_col3
     ,s.p1_col4
FROM dual d
CROSS JOIN (
    SELECT REGEXP_SUBSTR(:p1_col4, '[^:]+', 1, LEVEL) AS p1_col4
    FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT(:p1_col4, '[^:]+')
    ) s )
  LOOP
    DBMS_OUTPUT.PUT_LINE (r.p1_col1
    ||','
    || r.p1_col2
    ||','
    || r.p1_col3
    || r.p1_col4
    || CHR(13));
  END LOOP; 
 END;
 /