ANT - PLSQL执行错误

问题描述 投票:0回答:1

我有一堆sql脚本(一些sql和一些plsql)使用ant执行。在开始执行之前,我需要确保文件是可执行的。所以我运行以下目标从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 - BEGIN FOR c IN - 查询LOOP 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

不能指责错误在哪里?

oracle plsql ant
1个回答
2
投票

抛出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时。但是虽然它知道它在一个块内,但它知道它看到的任何分号都是PL / SQL语言的一部分,它不应该试图解释它们。

这被称为in the SQL*Plus documentation for running PL/SQL blocks,其他客户倾向于以类似的方式行事。

使用RUN或斜杠(/)命令执行当前子程序。分号(;)被视为PL / SQL子程序的一部分,不会执行该命令。

© www.soinside.com 2019 - 2024. All rights reserved.