ANT - PLSQL 执行错误
Posted
技术标签:
【中文标题】ANT - PLSQL 执行错误【英文标题】:ANT - PLSQL execution error 【发布时间】:2018-07-02 21:21:40 【问题描述】:我有一堆要使用 ant 执行的 sql 脚本(一些 sql 和一些 plsql)。 在开始执行之前,我需要确保文件是可执行的。所以我运行以下目标来从 ant 创建 sql 和 plsql 可执行文件。
<copy todir="$migration.scripts.dir\temp\">
<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 行开始的错误命令 - 开始 为 c 输入 - 询问 环形 dbms_utility.blah 错误报告 - ORA-06550:第 9 行,第 135 列: PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:
:= . ( % ; 06550. 00000 - "line %s, column %s:\n%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 错误,或者为什么pattern=";" replace="$line.separator/"
会破坏 PL/SQL(从而导致这些错误)?
我知道 replace="$line.separator/" 导致“增强”脚本出错。但是对于 SQL 来说效果很好。但是现在我想知道为什么会抛出这个 PLSQL 错误。
PL/SQL 语言使用;
作为命令终止符,而不是/
,它是除法运算符。显然,挑战将是阻止您的 Ant 脚本通过向其中注入无效字符来弄乱您的 PL/SQL。不过我不认识 Ant,所以也许这真的很难。
【参考方案1】:
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 以执行时。但是,虽然它知道它在 inside 一个块中,但它知道它看到的任何分号都是 PL/SQL 语言的一部分,它不应该尝试解释它们。
这被称为in the SQL*Plus documentation for running PL/SQL blocks,其他客户端的行为方式也类似。
使用
RUN
或斜杠 (/
) 命令执行当前子程序。分号 (;
) 被视为 PL/SQL 子程序的一部分,不会执行命令。
【讨论】:
这有帮助,我需要确保 plsql 块在 ant 运行时保持原样。以上是关于ANT - PLSQL 执行错误的主要内容,如果未能解决你的问题,请参考以下文章
错误:执行命令“ant”,确保您已安装 ant 并将其添加到您的路径
我在PLSQL写的package包,编译没有错误,执行也没错误,就是建不了表。求解啊
ant jar 错误:执行失败:java.io.IOException:无法运行程序...$aapt":错误=2,没有这样的文件或目录