无法调用我的光标输出以用于输出
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;
单独拆分冒号分隔的字符串并使用交叉连接来包含其他列。
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
| 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;
/
我有一个 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;
单独拆分冒号分隔的字符串并使用交叉连接来包含其他列。
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
| 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;
/