对在sqldeveloper中运行的.sql代码进行故障排除,但在放入批处理文件时永远不会完成

问题描述 投票:1回答:1

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

我没有遇到错误代码,但我让批处理文件在这一部分上运行超过12小时但没有成功。当我在sqldeveloper中手动运行此.sql文件时,它大约在2分钟内完成。 sql代码是一个插入语句,可插入少于400k的行,包含5列。最初这段代码是一个更大的.sql文件的一部分,该文件有4个插入语句插入到同一个表中,但是我将每个insert语句分成了自己的文件,并在批处理文件中单步尝试解决问题。其他3个文件没有问题,并且在类似于手动运行的时间运行。

我已经尝试更改它运行的顺序,并将此代码作为自己的单独批处理文件,但它没有帮助。

代码以带有多个变量的declare语句开头,然后它执行:

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个文件之间唯一的变化是insert语句。我如何解决这个问题以找出导致它挂起在批处理文件中的原因,而不是在sqldeveloper中。

sql oracle batch-file cmd oracle-sqldeveloper
1个回答
1
投票

它没有完成的一个原因,特别是如果它的运行时间比预期的要长得多,可能会有另一个会话阻止它完成。查询的解决方案是:Finding query from oracle which is blocking session

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

此外,ELSE NULL案件可以删除。它没有做任何事情和IF不需要ELSE条款。

© www.soinside.com 2019 - 2024. All rights reserved.