Java 使用精简jdbc驱动程序创建oracle db触发器
目前,我正在为应用程序设置测试环境。我正在测试环境中使用jUnit和Spring。在执行测试之前,我想设置一个数据库测试环境状态。我已经编写了SQL脚本模式和数据,它们在Oracles SQLDeveloper中运行良好。当我试图使用oracle瘦jdbc驱动程序执行它们时,执行失败。看起来瘦驱动程序不喜欢create触发器语句 我读到我必须使用oci驱动程序而不是瘦驱动程序。oci驱动程序的问题在于它不是独立于平台的,设置它需要时间 我的代码示例:Java 使用精简jdbc驱动程序创建oracle db触发器,java,sql,oracle,triggers,ora-00900,Java,Sql,Oracle,Triggers,Ora 00900,目前,我正在为应用程序设置测试环境。我正在测试环境中使用jUnit和Spring。在执行测试之前,我想设置一个数据库测试环境状态。我已经编写了SQL脚本模式和数据,它们在Oracles SQLDeveloper中运行良好。当我试图使用oracle瘦jdbc驱动程序执行它们时,执行失败。看起来瘦驱动程序不喜欢create触发器语句 我读到我必须使用oci驱动程序而不是瘦驱动程序。oci驱动程序的问题在于它不是独立于平台的,设置它需要时间 我的代码示例: CREATE TABLE "USER"
CREATE TABLE "USER"
(
USER_ID NUMBER(10) NOT NULL,
CREATOR_USER_FK NUMBER(10) NOT NULL,
...
PRIMARY KEY (USER_ID)
);
CREATE SEQUENCE SEQ_USER START WITH 1 INCREMENT BY 1;
CREATE TRIGGER "USER_ID_SEQ_INC" BEFORE
INSERT ON "USER" FOR EACH ROW BEGIN
SELECT SEQ_USER.nextval
INTO :new.USER_ID
FROM DUAL;
END;
如果我执行触发器语句,执行就会失败,但我看起来像是查询的第一部分CREATE trigger USER_ID_SEQ_INC。。。使用者开始来自双重;已成功执行,但如果我尝试使用它,触发器似乎已损坏。执行失败错误与语句END的第二部分一起出现;ORA-00900:无效的SQL语句
有人知道那个问题的解决办法吗?我只想用独立于平台的瘦jdbc驱动程序创建一个触发器
干杯
Kevin创建触发器可以与任何类型的JDBC驱动程序一起工作;SQL语法一定有问题——这很奇怪,因为Oracle应该在您运行CREATE触发器时报告,而不是在您第一次使用它时报告
既然你用BEGIN。。。终止确保你真的有一个;在发送到数据库的SQL中结束后
如果这不是原因,。谢谢你们的回答,现在一切正常。原因是语法错误或使用Spring Framefork解释SQL代码文件。当我使用jdbc的execute方法直接执行语句时,它可以工作;当我使用Spring功能执行脚本时,执行失败。对于oracle sql代码来说,这似乎很棘手,因为如果我使用hsqldb sql代码,它就可以正常工作
test-condext.xml:
...
<jdbc:initialize-database data-source="dataSource"
ignore-failures="DROPS" enabled="${jdbc.enableSqlScripts}">
<jdbc:script location="${jdbc.initLocation}" />
<jdbc:script location="${jdbc.dataLocation}" />
</jdbc:initialize-database>
...
这个很好用!重要的是要消除;在语句末尾,除了触发器语句
@Before
public void executeSomeSql() {
Connection c;
try {
c = dataSource.getConnection();
c.createStatement()
.execute("CREATE TABLE \"USER\" (USER_ID NUMBER(10) NOT NULL, CREATOR_USER_FK NUMBER(10) NOT NULL, PRIMARY KEY (USER_ID))");
c.createStatement()
.execute("CREATE SEQUENCE SEQ_USER START WITH 1 INCREMENT BY 1");
c.createStatement()
.execute("CREATE OR REPLACE TRIGGER \"USER_ID_SEQ_INC\" BEFORE INSERT ON \"USER\" FOR EACH ROW WHEN (new.USER_ID IS NULL) BEGIN SELECT SEQ_USER.nextval INTO :new.USER_ID FROM DUAL; END;");
} catch (SQLException e) {
logger.debug(e);
}
}
我知道这是一个老帖子,但这里是我的答案
默认情况下,Spring initialize数据库指令使用分号字符拆分指定的脚本:
在触发器中,触发器内通常有一个分号,因此查询被严重分割和执行
解决方案是使用另一个拆分字符|例如:
<jdbc:initialize-database>
<jdbc:script location="classpath:myscript.sql" separator="|"/>
</jdbc:initialize-database>
谢谢你的回答和文章。不幸的是,它不是语句中的分号:
<jdbc:initialize-database>
<jdbc:script location="classpath:myscript.sql" separator="|"/>
</jdbc:initialize-database>