使用 Apache Ant 而不是 Oracle SQL Developer 执行 SQL 时出错

Posted

技术标签:

【中文标题】使用 Apache Ant 而不是 Oracle SQL Developer 执行 SQL 时出错【英文标题】:Error executing SQL with Apache Ant, but not Oracle SQL Developer 【发布时间】:2016-06-22 12:57:19 【问题描述】:

以下是触发器:

CREATE OR REPLACE TRIGGER "CMDC"."USER_ROADS_UC"
BEFORE INSERT OR UPDATE OF
    ASSOCIATED_PARENT_ROAD
ON USER_ROADS
REFERENCES NEW AS NEW
FOR EACH ROW BEGIN
    :new.ASSOCIATED_PARENT_ROAD:=upper(:new.ASSOCIATED_PARENT_ROAD);
    EXCEPTION
    WHEN OTHERS THEN RETURN;
END;
/
ALTER TRIGGER "CMDC"."USER_ROADS_UC" ENABLE

以上内容在 SQL Developer 中完美运行。但是,当我使用 Ant 运行它时出现以下错误:

[sql] Failed to execute:  EXCEPTION WHEN OTHERS THEN RETURN
[sql] java.sql.SQLException: ORA-00900: invalid SQL statement
[sql] Failed to execute:  END
[sql] java.sql.SQLException: ORA-00900: invalid SQL statement
[sql] Failed to execute:  / ALTER TRIGGER "CMDC"."USER_ROADS_UC" ENABLE
[sql] java.sql.SQLException: ORA-00900: invalid SQL statement

我已经查看了this question。但是,我仍然无法修改脚本以使用 Ant。

下面是蚂蚁目标

<target name="create-db-schema" >
        <echo message="############################################################"/>
        <echo message="#               Create Complete DB Schema                  #"/>
        <echo message="############################################################"/>

        <sql onerror="continue" classpathref="project.class.path" driver="$database.driverClassName"
             url="$database.url" userid="$database.username" password="$database.password">
            <path>
                <fileset dir="$test.dbscripts.dir/schema/">
                    <include name="*.sql"/>
                </fileset>
            </path>
        </sql>
</target>

【问题讨论】:

如果在ALTER TRIGGER 语句的结尾加上分号和/或/ 有什么不同吗?如果您删除 ALTER TRIGGER 语句并将其作为单独的语句放入新调用中会怎样? 但是你是如何定义你的 ant 任务的呢?您是否设置了delimiterdelimitertype 行? check this @ArkadiuszŁukasiewicz,您介意展示相关的构建脚本吗?你试过-debug 选项吗? 看起来你正在一起执行 pl/sql 和 sql,this 可能会有所帮助 @Rao 我已经尝试将分隔符添加到 但仍然给出相同的错误:( 【参考方案1】:

使用 ant sql 标签,即使我尝试了多种方式,我也无法在同一个脚本中同时运行 SQL 和 PL/SQL。

但是使用外部库我可以做到这一点。我已经使用这个库来做到这一点dbmaintain 将以下内容添加到您的构建脚本中。

<path id="dbmaintain-lib"><fileset dir="$dbmaintain.home/lib"><include name="*.jar"/></fileset></path>
<taskdef resource="dbmaintain-anttasks.xml" classpathref="dbmaintain.lib"/>

    <target name="update-db">
    <updateDatabase scriptLocations="scripts" autoCreateDbMaintainScriptsTable="true">
        <database driverClassName="oracle.jdbc.driver.OracleDriver" userName="user" password="pass" url="jdbc:oracle:thin:@//localhost:1521/XE" schemaNames="SCHEMA"/>
    </updateDatabase>
</target>

现在一切都可以完美运行,无需更改 sql 脚本文件来替换“;”。 希望这对有需要的人有所帮助。

【讨论】:

【参考方案2】:

我没有测试此解决方案的环境。但是出于测试目的,您可以尝试这样的事情。

<sql
    driver="xxx"
    url="xxx"
    userid="xxx"
    password="xxx"
    delimiter="/"
    delimitertype="row"
    ><![CDATA[

CREATE OR REPLACE TRIGGER "CMDC"."USER_ROADS_UC"
BEFORE INSERT OR UPDATE OF
    ASSOCIATED_PARENT_ROAD
ON USER_ROADS
REFERENCES NEW AS NEW
FOR EACH ROW BEGIN
    :new.ASSOCIATED_PARENT_ROAD:=upper(:new.ASSOCIATED_PARENT_ROAD);
    EXCEPTION
    WHEN OTHERS THEN RETURN;
END;
/
ALTER TRIGGER "CMDC"."USER_ROADS_UC" ENABLE
/

]]></sql>
重要!您的分隔符现在是新行中的“/”,周围没有任何空格。

【讨论】:

已经这样做了,但我将 sql 部分保存在单独的文件中。它没有工作

以上是关于使用 Apache Ant 而不是 Oracle SQL Developer 执行 SQL 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Ant 使用的是 JRE 而不是 JDK,尽管设置了环境变量

搭建持续集成接口测试平台(jenkins+ant+jmeter)

Jenkins安装 没有使用

Jmeter+jenkins+ant自动化测试环境搭建

在 Jmeter 的分布式负载测试中使用 Apache ANT 生成 HTML 报告

使用类加载器AntClassLoader []找不到taskdef类org.apache.tools.ant.taskdefs.optional.ssh.Scp