我应该在oracle调度程序作业调用的过程结束时提交

时间:2017-12-21 08:43:02

标签: sql oracle stored-procedures job-scheduling

我正在运行一个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;

3 个答案:

答案 0 :(得分:0)

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

CREATE TABLE TABLE_1 AS SELECT * FROM TABLE1_VIA_DBLINK;

并为TABLE1_VIA_DBLINK创建插入触发器,通过此触发器为新数据填充TABLE_1,并且摆脱此jobprocedure似乎更可行。< / p>

当你留在这份工作中时,也许你会等待插入大量数据。

顺便说一下,如果你坚持使用这份工作,你就不需要发出commit,因为{{1}内已存在一个隐含的commit机制。

答案 1 :(得分:0)

你用什么工作? JOBSCHEDULER JOB

我没有看到DROP / CREATE表的任何理由。我完全没有看到你使用中间表的原因。

简单地制作

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

如果您只进行此类操作,则应考虑基本相同的MATERIALIZED VIEWTRUNCATEINSERT INTO ... SELECT * FROM ...

答案 2 :(得分:0)

没有。你不需要提交。

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

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

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

相关问题