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吗?
看起来你已经在LOGGER proc中有了这一行的解决方案:
pragma autonomous_transaction
Run Code Online (Sandbox Code Playgroud)
该语句在过程中设置单独的事务.在那里发布的COMMIT不会在该过程之外提交任何事务.
此外,EXECUTE IMMEDIATE语句中的DDL是隐式提交的.