pl/sql:如果可能出现异常,如何放置所有行的值?

Posted

技术标签:

【中文标题】pl/sql:如果可能出现异常,如何放置所有行的值?【英文标题】:pl/sql: how to put the values of all rows if exceptions is possible? 【发布时间】:2015-03-26 20:25:22 【问题描述】:

我有将值从一个表传输到另一个表的过程。

create table t_num(num number(10,2));
create table t_str(str varchar2(10));
insert into t_str (str) values('23');
insert into t_str (str) values('2 3');
insert into t_str (str) values('2 3,3 2');
insert into t_str (str) values('2 3,3 223');
commit;

create or replace procedure put_to_t_num
as
    type t_num_t is table of t_num%rowtype index by binary_integer;
    tn t_num_t;
    n binary_integer := 0;
begin
    delete from t_num;
    --tn := t_num_t();
    for rec in ( select * from t_str )
    loop
        n := n + 1;
        --tn.extend;
        tn(n).num := to_number( regexp_replace( regexp_replace( rec.str, ',', '.'), ' ', '' ) );
    end loop;

    forall i in 1..n
        insert into t_num (
            num
        ) values (
            tn(i).num
        );
        --commit;
end;

字符串

tn(n).num := to_number( regexp_replace( regexp_replace( rec.str, ',', '.'), ' ', '' ) );

可能会抛出异常 VALUE_ERROR。

但我需要在这段代码中插入所有值,例如如果出现异常,则插入 0 而不是实际值,即不转换(类似于其他语言中的 try-catch)。

如何在我的代码中执行此操作?

谢谢!

【问题讨论】:

How to resolve: CallableStatement executing returns error "ORA-06502: PL/SQL: numeric or value error: character to number conversion error"?的可能重复 【参考方案1】:

而不是这一行:

tn(n).num := to_number( regexp_replace( regexp_replace( rec.str, ',', '.'), ' ', '' ) );

使用这个子块来处理异常:

begin 
  tn(n).num := to_number( regexp_replace( regexp_replace( rec.str, ',', '.'), ' ', '' ) );
exception when VALUE_ERROR
  then tn(n).num := 0;
end;

【讨论】:

谢谢,但是...我在浏览器控制台上成功了,但是在调用此过程后,表 t_num 中没有数据 你打开commit了吗?在您的代码中,它被注释了。 再次感谢您,nls_numeric_characters 的另一个问题,您的回答对我的问题来说是最好的(我之前说的互联网连接有问题)

以上是关于pl/sql:如果可能出现异常,如何放置所有行的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改我的 PL/SQL 过程以进行异常处理?

在 pl sql 中的所有异常情况下无论如何都要做些啥吗?

如何查询仅出现特定列中具有最高值的行的行?

PL/SQL 异常和错误处理

Oracle的PL_SQL的异常处理

PL/SQL 手动查询中的权限不足可能