使用 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 任务的呢?您是否设置了delimiter
、delimitertype
行? check this
@ArkadiuszŁukasiewicz,您介意展示相关的构建脚本吗?你试过-debug
选项吗?
看起来你正在一起执行 pl/sql 和 sql,this 可能会有所帮助
@Rao 我已经尝试将分隔符添加到 使用 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)
在 Jmeter 的分布式负载测试中使用 Apache ANT 生成 HTML 报告
使用类加载器AntClassLoader []找不到taskdef类org.apache.tools.ant.taskdefs.optional.ssh.Scp