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

时间:2018-04-26 04:18:59

标签: sql regex oracle plsql procedure

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

:P1_COL1
:P1_COL2
:P1_COL3
:P1_COL4

这里的问题是P1_COL4可以接收许多值,并用冒号分隔。所以我做的是我用regexp声明了一个游标,用冒号分隔行。

例如,

目前这就是我的输出:

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

BOB,JONES,M BLUE:红:绿:黄色: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;

1 个答案:

答案 0 :(得分:1)

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

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中选择这些变量。

修改

  

我正在尝试使用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;
 /