为什么 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...不为空。