基于视图条目在存储过程中引发异常



我有一个存储过程。我想实现下面的逻辑,这是我用伪代码编写的。

如果以下查询有一个或多个条目:

SELECT
NULL
FROM
table1
WHERE
condition
GROUP BY
column
HAVING
COUNT(1) > 1
UNION ALL
SELECT
NULL
FROM
table1 a
WHERE
condition
AND EXISTS (
SELECT
NULL
FROM
table2 b
WHERE
condition
);

然后引发异常并停止存储过程。

以下是在查询中找到特定值时引发异常的示例:

declare
somevar dual.dummy%type;
begin
select 'Y' into somevar
from   dual;
if somevar = 'Y' then
raise_application_error(-20123, 'Hull breach on deck 15. Abandon ship.'); 
end if;
end;

";从双";可以是任何查询,所以可以随意替换您的并集和计数(尽管我们应该真正坚持标准的count(*),而不是count('Dracula')等(。

让我们用示例emp/dept模式来做这件事——只需为您的用例插入您自己的语句。您确实需要声明,因为在pl/sql中,您不能"只需选择";。您总是需要在变量中进行选择。我通常只将数字1选择为数字类型的伪变量。诀窍是在SELECT INTO之后引发异常,而在NO_DATA_FOUND上不执行任何操作。

您可以使用命名异常来区分不同的情况,但由于找不到数据会引发异常,因此您必须在自己的块中执行每个情况。最干净的是处理最后一个异常块中的所有命名异常。

DECLARE
l_dummy NUMBER;
king_exists EXCEPTION; 
dave_exists EXCEPTION; 
BEGIN
BEGIN
SELECT 1 INTO l_dummy FROM emp WHERE ename = 'DAVE';
RAISE dave_exists;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
BEGIN
SELECT 1 INTO l_dummy FROM emp WHERE ename = 'KING';
RAISE king_exists;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
EXCEPTION 
WHEN dave_exists THEN
raise_application_error(-20000,'My expection error message');
WHEN king_exists THEN
raise_application_error(-20001,'King exists');
END;
/

最新更新