gpt4 book ai didi

java - 使用瘦 jdbc 驱动程序创建 oracle 数据库触发器

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:37 36 4
gpt4 key购买 nike

目前我正在为应用程序设置测试环境。我在我的测试环境中使用 jUnit 和 Spring。在执行测试之前,我想设置一个数据库测试环境状态。我已经编写了 SQL 脚本(架构和数据),它们在 Oracles SQLDeveloper 中运行良好。当我尝试使用 oracle 瘦 jdbc 驱动程序执行它们时,执行失败。看起来瘦驱动程序不喜欢创建触发器语句。

我读到我必须使用 oci 驱动程序而不是瘦驱动程序。 oci 驱动程序的问题在于它不是平台独立的,并且需要时间来设置它。

我的代码示例:

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"... "USER"... BEGIN ... FROM DUAL;) 被执行成功,但如果我尝试使用它,触发器似乎已损坏。执行失败错误伴随语句 END 的第二部分; “ORA-00900:无效的 SQL 语句”。

有人知道这个问题的解决方案吗?我只想使用平台独立的瘦 jdbc 驱动程序创建触发器。

干杯!

凯文

最佳答案

谢谢大家的回答,现在可以正常使用了。原因是语法错误或使用 Spring Framefork 解释我的 SQL 代码文件。当我使用 jdbc 的 execute 方法直接执行语句时它起作用,当我使用 Spring 功能执行脚本时执行失败。使用 oracle sql 代码似乎很棘手,因为如果我使用 hsqldb sql 代码,它工作正常。

测试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>
...

架构.sql:

DROP SEQUENCE SEQ_USER;
DROP TABLE "USER" CASCADE CONSTRAINTS;
PURGE TABLE "USER";
CREATE TABLE "USER"
(
USER_ID NUMBER(10) NOT NULL,
CREATOR_USER_FK NUMBER(10) NOT NULL,
PRIMARY KEY (USER_ID)
);
ALTER TABLE "USER" ADD CONSTRAINT FK_USER_CUSER FOREIGN KEY (CREATOR_USER_FK) REFERENCES "USER" (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
WHEN (new.USER_ID IS NULL)
BEGIN
SELECT SEQ_USER.nextval
INTO :new.USER_ID
FROM DUAL;
END;
/
ALTER TRIGGER "USER_ID_SEQ_INC" ENABLE;

这很好用!删除语句末尾的 ; 很重要,除了 trigger 语句!!!

@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);
}
}

关于java - 使用瘦 jdbc 驱动程序创建 oracle 数据库触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107028/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com