database - Oracle - "record"常量

标签 database oracle

我想创建抛出应用程序错误的程序。此程序应放在单独的包中。

procedue Raise_Error(error_code) is
err t_Error;
begin
      err:= error_list(error_code);
      raise_application_error(err.error_number, err.message);
end; 

所以我在包中创建了类型:

type t_Error is record (error_number INTEGER, message VARCHAR2(200));
type t_Error_List is table of t_Error index by VARCHAR(30);
error_list t_Error_List ;

如何创建这样的错误常量列表:

const1 t_Error := t_Error (-200001, 'first message');
const2 t_Error := t_Error (-200002, 'second message');

error_list ('code1') := const1;
error_list ('code2') := const2;

非常感谢。 鲍勃

最佳答案

您可以在包的 begin/end block 中创建错误表(它将在其中为调用包的每个 session 创建),但您不能实例化这样的记录;您需要独立设置字段值:

create package body error_pkg as
  procedure Raise_Error(error_code in varchar2) is
    err t_Error;
  begin
    err := error_list(error_code);
    raise_application_error(err.error_number, err.message);
  end Raise_Error;

begin
  error_list ('code1').error_number := -20001;
  error_list ('code1').message := 'first message';
  error_list ('code2').error_number := -20002;
  error_list ('code2').message := 'second message';
end error_pkg;
/

使用虚拟 PL/SQL block 调用过程:

begin
  error_pkg.raise_error('code2');
end;
/

Error report:
ORA-20002: second message
ORA-06512: at "STACKOVERFLOW.ERROR_PKG", line 6
ORA-06512: at line 2

SQL Fiddle demo .

虽然我不确定这是个好主意。您正在丢失原始问题的堆栈跟踪 - 您不知道 raise_error 调用是从哪里发出的。也许这与您自己的错误无关紧要;但如果您正在捕获一个真正的异常并改为调用它,那将是一个坏主意。

关于database - Oracle - "record"常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17294647/

相关文章:

mysql - 用大量测试数据填充数据库表

mysql - 我有两个选择,我希望结果表是两个选择的并集

mysql - 为以下简单示例设计架构的最佳方法是什么?

sql - 将时间戳舍入到最接近的秒

php - var_dump 返回 bool(false) 和 @mysql_ping() 返回 true,为什么?

sql - 软删除是个好主意吗?

无法在 Oracle Pro*C 中测试空值

java - 当所有参数都为空时 COALESCE 的替代方案

sql - 连接并在 where 子句中使用 oracle plsql

mysql - 重命名 100GB 表