【问题标题】:Ant exec executable to execute PL/SQL procedure fails执行 PL/SQL 过程的 Ant exec 可执行文件失败
【发布时间】:2016-11-16 16:15:47
【问题描述】:

我有一个 Ant 脚本来执行 SQL 和 PL/SQL 过程。

<exec executable="sqlplus" failonerror="true" >         
  <arg value="${user}/${password}@${DB}" />
  <arg value="@${scriptFilename}" />
</exec>

以上代码执行 SQL 脚本和包,但不执行如下过程:

BEGIN
   -- drop functions
   FOR R IN (
      SELECT owner, object_name
      FROM all_objects
      WHERE owner='FCPOTP'
      AND OBJECT_TYPE IN ('FUNCTION'))
   LOOP
      EXECUTE IMMEDIATE 'drop function '||R.owner||'.'||R.object_name; 
   END LOOP;  
   -- drop procedure
   FOR R IN (
      SELECT owner, object_name
      FROM all_objects
      WHERE owner='FCPOTP'
      AND OBJECT_TYPE IN ('PROCEDURE'))
   LOOP
      EXECUTE IMMEDIATE 'drop procedure '||R.owner||'.'||R.object_name; 
   END LOOP;     
END;

如何使用相同的 exec sqlplus 可执行文件来执行所有操作?

【问题讨论】:

  • 它是如何“失败”的——你得到了什么错误?这真的是过程的一部分,还是匿名块?如果您通过 SQL*Plus 手动运行,会发生什么?
  • @AlexPoole - 我没有收到任何错误。但是该块没有被执行。它只是说 [exec] 连接到: [exec] Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production [exec] 使用分区选项 [exec] [exec] 36 与 Oracle Database 11g Enterprise Edition Release 11.2 断开连接。 0.4.0 - 64 位生产 [exec] 带有分区选项 [echo] ===== End ===== [echo]
  • 最好在问题中显示该输出,以便正确格式化。但我明白了它的要点。

标签: jenkins ant exec executable sqlplus


【解决方案1】:

您不会收到错误消息,并且从注释的输出中您看不到正在执行的块。那是因为它不是。 From the documentation:

SQL*Plus 将您输入的子程序存储在 SQL 缓冲区中。使用 RUN 或斜杠 (/) 命令执行当前子程序。分号 (;) 被视为 PL/SQL 子程序的一部分,不会执行命令。

此时您的匿名块(子程序)正被输入“SQL 缓冲区”,但从未被执行。

您只需要在您的匿名块之后将/ 添加到您的脚本文件中:

...
   LOOP
      EXECUTE IMMEDIATE 'drop procedure '||R.owner||'.'||R.object_name; 
   END LOOP;     
END;
/

【讨论】:

  • 加/后程序执行成功。谢谢。
猜你喜欢
  • 2011-03-22
  • 2017-01-07
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多