【问题标题】:Raise exception in stored procedure based on view entries基于视图条目在存储过程中引发异常
【发布时间】:2021-06-12 05:40:47
【问题描述】:

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

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

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
    );

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

【问题讨论】:

标签: sql oracle


【解决方案1】:

如果从查询中找到特定值,以下是引发异常的示例:

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;

“select from dual”可以是任何查询,因此请随意替换您的 unions 和 counts(尽管我们应该真正坚持标准 count(*),而不是 count('Dracula') 等)。

【讨论】:

  • 我也在互联网上找到了以下几行。 review_files 例外; PRAGMA exception_init (review_files, -20001);你知道他们是否对我的需要增加了一些有用的东西吗?
  • 这在调用它的过程中可能很有用。假设过程 xyz 调用 raise_application_error(-20001, 'Something bad happened.'); 现在另一个过程调用 xyz 并且它想要捕获 ORA-20001。那时你会使用pragma exception_init
【解决方案2】:

让我们使用示例 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;
/

【讨论】:

  • 感谢您的回答。如果我需要根据不同的变量在异常中引发不同的消息,这会是这种方法吗?
  • 我不确定我是否理解您想要实现的目标。你能更准确吗?如果可能的话,基于我的例子......
  • 我想要 l_dummy, l_dummy2, l_dummy3 这将是不同查询的选择 1。我想根据 l_dummy 是什么自定义消息来引发异常。
猜你喜欢
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2019-09-06
相关资源
最近更新 更多