对在sqldeveloper中运行但无法放入批处理文件中的.sql代码进行故障排除

时间:2019-04-17 22:03:43

标签: sql oracle batch-file cmd oracle-sqldeveloper

我有一个批处理文件,可以使用sqlplus命令运行多个.sql文件。我遇到一个问题,其中一个.sql文件挂起并导致我退出批处理作业。

我没有遇到错误代码,但是我已经使批处理文件在这一部分运行了12个小时以上,但没有成功。当我在sqldeveloper中手动运行此.sql文件时,它在大约2分钟内完成。 sql代码是一条插入语句,该语句插入少于40万行的5列。最初,此代码是一个较大的.sql文件的一部分,该文件在同一个表中插入了4条插入语句,但是我将每个插入语句分成了自己的文件,然后进入批处理文件以尝试解决此问题。其他3个文件运行都没有问题,并且运行时间与手动运行类似。

我尝试过更改其运行顺序,并将此代码制成自己的单独批处理文件,但没有帮助。

代码从带有多个变量的声明语句开始,然后执行:

BEGIN
    SELECT VARIABLE INTO DECLARED VARIABLE
    FROM TABLE;
etc...

它对批处理文件中的所有sql文件执行操作。 然后,它具有IF语句(与其他sql文件进行相同的测试),其后是:

  THEN
       INSERT INTO TABLE (
            SELECT VAR1,
                   VAR2,
                   CASE WHEN COLUMN1 IS NOT NULL AND COLUMN2 IN (VALUE)
                            THEN COLUMN1 || 'D' || RNK
                        ELSE COLUMN1
                       END AS VAR3
            FROM( SUBQUERIES );

对于“ SUBQUERIES”,它具有嵌套的子查询,这些子查询保持连接状态,并内部连接到其他子查询。我认为该步骤可能太复杂并导致错误,但不确定。

它以COMMIT语句结束IF-THEN,其后是:

   ELSE
       NULL;
   END IF;
END;

在4个文件之间唯一改变的是插入语句。我该如何解决这个问题,以找出导致它挂在批处理文件中的原因,而不是挂在sqldeveloper中。

1 个答案:

答案 0 :(得分:1)

它未完成的一个原因,尤其是如果它运行的时间比预期的长得多,可能是因为还有另一个会话阻止它完成。查询此问题的解决方案在这里:Finding query from oracle which is blocking session

您还可以检查由于某种原因该查询仍未运行。但是,如果您已经在SQL Dev中测试了完全相同的脚本,那似乎不太可能。 How to check Oracle database for long running queries

此外,IF大小写也可以删除。它什么也不做,ELSE不需要UnboundLocalError: local variable 'pause' referenced before assignment子句。