重新运行 PL/SQL 脚本命令

Posted

技术标签:

【中文标题】重新运行 PL/SQL 脚本命令【英文标题】:Re-run PL/SQL script command 【发布时间】:2016-01-14 15:14:00 【问题描述】:

我想扩展一个简单的插入脚本。

DECLARE 
i varchar2(3000) := dbms_random.string('A',8);
BEGIN

INSERT INTO BUYERS 
(USER_ID,BUYER_CD,BUYER_ENG_NM,REG_DT)
VALUES 
(i,'tes','test','test');
EXCEPTION WHEN OTHER 
THEN
(this is where I need help)

end;

我们在两个数据库之间进行动态复制。但是,由于某些奇怪的原因,我们必须运行两次脚本才能将更改提交到两个数据库,因此我正在创建一个脚本,该脚本将尝试在所有表中进行插入。截至目前,我只在一张桌子上工作。在异常处理程序中,当初始插入失败时,如何使脚本再次运行?任何帮助表示赞赏。

【问题讨论】:

动态复制不会在没有代码的情况下发生。与其尝试“修复”问题,不如向我们展示执行复制的代码和任何错误消息。我希望为您着想,代码中没有“当其他人为空时”。 我们的复制运行的触发器和作业太多了,我根本无法在这里分享它们。此脚本不是修复程序。此脚本的目的是验证是否正在插入记录。我们已经意识到这个问题并正在努力修复。没有异常处理程序是“当其他人为空时”。我只是希望能够在失败时重新运行一组插入。 【参考方案1】:

如果插入出现问题,那么最好的方法是找出错误所在并引发错误。这最好通过自动记录程序来完成,该程序将记录内容、地点、时间,然后再次引发错误,以便停止处理。您不想冒险插入一次、两次或根本不插入记录,如果没有再次引发错误,可能会发生这种情况。 下面的 LOG_ERROR 过程可以根据您之前关于错误处理的问题的答案创建。

  DECLARE 
    i varchar2(3000) := dbms_random.string('A',8);
    BEGIN

INSERT INTO BUYERS 
(USER_ID,BUYER_CD,BUYER_ENG_NM,REG_DT)
VALUES 
(i,'tes','test','test');
EXCEPTION WHEN OTHER 
THEN
--by the time you got here there is no point in trying to insert again
LOG_ERROR(SQLERRM, LOCATION);
RAISE;
end;

【讨论】:

我明白你在说什么,这是有道理的。但是,我真正需要的是再次运行该语句,因为我知道它会失败。我不确定我是否说得通。非常感谢您的帮助。 @Jules 我确信很难将问题放入测试用例中。如果您只需要两次执行相同的操作,则将插入插入 when others 处理程序中。由于同样的原因它会再次失败......或者应该......

以上是关于重新运行 PL/SQL 脚本命令的主要内容,如果未能解决你的问题,请参考以下文章

SQL*Plus 不运行 PL/SQL 块

在 Perl 脚本中运行 PL/SQL 过程

如何从 pl sql 过程运行 sql 脚本

运行 pl/sql 脚本时遇到问题

PL SQL 过程中的“假脱机”命令问题

PL/SQL Developer查詢已經執行過的SQL語句記錄 Ctrl+E