Java 使用精简jdbc驱动程序创建oracle db触发器

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"

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

我读到我必须使用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。。。使用者开始来自双重;已成功执行,但如果我尝试使用它,触发器似乎已损坏。执行失败错误与语句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>