发生异常时返回 OUT 参数

Posted

技术标签:

【中文标题】发生异常时返回 OUT 参数【英文标题】:Return OUT Parameter when exception happens 【发布时间】: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.. 我试过上面的代码。但它没有工作,为什么?

【问题讨论】:

【参考方案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 ();

【讨论】:

以上是关于发生异常时返回 OUT 参数的主要内容,如果未能解决你的问题,请参考以下文章

Override(重写)和Overload(重载)的区别

Visual Studio 2008 发布版本上的 c++ 应用程序出现未处理异常 - 从函数返回时发生

方法的重写重载。

返回值与输出参数比较(return value or out parameter)

返回值与输出参数比较(return value or out parameter)

重载和重写