简便一些的方法的话就使用匿名块吧 块中的语句要么都提交 要么都失败 做个简单的例子给你 自己模仿一下 SQL> show user USER is "SCOTT" SQL> drop table t1;Table dropped.SQL> create table t1(id number);Table created.SQL> insert into t1 values(1);1 row created.SQL> insert into t1 values(2);1 row created.SQL> commit;Commit complete.SQL> select * from t1; ID ---------- 1 2SQL> declare 2 begin 3 insert into t1 values(3); 4 insert into t1 values(4); 5 end; 6 /PL/SQL procedure successfully completed.SQL> select * from t1; ID ---------- 1 2 3 4 --这里看到两条记录都插入了 SQL> declare 2 begin 3 insert into t1 values(5); 4 insert into t1 values('haha'); --插入字符型数据是会报错的 5 end; 6 / declare * ERROR at line 1: ORA-01722: invalid number ORA-06512: at line 4 SQL> select * from t1; ID ---------- 1 2 3 4 --这里可以看到 不仅那条字符型数据haha没插入 id=5的那条insert语句也没成功
WHEN OTHERS THEN
ROLLBACK;
块中的语句要么都提交 要么都失败
做个简单的例子给你 自己模仿一下
SQL> show user
USER is "SCOTT"
SQL> drop table t1;Table dropped.SQL> create table t1(id number);Table created.SQL> insert into t1 values(1);1 row created.SQL> insert into t1 values(2);1 row created.SQL> commit;Commit complete.SQL> select * from t1; ID
----------
1
2SQL> declare
2 begin
3 insert into t1 values(3);
4 insert into t1 values(4);
5 end;
6 /PL/SQL procedure successfully completed.SQL> select * from t1; ID
----------
1
2
3
4 --这里看到两条记录都插入了
SQL> declare
2 begin
3 insert into t1 values(5);
4 insert into t1 values('haha'); --插入字符型数据是会报错的
5 end;
6 /
declare
*
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 4
SQL> select * from t1; ID
----------
1
2
3
4 --这里可以看到 不仅那条字符型数据haha没插入 id=5的那条insert语句也没成功
存储过程的话,直接把所有的往里面一贴,都不需要catch异常(除非你要是否出错的标记或输出),因为存储过程内部不加事务控制,就是原子的,要么全部成功,要么全部失败。
如果是程序,那需要在程序最开始begin一个trans,catch到异常就rollback,否则就commit。