【问题标题】:Should i commit at the end of the procedure which is called by an oracle scheduler job我是否应该在由 oracle 调度程序作业调用的过程结束时提交
【发布时间】:2017-12-21 08:43:02
【问题描述】:

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

【问题讨论】:

  • DROP TABLE ... 是一个 DDL 命令,它会进行隐式 COMMIT,因此在您的情况下,它不是必需的。
  • @WernfriedDomscheit 这是处理这种情况的最佳方法还是我应该编写动态 sql 来处理这种情况
  • 你必须使用动态SQL(即EXECUTE IMMEDIATE '...'反正。
  • 您应该始终避免使用SQLCODE||' -ERROR- '||SQLERRM。如果您只想重新引发现有异常而不添加任何值,则只需使用raise - 尽管通常应该遵循一些其他处理,例如记录消息。如果您甚至不希望这样,那么为什么要使用荒谬的、被破坏的消息破坏一个完美的错误堆栈呢?

标签: sql oracle stored-procedures job-scheduling


【解决方案1】:

为当前数据只创建一次TABLE_1

CREATE TABLE TABLE_1 AS SELECT * FROM TABLE1_VIA_DBLINK;

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

当你继续做这份工作时,也许你会等待大量数据被插入。

顺便说一句,如果你坚持使用这个工作,你不需要发出commit,因为job内部已经存在一个隐含的commit机制。

【讨论】:

  • 我将在同一个过程中处理 15 个表,并且不确定在所有这些表上编写触发器是否是最佳实践,因为 TABLE1_VIA_DBLINK 是通过 DBKLINK 从另一部分访问的国家。
【解决方案2】:

你从事什么样的工作? 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 VIEW,它基本上是一样的:TRUNCATEINSERT INTO ... SELECT * FROM ...

【讨论】:

  • 我正在运行一个SCHEDULER JOB
【解决方案3】:

没有。你不需要提交。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多