我有一个批处理文件,使用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中。
它没有完成的一个原因,特别是如果它的运行时间比预期的要长得多,可能会有另一个会话阻止它完成。查询的解决方案是:Finding query from oracle which is blocking session
您还可以检查查询是否由于某种原因仍在运行。但是,如果您已经在SQL Dev中测试了完全相同的脚本,那似乎不太可能。 How to check Oracle database for long running queries
此外,ELSE NULL
案件可以删除。它没有做任何事情和IF
不需要ELSE
条款。