我如何避免$$ - >用ant sql任务编译后,存储过程体中的$替换?

时间:2014-09-17 09:01:17

标签: ant

运行ant sql task后,我的sql过程从:

开始
create or replace procedure test
is
begin
  dbms_output.put_line($$plsql_line, 'demo');
end;

进入

create or replace procedure test
is
begin
  dbms_output.put_line($plsql_line, 'demo');
end;

Ant任务是:

<target name="test">
    <record name="test-log" />

    <sql userid="dev"
         password="dev"
         url="jdbc:oracle:thin:@192.168.1.1:1521:DEMODB"
         keepformat="yes"
         driver="oracle.jdbc.OracleDriver"
         delimiter="/"
         encoding="utf8"
         escapeprocessing="false"
         delimitertype="normal">
        <fileset dir=".">
            <include name="test.sql"/>
        </fileset>
    </sql>
</target>

如何强制Ant不要用'$'替换'$$'?

1 个答案:

答案 0 :(得分:0)

请参阅ant manual properties / property expansion

  

为了保持与旧版Ant的向后兼容性,a   单身&#39; $&#39;除了类似属性的构造之外遇到的字符   (包括一对匹配的法国大括号)将被解释   从字面上;也就是说,&#39; $&#39;。 &#34;正确&#34;方式来指定这个文字   但是,字符是通过使用转义机制   无条件地,以便&#34; $$&#34;通过指定&#34; $$$$&#34;获得。混合   这两种方法产生了不可预测的结果,因为&#34; $$$&#34;结果是   &#34; $$&#34;

表示您需要使用$$$$...,请参阅:

<project>

<echo>
  1.
  create or replace procedure test
  is
  begin
    dbms_output.put_line($$plsql_line, 'demo');
  end;
</echo>


<echo>
  2.
  create or replace procedure test
  is
  begin
    dbms_output.put_line($$$$plsql_line, 'demo');
  end;
</echo>

</project>

输出:

[echo]   1.
[echo]   create or replace procedure test
[echo]   is
[echo]   begin
[echo]     dbms_output.put_line($plsql_line, 'demo');
[echo]   end;
[echo]   2.
[echo]   create or replace procedure test
[echo]   is
[echo]   begin
[echo]     dbms_output.put_line($$plsql_line, 'demo');
[echo]   end;

- 评论后编辑 -
复制原始sql文件,然后使用replace task编辑复制的文件,并使用已编辑的文件运行sqltask:

<!-- copy ... -->
<replace dir="..." value="$$$$$$$$" token="$$$$">
 <include name="**/*.sql"/>
</replace>
<!-- sql ... -->