【问题标题】:Error executing SQL with Apache Ant, but not Oracle SQL Developer使用 Apache Ant 而不是 Oracle SQL Developer 执行 SQL 时出错
【发布时间】: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 我已经尝试将分隔符添加到 但仍然给出相同的错误:(

标签: sql oracle ant


【解决方案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 部分保存在单独的文件中。它没有工作
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2020-03-27
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多