【问题标题】:Return OUT Parameter when exception happens发生异常时返回 OUT 参数
【发布时间】:2016-01-02 09:53:33
【问题描述】:

我有以下程序:

create or replace PROCEDURE FIND_OTHER_DATE (LINE_IDD IN NUMBER,DATE_INN IN VARCHAR2,MMM IN OUT DATE)
AS
BEGIN
   SELECT MAX(INVOICE_DATE) into MMM
   FROM INVOICE
   where INVOICE.LINE_ID=LINE_IDD and INVOICE_DATE <> to_date(DATE_INN,'YYYY-MM-DD HH24:MI:SS') and MONTHS_BETWEEN(to_date(DATE_INN,'YYYY-MM-DD HH24:MI:SS'),INVOICE_DATE)>=1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
    MMM:=to_date('1950-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS');
END;

select 语句没有返回行时,我想要OUT MMM 参数返回1950-01-01 00:00:00.. 我试过上面的代码。但它没有工作,为什么?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    这不是 PL/SQL 问题,而是对聚合在 SQL 中的工作方式的误解。如果没有 GROUP BY 子句,您的聚合 SELECT 语句保证总是返回恰好包含 MAX() 值的一行。

    如果您的WHERE 子句不返回任何行,则MAX() 将是NULL。因此,你可以这样写:

    SELECT NVL(MAX(INVOICE_DATE), DATE '1950-01-01') 
    INTO MMM
    FROM INVOICE
    WHERE INVOICE.LINE_ID = LINE_IDD 
    AND INVOICE_DATE <> to_date(DATE_INN, 'YYYY-MM-DD HH24:MI:SS') 
    AND MONTHS_BETWEEN(to_date(DATE_INN, 'YYYY-MM-DD HH24:MI:SS'), INVOICE_DATE) >= 1;
    

    或者,您可以添加GROUP BY (),在这种情况下,如果WHERE 子句不返回任何行,则聚合将不会返回任何行。在这种情况下,您的NO_DATA_FOUND catch 块将适用:

    SELECT MAX(INVOICE_DATE)
    INTO MMM
    FROM INVOICE
    WHERE INVOICE.LINE_ID = LINE_IDD 
    AND INVOICE_DATE <> to_date(DATE_INN, 'YYYY-MM-DD HH24:MI:SS') 
    AND MONTHS_BETWEEN(to_date(DATE_INN, 'YYYY-MM-DD HH24:MI:SS'), INVOICE_DATE) >= 1
    GROUP BY ();
    

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 2019-06-25
      • 2016-03-23
      • 2020-05-12
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      相关资源
      最近更新 更多