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 loopend - 在它试图执行的代码中。它还没有有效地看到脚本的其余部分。

然后它继续并尝试解释下一个块

 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 执行错误的主要内容,如果未能解决你的问题,请参考以下文章

Apache Ant 执行错误

蟾蜍plsql错误执行存储过程

错误:执行命令“ant”,确保您已安装 ant 并将其添加到您的路径

我在PLSQL写的package包,编译没有错误,执行也没错误,就是建不了表。求解啊

ant jar 错误:执行失败:java.io.IOException:无法运行程序...$aapt":错误=2,没有这样的文件或目录

orcale用PLSQL打开为啥来时报初始化错误