oracle - 如何确定 PL/SQL 语句中的行/值抛出错误?

标签 oracle exception error-handling plsql

(Oracle PL/SQL)

如果我有一个简单的 SQL 语句抛出错误,即:

DECLARE
    v_sql_errm varchar2(2048);
BEGIN
    UPDATE my_table SET my_column = do_something(my_column)
        WHERE my_column IS NOT NULL;
EXCEPTION
    when others then
        -- How can I obtain the row/value causing the error (unknown)?
        v_sql_errm := SQLERRM;
        insert into log_error (msg) values ('Error updating value (unknown): '||
             v_sql_errm);
END;

异常 block 中是否有任何方法可以确定查询遇到错误的行/值?我希望能够记录它,以便我可以进入并修改/更正导致错误的特定数据值。

最佳答案

如果您使用的是 10gR2 或更高版本,则可以使用 DML 错误日志记录来完成此操作。

一个例子:

SQL> create table my_table (my_column)
  2  as
  3  select level from dual connect by level <= 9
  4  /

Tabel is aangemaakt.

SQL> create function do_something
  2  ( p_my_column in my_table.my_column%type
  3  ) return my_table.my_column%type
  4  is
  5  begin
  6    return 10 + p_my_column;
  7  end;
  8  /

Functie is aangemaakt.

SQL> alter table my_table add check (my_column not in (12,14))
  2  /

Tabel is gewijzigd.

SQL> exec dbms_errlog.create_error_log('my_table')

PL/SQL-procedure is geslaagd.

这将创建一个名为 err$_my_table 的错误日志记录表。通过向更新语句添加日志错误子句来填充此表:

SQL> begin
  2    update my_table
  3       set my_column = do_something(my_column)
  4     where my_column is not null
  5           log errors reject limit unlimited
  6    ;
  7  end;
  8  /

PL/SQL-procedure is geslaagd.

SQL> select * from err$_my_table
  2  /

                       ORA_ERR_NUMBER$
--------------------------------------
ORA_ERR_MESG$
--------------------------------------------------------------------
ORA_ERR_ROWID$
--------------------------------------------------------------------
OR
--
ORA_ERR_TAG$
--------------------------------------------------------------------
MY_COLUMN
--------------------------------------------------------------------
                                  2290
ORA-02290: check constraint (RWK.SYS_C00110133) violated
AAGY/aAAQAABevcAAB
U

12

                                  2290
ORA-02290: check constraint (RWK.SYS_C00110133) violated
AAGY/aAAQAABevcAAD
U

14


2 rijen zijn geselecteerd.

在 10gR2 之前,您可以使用 SAVE EXCEPTIONS 子句:http://rwijk.blogspot.com/2007/11/save-exceptions.html

关于oracle - 如何确定 PL/SQL 语句中的行/值抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944916/

相关文章:

Oracle Hierarchical Query 将不同的级别放入不同的列中

oracle - 在 ORACLE 中的 select 语句中从 PL/SQL 调用函数

android - 致命异常 - 在调用 Camera.release() 后使用相机 HTC ONE M9

android - 我在带有 kotlin 的 android studio 中有错误

C++ 字符串流错误处理

javascript - 不变的JS参数不清楚

java - Mybatis 查询插入 java 对象列表失败

java - 找不到适合 jdbc :oracle:thin:@localhost:1521:XE when running web application 的驱动程序

javascript - 检测服务器/站点对跨域 XMLHttpRequests 的支持?

c++ - 抛出异常后返回