【问题标题】:How to return null in OUT SYS_REFCURSOR如何在 OUT SYS_REFCURSOR 中返回 null
【发布时间】:2021-04-26 18:39:37
【问题描述】:

我在包中有一个返回 SYS_REFCURSOR 的过程,我想根据条件返回 null 或空,不知道该怎么做。

  PROCEDURE test(  id_number IN VARCHAR2,
                   resultIN OUT SYS_REFCURSOR) AS
    BEGIN
    if true then
     OPEN resultIN FOR
       SELECT 
       fieldsValue 
      from TableName;
    ELSE
    Return empty resultIN ;
    END IF;
  END;

这对我不起作用。我该怎么做。

【问题讨论】:

  • 您为什么要这样做?您当然可以打开并返回具有不同结构的游标,当调用者从中获取时将返回 0 行。但是这样做会显着增加调用此过程的代码的复杂性。也许您真的只想在您的 SELECT 上有一个 WHERE 子句,导致它在某些情况下不返回任何行?
  • 您在代码中用TRUE 替换的布尔语句是什么?你能把它移到SELECT 中的WHERE 子句中,然后完全删除IF/ELSE 吗?

标签: sql oracle plsql cursor plsql-package


【解决方案1】:

您可以像这样简单地将 NULL 分配给 refcursor:

PROCEDURE test(  id_number IN VARCHAR2,
                  resultIN OUT SYS_REFCURSOR) AS
BEGIN
  if false then
    OPEN resultIN FOR
      SELECT dummy 
      from dual;
  ELSE
     resultIN := null;
  END IF;
END;

【讨论】:

    【解决方案2】:

    您可以按如下方式使用假查询:

    OPEN resultIN FOR
    select * from dual where 1=2; 
    
    -- if you want one row also then use 
    
    OPEN resultIN FOR
    select case when 1=2 then 1 end as dummy_row from dual; 
    

    使用OPEN resultIN FOR 很重要,否则将使用它的应用程序将直接抛出关闭光标错误。 (光标未打开。)

    【讨论】:

    • 这是正确的做法吗?我们还有其他选择吗?
    • 正确的做法是处理应用程序中的逻辑。但为此,您将需要一个更多的输出参数,例如指示应用程序是否应该访问游标的标志(主要使用计数查询)
    猜你喜欢
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2012-08-14
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多