gpt4 book ai didi

oracle - 保存 PL/SQL 异常并稍后引发它?

转载 作者:行者123 更新时间:2023-12-02 07:23:49 25 4
gpt4 key购买 nike

我有一个 PL/SQL 过程(在 Oracle 12c 数据库中)尝试插入一些数据。如果失败,它应该检查一个表,看看是否可以在那里找到一些信息来帮助解决问题。如果它找到信息,一切都很好,如果没有,它应该重新引发错误。

这是我的代码:

BEGIN
-- Try to insert some data.
INSERT INTO table VALUES x;
EXCEPTION
WHEN OTHERS THEN
BEGIN
-- Check a table to fins some info to help solve the problem.
-- If we find a row here, we can fix it.
-- If not, we should reraise the error.
SELECT * INTO y FROM table WHERE a = b;
-- Do some more stuff here to fix the problem.
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- We could not find anything in the table,
-- so we could not handle the situation.
-- Reraise the error.
RAISE;
END;
END;

这里的问题是 RAISE; 语句引发了最新的异常,即 SELECT 语句抛出的 NO_DATA_FOUND 。来自 INSERT 的原始异常位于堆栈的更下方,但不在顶部。

我可以以某种方式“保存” INSERT 中的错误并重新引发它吗?或者我可以运行一个 SELECT INTO 吗?如果它什么也没找到,也不会抛出错误?我的目标是重新引发原始 INSERT 异常,而不留下任何 NO_DATA_FOUND 异常的痕迹。

编辑:查看有关为什么这不是重复的评论。

最佳答案

raise 语句从 block 中拉出,尝试解决问题。如果您需要在修复失败时重新引发,请在内部异常处理程序中设置一个标志,并且仅在该标志为 true 时执行 raise

作为代码:

DECLARE
b_reraise BOOLEAN := FALSE;
BEGIN
-- Try to insert some data.
INSERT INTO table VALUES x;
EXCEPTION
WHEN OTHERS THEN
BEGIN
-- Check a table to fins some info to help solve the problem.
-- If we find a row here, we can fix it.
-- If not, we should reraise the error.
SELECT * INTO y FROM table WHERE a = b;
-- Do some more stuff here to fix the problem.
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- We could not find anything in the table,
-- so we could not handle the situation.
-- Reraise the error.
b_reraise := TRUE;
END;

IF b_reraise THEN
RAISE;
END IF;
END;

关于oracle - 保存 PL/SQL 异常并稍后引发它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33671818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com