【问题标题】:Unable to call output of my cursor for use in output [duplicate]无法调用我的光标的输出以在输出中使用 [重复]
【发布时间】:2018-10-06 16:02:15
【问题描述】:

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

:P1_COL1
:P1_COL2
:P1_COL3
:P1_COL4

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

例如,

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

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

鲍勃,琼斯,M,蓝色:红色:绿色:黄色:紫色

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

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 regex oracle plsql procedure


    【解决方案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 子句的情况下简化查询并直接从对偶中选择这些变量。

    编辑

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

    【讨论】:

    • 感谢您的回答。但是,这确实可以通过 SQL 工作。我正在尝试在 for 循环之外使用 p1_col4 ,以便可以打印这样的结果。 dbms_output.put_line (:P1_COL1 ||','|| :P1_COL2 ||','|| :P1_COL3 || p1_col4 || chr(13));基本上我正在尝试在循环中使用代码,例如 for x in (query) 打印出结果
    • @TonySawah:请检查编辑。
    • 非常感谢大家。帮了大忙。 Kaushik,那是金子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2017-09-02
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多