【发布时间】:2014-10-15 17:05:18
【问题描述】:
我有一个返回引用游标的 Oracle 存储过程。我想在返回光标之前打开光标以检查计数并在需要时抛出异常,但我在语法和我应该如何做这件事上遇到了问题。
V_ASN_COUNT NUMBER;
OPEN O_CURSOR FOR
SELECT column1, -- a bunch of columns
column2,
COUNT(DISTINCT SI.ASN_NO) OVER (PARTITION BY SI.ASN_NO) AS ASN_COUNT
FROM AN_ORDER_INFO OI, AN_SHIPMENT_INFO SI
WHERE -- a bunch of criteria
OPEN O_CURSOR;
LOOP
FETCH ASN_COUNT INTO V_ASN_COUNT;
END LOOP;
CLOSE O_CURSOR;
IF(V_ASN_COUNT > 1) THEN
RAISE MULTIPLE_ASNS;
END IF;
【问题讨论】:
-
由于
FETCH消耗行,如果您在返回游标之前获取一些行,则调用者将不再通过返回的游标获取这些行。这可以接受吗? -
我没有意识到这一点。调用者需要这个 select 语句获取的所有内容,除了 asn_count。在这种情况下,我应该如何获取 asn_count 以进行错误处理?
-
您的具体要求是什么? "如果 any
ASN_COUNT > 1那么应该处理 not any 行并且应该立即引发异常" ?或者,如果/当您遇到一些ASN_COUNT > 1时,开始处理然后中止和ROLLBACK是否可以接受?
标签: oracle stored-procedures cursor fetch select-into