有没有办法在oracle中进行选择性提交?

roy*_*g86 0 oracle plsql stored-procedures

我有一个PL/SQL脚本,它运行一堆命令,并在最后调用commit.

 select count(*) into countCol from USER_TAB_COLUMNS where TABLE_NAME = 'EVAPP_CARLETON_RESULT' and COLUMN_NAME = 'AMTFIN' and DATA_SCALE is null; 
 IF (countCol <> 0) then   

 execute immediate 'alter table EVAPP_CARLETON_RESULT add AMTFIN_TMP NUMBER(10,2)' ; 

 execute immediate 'update EVAPP_CARLETON_RESULT set AMTFIN_TMP = AMTFIN' ; 

 execute immediate 'alter table EVAPP_CARLETON_RESULT drop column AMTFIN' ; 

 execute immediate 'alter table EVAPP_CARLETON_RESULT rename column AMTFIN_TMP to AMTFIN' ; 


 DBMS_OUTPUT.put_line('This column EVAPP_CARLETON_RESULT.AMTFIN has been modified to the required precision'); 
 END IF; 
 logger('68');

 evaluate.commitScript; 
Run Code Online (Sandbox Code Playgroud)

在此之前有68个这样的块,但在最后调用evaluate.commitScript.

但是,logger在每个这样的块之后被调用,并且它内部有一个commit语句.

 create or replace
 PROCEDURE LOGGER 
(MESSAGE1 IN VARCHAR2  ) AS 
 pragma autonomous_transaction;
   BEGIN
     insert into message_log (datetime, message) values (sysdate, message1);
     commit;
   END LOGGER;
Run Code Online (Sandbox Code Playgroud)

提交同时提交所有更改.不仅仅是程序所做的更改.无论如何,我们可以选择性地调用commit吗?

BD.*_*BD. 7

看起来你已经在LOGGER proc中有了这一行的解决方案:

pragma autonomous_transaction
Run Code Online (Sandbox Code Playgroud)

该语句在过程中设置单独的事务.在那里发布的COMMIT不会在该过程之外提交任何事务.

此外,EXECUTE IMMEDIATE语句中的DDL是隐式提交的.