发生异常时返回 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 参数的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2008 发布版本上的 c++ 应用程序出现未处理异常 - 从函数返回时发生
返回值与输出参数比较(return value or out parameter)