繁体   English   中英

我是否应在由Oracle Scheduler作业调用的过程的最后提交

[英]Should i commit at the end of the procedure which is called by an oracle scheduler job

我正在运行一个Oracle JOB ,它将运行一个PROCEDURECREATE TRUNCATE INSERT DROP一些相关的表。

这是执行此类功能的最佳方法吗? 我应该在程序结束时提交吗?

CREATE OR REPLACE Procedure PR_NAME 
IS 
BEGIN

   CREATE TABLE TABLE_1_BAC AS SELECT * FROM TABLE1_VIA_DBLINK;

   TRUNCATE TABLE  TABLE_1;

   INSERT INTO TABLE_1   SELECT * FROM TABLE_1_BAC;

   DROP TABLE TABLE_1_BAC;

--COMMIT;
EXCEPTION
WHEN OTHERS THEN
   raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;

要为当前数据仅创建一次TABLE_1

CREATE TABLE TABLE_1 AS SELECT * FROM TABLE1_VIA_DBLINK;

并为TABLE1_VIA_DBLINK创建一个插入触发器,通过该触发器为新数据填充TABLE_1 ,并摆脱此jobprocedure似乎更可行。

当您继续从事这项工作时,也许您将等待插入大量数据。

顺便说一句,如果您坚持使用此作业,则无需发出commit ,因为job机制内部已经存在隐式commit

您使用哪种工作? JOB还是SCHEDULER JOB

我看不到任何原因来删除/创建表。 我根本看不到您为什么使用中间表的任何原因。

简单地使

CREATE OR REPLACE Procedure PR_NAME 
IS 
BEGIN

   EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE_1';
   INSERT INTO TABLE_1 SELECT * FROM TABLE1_VIA_DBLINK;
   COMMIT;
END;

您不需要任何异常处理程序。 对于JOB ,无论如何您都不会看到该异常。 对于SCHEDULER JOB您可以在视图中看到异常

*_SCHEDULER_JOB_LOG

*_SCHEDULER_JOB_RUN_DETAILS

如果只进行这种操作,则应考虑进行基本相同的“ 材料视图 ”: TRUNCATEINSERT INTO ... SELECT * FROM ...

不,您不需要提交。

这些命令是SQL中的DDL(数据定义语言)。 因此,Oracle数据库将与命令一起发出提交。

DML(数据操作语言)-像SELECT,UPDATE,INSERT,DELETE一样需要提交。

在方案中,您将在其中更新,删除和插入记录。 然后,您运行了一个create table命令。 插入,更新和删除的记录将被提交(保存)到数据库中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM