繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM