我有一个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将您输入的子程序存储在SQL缓冲区中。使用RUN或斜杠(/)命令执行当前子程序。分号(;)被视为PL/SQL子程序的一部分,不会执行该命令。
此刻你的匿名块(子程序)正在进入'SQL缓冲区',但从未被执行。
你只需要添加一个/
到你的脚本文件,在你的匿名块之后:
...
LOOP
EXECUTE IMMEDIATE 'drop procedure '||R.owner||'.'||R.object_name;
END LOOP;
END;
/