为什么 SYS_REFCURSOR 会产生空值?
Why does the SYS_REFCURSOR results in a null value?
Table CKSFLTHD
FILTERC
DESCR
ACTIVATE
ABC
Apple Bees Corner
1
EFG
Elephant Forest Grove
1
Table CKSFLTLN
FILTERC
SITE
LNUM
ABC
Apple Bees Corner
ABC123
EFG
Elephant Forest Grove
EFG456
输出应该是这样的,但是 table 为空。
我将使用 DISPLAY 来填充下拉列表。
DISPLAY
DATAVAL
Apple Bees Corner
ABC
OPEN cv_2 FOR
SELECT descr DispVal, filterc DataVal
FROM cksflthd
WHERE activate = 1
AND ( v_showAll = 1
OR filterc IN ( SELECT *
FROM ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_userfiltercode )
AND ( lnum <> ' '
OR filterc = v_userfiltercode ) ) useflt
WHERE filterc IN ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_filterCode )
AND ( lnum <> ' '
OR filterc = v_filterCode ) )
)
);
检查您的代码...
这是我所做的,试图观察您分享的内容。
create table CKSFLTLN
(FILTERC varchar2(10),
SITE varchar2(25),
LNUM varchar2(10));
create table CKSFLTHD
(FILTERC varchar2(10),
DESCR varchar2(25),
ACTIVATE varchar2(25));
insert into cksflthd values ('ABC', 'Applebees Corner', 1);
insert into cksflthd values ('EFG', 'Elephant Forest Grove', 1);
insert into CKSFLTLN values ('ABC', 'Applebees Corner', 'ABC123');
insert into CKSFLTLN values ('EFG', 'Elephant Forest Grove', 'EFG456');
CREATE OR REPLACE FUNCTION refcursor_function
RETURN SYS_REFCURSOR
AS
c SYS_REFCURSOR;
v_userfiltercode varchar2(25) :='ABC';
v_filterCode varchar2(25) := 'ABC';
v_showall number(9,0) :=1 ;
BEGIN
OPEN c FOR
SELECT descr DispVal, filterc DataVal
FROM cksflthd
WHERE activate = 1
AND ( v_showAll = 1
OR filterc IN ( SELECT *
FROM ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_userfiltercode )
AND ( lnum <> ' '
OR filterc = v_userfiltercode ) ) useflt
WHERE filterc IN ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_filterCode )
AND ( lnum <> ' '
OR filterc = v_filterCode ) )
)
);
RETURN c;
END;
/
您只分享了游标定义,而不是您正在使用的 PL/SQL 程序,所以我模拟了一个,并硬编码了您的用户值...
然后我用匿名块执行函数,或者真的让 SQL 开发人员为我执行函数。然后返回 refcursor...不为空。
Table CKSFLTHD
FILTERC | DESCR | ACTIVATE |
---|---|---|
ABC | Apple Bees Corner | 1 |
EFG | Elephant Forest Grove | 1 |
Table CKSFLTLN
FILTERC | SITE | LNUM |
---|---|---|
ABC | Apple Bees Corner | ABC123 |
EFG | Elephant Forest Grove | EFG456 |
输出应该是这样的,但是 table 为空。 我将使用 DISPLAY 来填充下拉列表。
DISPLAY | DATAVAL |
---|---|
Apple Bees Corner | ABC |
OPEN cv_2 FOR
SELECT descr DispVal, filterc DataVal
FROM cksflthd
WHERE activate = 1
AND ( v_showAll = 1
OR filterc IN ( SELECT *
FROM ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_userfiltercode )
AND ( lnum <> ' '
OR filterc = v_userfiltercode ) ) useflt
WHERE filterc IN ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_filterCode )
AND ( lnum <> ' '
OR filterc = v_filterCode ) )
)
);
检查您的代码...
这是我所做的,试图观察您分享的内容。
create table CKSFLTLN
(FILTERC varchar2(10),
SITE varchar2(25),
LNUM varchar2(10));
create table CKSFLTHD
(FILTERC varchar2(10),
DESCR varchar2(25),
ACTIVATE varchar2(25));
insert into cksflthd values ('ABC', 'Applebees Corner', 1);
insert into cksflthd values ('EFG', 'Elephant Forest Grove', 1);
insert into CKSFLTLN values ('ABC', 'Applebees Corner', 'ABC123');
insert into CKSFLTLN values ('EFG', 'Elephant Forest Grove', 'EFG456');
CREATE OR REPLACE FUNCTION refcursor_function
RETURN SYS_REFCURSOR
AS
c SYS_REFCURSOR;
v_userfiltercode varchar2(25) :='ABC';
v_filterCode varchar2(25) := 'ABC';
v_showall number(9,0) :=1 ;
BEGIN
OPEN c FOR
SELECT descr DispVal, filterc DataVal
FROM cksflthd
WHERE activate = 1
AND ( v_showAll = 1
OR filterc IN ( SELECT *
FROM ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_userfiltercode )
AND ( lnum <> ' '
OR filterc = v_userfiltercode ) ) useflt
WHERE filterc IN ( SELECT DISTINCT filterc
FROM cksfltln
WHERE SITE IN ( SELECT SITE
FROM cksfltln
WHERE filterc = v_filterCode )
AND ( lnum <> ' '
OR filterc = v_filterCode ) )
)
);
RETURN c;
END;
/
您只分享了游标定义,而不是您正在使用的 PL/SQL 程序,所以我模拟了一个,并硬编码了您的用户值...
然后我用匿名块执行函数,或者真的让 SQL 开发人员为我执行函数。然后返回 refcursor...不为空。