我有一个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;
答案 0 :(得分:1)
单独拆分冒号分隔的字符串,并使用交叉连接包含其他列。
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;
/