[英]Raise exception in stored procedure based on view entries
我有一个存储过程。 我想实现以下我用伪代码编写的逻辑。
如果以下查询具有多个条目之一:
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
);
然后引发异常并停止存储过程。
让我们使用示例 emp/dept 模式来执行此操作 - 只需为您的用例插入您自己的语句。 您确实需要声明,因为在 pl/sql 中您不能“仅选择”。 您始终需要将 select 转换为变量。 我通常只是把 select 的数字 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;
/
如果从查询中找到特定值,以下是引发异常的示例:
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')
等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.