ANT - PLSQL执行错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ANT - PLSQL执行错误相关的知识,希望对你有一定的参考价值。
我有一堆sql脚本(一些sql和一些plsql)使用ant执行。在开始执行之前,我需要确保文件是可执行的。所以我运行以下目标从ant创建sql和plsql可执行文件。
<copy todir="${migration.scripts.dir} emp">
<fileset dir="${migration.scripts.dir}" includes="*.sql"/>
<filterchain>
<replaceregex byline="false" pattern=";" replace="${line.separator}/" flags="mg"/>
<replaceregex byline="false" pattern="/[s]*/" replace=";${line.separator}/" flags="mg"/>
</filterchain>
</copy>
并且文件中的PLSQL文件是这样的 -
BEGIN
FOR c IN
--query
LOOP
dbms_utility.blah ;
END LOOP;
COMMIT;
END;
/
当ant目标makeExecutableSQLs运行输出时 -
BEGIN
FOR c IN
--query
LOOP
dbms_utility.blah
/
END LOOP
/
COMMIT
/
END
;
/
但是这个在以后运行时由于这个错误而失败 -
从行开始出错:在命令中为1 - BEGIN FOR c IN - 查询LOOP dbms_utility.blah错误报告 - ORA-06550:第9行,第135列:PLS-00103:遇到一个符号“文件结束”以下的:
:= . ( % ; 06550. 00000 - "line %s, column %s: %s" *Cause: Usually a PL/SQL compilation error. *Action: Error starting at line : 11 in command - END LOOP Error report - Unknown Command Commit complete. Error starting at line : 15 in command - END Error report - Unknown Command Error starting at line : 16 in command - Error report - Unknown Command
不能指责错误在哪里?
抛出PL / SQL错误是因为您已使用块终止符替换了分号PL / SQL语句分隔符。
当编译器看到/
它终止并在缓冲区中执行命令时,它会看到并尝试编译并运行
BEGIN
FOR c IN
--query
LOOP
dbms_utility.blah
/
作为一个独立的完整PL / SQL块。正如您从中得到的错误
ORA-06550:第9行,第135栏:PLS-00103:遇到符号“文件结束”......
表示明显完整的块在它应该之前结束。在blah
之后没有分号语句终止符,但也没有end loop
或end
用于块 - 在它试图执行的代码中。它没有有效地看到脚本的其余部分。
然后它继续并尝试解释下一个块
END LOOP
/
这也是无效的;客户端甚至没有尝试执行它,因为它不知道如何处理它。
然后下一个块
COMMIT
/
成功运行为纯SQL(事务控制)语句,而不是PL / SQL上下文。
等等。
简而言之,您不能用PL / SQL块中的斜杠替换分号,因为它们执行的操作非常不同。在纯SQL中它们是可互换的(或者更确切地说,它们是大多数客户端;至少在默认情况下 - 即使在SQL * Plus中,您也可以将SQL终止符从分号更改为其他内容)。
客户端仍然在PL / SQL块之后处理斜杠,并且当它看到它将块发送到要执行的DB时。但是虽然它知道它在一个块内,但它知道它看到的任何分号都是PL / SQL语言的一部分,它不应该试图解释它们。
这被称为in the SQL*Plus documentation for running PL/SQL blocks,其他客户倾向于以类似的方式行事。
使用
RUN
或斜杠(/
)命令执行当前子程序。分号(;
)被视为PL / SQL子程序的一部分,不会执行该命令。
以上是关于ANT - PLSQL执行错误的主要内容,如果未能解决你的问题,请参考以下文章
NDK: ant 错误 [javah] Exception in thread "main" java.lang.NullPointerException 多种解决办法(代码片段