我有 2 个 execute immediate 语句
如下
execute immediate 'drop table substation';
vtest := 1/0;
execute immediate 'create table substation as select * from test121';
commit;
exception
when others then
rollback ;在 vtest := 1/0; 处出错的时候事务回滚,但是substation 还是 被drop 了,
不要vtest := 1/0; 这句话,如果后面一句
execute immediate 'create table substation as select * from test121'; 出错 事务回滚
substation 还是 被drop 了.求问如果达到 create table 失败以后不做drop table操作的效果.
以上操作在存储过程里面完成
如下
execute immediate 'drop table substation';
vtest := 1/0;
execute immediate 'create table substation as select * from test121';
commit;
exception
when others then
rollback ;在 vtest := 1/0; 处出错的时候事务回滚,但是substation 还是 被drop 了,
不要vtest := 1/0; 这句话,如果后面一句
execute immediate 'create table substation as select * from test121'; 出错 事务回滚
substation 还是 被drop 了.求问如果达到 create table 失败以后不做drop table操作的效果.
以上操作在存储过程里面完成
when others then
drop table 。。;
至少我不知道如何回滚DDL。create table substation as select * from test121这种语句除非表test121不存在,我实在想不出还会出什么错。
万一怕错,先建个substation1试一下,成功了再DROP substation,CREATE substation1。当然我不推荐这种怪异的方法。
vtest:=0;
vtest := 1/0;
execute immediate 'insert into substation select * from test1';
commit;
exception
when others then
rollback;
return;
为何,求教.
不过10g 好像有个fash rollback功能可以回退drop的操作
可以回滚
在网上找了下资料如下大家分享Oracle中DDL语句对事务的影响
在Oracle中,执行DDL语句(如Create Table、Create View等)时,会在执行之前自动发出一个Commit命令,并在随后发出一个Commit或者Rollback命令,也就是说,DDL会象如下伪码一样执行:
Commit;
DDL_Statement;
If (Error) then
Rollback;
Else
Commit;
End if;我们通过分析下面例子来看Oracle中,DDL语句对事务的影响:
Insert into some_table values(‘Before’);
Creaate table T(x int);
Insert into some_table values(‘After’);
Rollback;
由于在Oracle执行Create table语句之前进行了提交,而在Create table执行后也会自动发出Commit命令,所以只有插入After的行被回滚,而插入Before的行不会被回滚,Create table命令的结果也不会被回滚,即使Create table语句失败,所进行的Before插入也会被提交。如果最后发出Commit命令,因为插入Before及Create table的操作结果已经在之前提交,所以Commit命令影响的只有插入After的操作。