将SQL文件传递给SQLPLUS时遇到了同样的问题

时间:2014-02-20 14:55:00

标签: oracle batch-file sqlplus

我通过以下命令将sql文件传递给sqlplus:

sqlplus -s user/pass@//10.8.249.22:1521/homhyp @E:\PQS\Integracao_14\LDCSVDP\regiao\BIN\merge_tables.sql

但是它被卡住了,似乎什么也没做。

我的sql文件的内容是:

MERGE INTO TB_DP_REGIAO B
USING TMP_DP_REGIAO P
ON (P.DS_PROTHEUS_CODE = B.DS_PROTHEUS_CODE)
WHEN MATCHED THEN UPDATE SET B.DS_PLANNING_CODE = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN 
P.DS_PLANNING_CODE ELSE B.DS_PLANNING_CODE END,
                             B.DT_LOAD = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DT_LOAD 
ELSE B.DT_LOAD END
WHEN NOT MATCHED THEN INSERT(DS_PROTHEUS_CODE, DS_PLANNING_CODE, DT_LOAD) VALUES
(P.DS_PROTHEUS_CODE, P.DS_PLANNING_CODE, P.DT_LOAD)
/
EXIT

从BAT文件中调用sqlplus,直到我按Ctrl+C才会显示任何内容。它只显示:

E:\PQS\Integracao_14\LDCSVDP\regiao\BIN>sqlplus user/pass@// 10.8.249.22:1521/homhyp @E:\PQS\Integracao_14\LDCSVDP\regiao\BIN\merge_tables.sq l 

    SQL*Plus: Release 12.1.0.1.0 Production on Thu Feb 20 13:34:15 2014 
    Copyright (c) 1982, 2013, Oracle. All rights reserved. 
    Connected to: 
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 

有人可以帮助我吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

在sql语句后添加exit

我认为该陈述完成了应该做的事情。然后等待输入更多语句。由于您使用-s启动了SQL * Plus,因此您将不会注意到。

答案 1 :(得分:1)

我现在对你实际运行的内容感到困惑。您的merge_tables.sql脚本应包含:

MERGE INTO TB_DP_REGIAO B
USING TMP_DP_REGIAO P
ON (P.DS_PROTHEUS_CODE = B.DS_PROTHEUS_CODE)
WHEN MATCHED THEN UPDATE
  SET B.DS_PLANNING_CODE = CASE WHEN B.DT_LOAD < P.DT_LOAD
    THEN P.DS_PLANNING_CODE ELSE B.DS_PLANNING_CODE END,
  B.DT_LOAD = CASE WHEN B.DT_LOAD < P.DT_LOAD
    THEN P.DT_LOAD ELSE B.DT_LOAD END
WHEN NOT MATCHED THEN INSERT (DS_PROTHEUS_CODE, DS_PLANNING_CODE, DT_LOAD)
  VALUES (P.DS_PROTHEUS_CODE, P.DS_PLANNING_CODE, P.DT_LOAD);
EXIT

或者:

MERGE INTO TB_DP_REGIAO B
USING TMP_DP_REGIAO P
ON (P.DS_PROTHEUS_CODE = B.DS_PROTHEUS_CODE)
WHEN MATCHED THEN UPDATE
  SET B.DS_PLANNING_CODE = CASE WHEN B.DT_LOAD < P.DT_LOAD
    THEN P.DS_PLANNING_CODE ELSE B.DS_PLANNING_CODE END,
  B.DT_LOAD = CASE WHEN B.DT_LOAD < P.DT_LOAD
    THEN P.DT_LOAD ELSE B.DT_LOAD END
WHEN NOT MATCHED THEN INSERT (DS_PROTHEUS_CODE, DS_PLANNING_CODE, DT_LOAD)
  VALUES (P.DS_PROTHEUS_CODE, P.DS_PLANNING_CODE, P.DT_LOAD)
/
EXIT

您需要在命令末尾使用语句分隔符(;),或者在下一行中使用/(但不是两者都行,或者它将执行两次)。然后René说你需要在最后退出脚本。

如果对要合并的表TB_DP_REGIAO进行了未提交的更改,那么合并本身可能会在等待释放锁时挂起 - 这将在提交或滚动其他更改时发生回来了,但是这次合并会无限期地等待。你不会看到错误,它只是什么都不做,如果你有命令执行(通过;/)和{{1},这似乎就是这里发生的事情}}