我有一个存储过程。我想实现下面的逻辑,这是我用伪代码编写的。
如果以下查询有一个或多个条目:
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;
/