CREATE OR REPLACE PROCEDURE P_MOVE BEGIN INSERT INTO TASK_HISTORY (TASK_ID,MOBILE,MESSAGE,SEND_TIME,END_TIME,STATUS,TASK_GROUP_ID,INTERFACE_ID,SPLITNUMTOTAL,TASK_PRI,CHILD_ID,BUSI_TYPE,MEG_ID) VALUES(SMS.TASK_ID,SMS.MOBILE,SMS.MESSAGE,SMS.SEND_TIME,SYSDATE,SMS.STATUS,0,SMS.INTERFACE_ID,SMS.TOTALCOUNT,SMS.TASK_PRI,SMS.CHILD_ID,SMS.BUSI_TYPE,SMS.MSGID); DELETE FROM VCOM_BX_SMS_DBINTERFACE_TEMP WHERE TASK_ID = SMS.TASK_ID; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; END LOOP; COMMIT; END; /
在以上的sql中,涉及到事务和异常
第一:当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出。异常也可以通过RAISE语句抛出
显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常。
第二:在Oracle中,oracle使用隐式事务,不需要定义事务开始,但是只有DML才会开启一个事务。也就是说Insert,Update,Delete这些都会开启一个事务,并且该事务在commit/rollback/ddl命令时会自动结束。
ORACLE的一个事务是以第一个可执行的SQL语句开始。当下列事件之一发生时结束。
1. 用户执行了COMMIT语句(提交)。
2. 用户执行了ROLLBACK语句(回滚)。
3. 用户执行了DDL语句(自动提交)。
4. 用户执行了DCL语句(自动提交)。
5. 用户正常退出SQL*PLUS(自动提交)。
6. 用户非正常退出SQL*PLUS(自动回滚)。
7. 系统崩溃,包括硬件或软件故障(自动回滚)。