gpt4 book ai didi

oracle - PL/SQL RAISE_APPLICATION_ERROR 参数问题

转载 作者:行者123 更新时间:2023-12-05 09:10:54 27 4
gpt4 key购买 nike

我是 PL/SQL 的新手,我不完全理解 RAISE_APPLICATION_ERROR 的错误代码参数。

文档中说 error_number 是一个负整数,范围从 -20999 到 -20000。但这并不能解释我是否可以选择随机数或者是否有一个系统。另外我想知道在调用 RAISE_APPLICATION_ERROR 时是否可以在不同的函数中重复使用相同的数字?还是会在某处使用该编号来识别该特定错误?

我也在查看某人编写的过程,想知道为什么他们不直接将 SQLCODE 传递给 RAISE_APPLICATION_ERROR,而不是采用随机数,例如 RAISE_APPLICATION_ERROR(l_err_code, 'Record already exists!' );

我的印象是用户定义的错误只使用整数 -20999 到 -20000,而不是现有的错误。

PROCEDURE insert_record
(v_row IN OUT TABLE1%ROWTYPE) IS

l_err_code NUMBER;
l_err_message VARCHAR(200);
BEGIN


INSERT INTO TABLE1 ....
RETURNING id INTO V_row.id;

EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
l_err_code := SQLCODE;
l_err_message := 'Insert Error: ' - ' || SQLERRM;

...logging error here

RAISE_APPLICATION_ERROR(-20001, 'Record already exists!');
WHEN OTHERS THEN
l_err_code := SQLCODE;
l_err_message := 'Insert Error: ' - ' || SQLERRM;

--- loggin error here

RAISE_APPLICATION_ERROR(-20002, l_err_message);

END insert_record;

按如下方式修改上述函数是否有意义?:

PROCEDURE insert_record
(v_row IN OUT TABLE1%ROWTYPE) IS

l_err_code NUMBER;
l_err_message VARCHAR(200);
BEGIN


INSERT INTO TABLE1 ....
RETURNING id INTO V_row.id;

EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
l_err_code := SQLCODE;
l_err_message := 'Record already exists!';

...logging error here

RAISE_APPLICATION_ERROR(l_err_code, l_err_message);
WHEN OTHERS THEN
l_err_code := SQLCODE;
l_err_message := 'Insert Error: ' - ' || SQLERRM;

--- loggin error here

RAISE_APPLICATION_ERROR(l_err_code, l_err_message);

END insert_record;

如果有人能为我回答这些问题或向我指出一些澄清这些问题的文档,我将不胜感激。

最佳答案

RAISE_APPLICATION_ERRORerror_code 参数只接受 -20999 到 -20000 范围内的数字。在 -20999 到 -20000 之间,您可以随意使用错误编号,没有限制。数字的任何“组织”都取决于您。如果您传递超出该范围的数字,则会引发不同异常 - ORA-21000:-xxxxx 的 raise_application_error 的错误编号参数超出范围。例如:

BEGIN
RAISE_APPLICATION_ERROR(-54321, 'This is not a valid error code');
END;

导致异常

ORA-21000: error number argument to raise_application_error of -54321 is out of range
ORA-06512: at line 2

待提高。 db<>fiddle here

请注意,因为 Oracle 生成的 SQLCODE 值总是RAISE_APPLICATION_ERROR 允许的范围之外,您不能将 SQLCODE 传递给 RAISE_APPLICATION_ERROR,否则您将得到相同的 ORA-21000 异常引发,这反而违背了将 SQLCODE 传递给 RAISE_APPLICATION_ERROR 的目的。重新引发系统定义的异常(例如 DUP_VAL_ON_INDEX)的正确方法是使用 RAISE 语句的无参数版本。例如,让我们稍微重写一下您的代码:

PROCEDURE insert_record
(v_row IN OUT TABLE1%ROWTYPE) IS

l_err_code NUMBER;
l_err_message VARCHAR(200);
BEGIN


INSERT INTO TABLE1 ....
RETURNING id INTO V_row.id;

EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
l_err_code := SQLCODE;
l_err_message := 'Record already exists!';

-- log error here

-- Now, re-raise the exception so an outer handler can deal with it.
-- Note that there's no way to include a new error message in this case.

RAISE;

WHEN OTHERS THEN
l_err_code := SQLCODE;
l_err_message := 'Insert Error: ' - ' || SQLERRM;

--- log error here

-- Now, re-raise the exception so an outer handler can deal with it
RAISE;
END insert_record;

您可以通过创建 EXCEPTION 变量来使用其他错误编号,使用 EXCEPTION_INIT 编译指示为它们分配异常编号,然后使用 RAISE语句来引发这些异常。例如,

DECLARE
my_exception EXCEPTION;

PRAGMA EXCEPTION_INIT(my_exception, -54321);
BEGIN
RAISE my_exception;
EXCEPTION
WHEN my_exception THEN
DBMS_OUTPUT.PUT_LINE('my_exception caught!');
END;

产生输出

my_exception caught!

db<>fiddle here

PRAGMA EXCEPTION_INIT 允许 -10000000 到 -1 范围内的值,-1403 除外。 100 也是允许的。

关于oracle - PL/SQL RAISE_APPLICATION_ERROR 参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60710866/

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