2016-11-16 30 views
0

我有一个Ant脚本来执行SQL和PL/SQL程序。蚂蚁EXEC可执行文件来执行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可执行文件执行的一切吗?

+0

它如何“失败” - 你得到了什么错误?这真的是程序的一部分,还是一个匿名块?以及如果您运行通过SQL \ * Plus手动会发生什么情况? –

+0

@AlexPoole - 我没有收到任何错误。但该块不会执行。它只是说[exec]连接到: [exec] Oracle数据库11g企业版版本11.2.0.4.0 - 64位生产 [exec]使用分区选项 [exec] [exec] 36从Oracle Database 11g Enterprise版本发布11.2.0.4.0 - 64位生产 [执行]与分区选项 [回声] =====结束===== [回声] – useranon

+0

这将是更好的显示问题的输出它可以正确格式化。但我明白了它的要点。 –

回答

2

你不会得到一个错误,并在注释的输出看不到正在执行的块。那是因为它不是。 From the documentation

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

当前你的匿名块(子程序)正在进入'SQL缓冲区',但从未被执行。

你只需要一个/添加到您的脚本文件,您的匿名块后:

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

添加/该过程成功执行后。谢谢。 – useranon