2011-11-05 133 views
0

我想用Spring Jdbc Prepared语句将记录插入表中。此代码必须在Postgres和Oracle上运行。插入后我需要读取插入的记录密钥。用PreparedStatementCreator插入记录(必须在Oracle和PostgreSQL上运行)

我在Spring文档JDBC章节中找到了下面的代码,它说“这适用于Oracle”。
See link here(12.2.8节)。

它很好地适用于Postgres,插入记录,我可以读取与keyHolder插入的记录密钥。然而,在Oracle上它失败,出现以下错误消息...

[junit] STDOUT [错误] [2011.11.04 01:26:04] ..... - 测试......失败。 [junit]消息:PreparedStatementCallback; SQL []; ORA-01400:不能将NULL插入(“SOME_USER”。“SOME_TABLE”。“ID”) [junit];嵌套异常是java.sql.SQLIntegrityConstraintViolationException:ORA-01400:(。 “SOME_USER” “SOME_TABLE”, “ID”)不能插入NULL插入

下面是代码...

 KeyHolder keyHolder = new GeneratedKeyHolder(); 
    jdbcTemplate.update(new PreparedStatementCreator() 
    { 
     public PreparedStatement createPreparedStatement(Connection connection) throws SQLException 
     { 
      PreparedStatement ps = connection.prepareStatement("insert into some_table(xxx_name,xxx_date), new String[] { "id" }); 
      ps.setString(1, "some name"); 
      ps.setDate(2, "some date"); 
      return ps; 
     } 
    }, keyHolder); 

注:我使用ojdbc6.jar(甲骨文JDBC JAR),公共DBCP罐子

这里的applicationContext数据源豆

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${db.driver}" /> 
    <property name="url" value="${db.url}" /> 
    <property name="username" value="${db.username}" /> 
    <property name="password" value="${db.password}" /> 
</bean> 

我在表格some_table_id_seq上有Postgres和Oracle的序列。我必须使此代码适用于Postgres(在开发者机器上运行)和Oracle(在生产上运行)。任何帮助/想法表示赞赏。谢谢。

+0

有[没有“Postgre”](http://wiki.postgresql.org/wiki/Identity_Guidelines)。它是* PostgreSQL *或* Postgres *简称。 –

回答

1

您没有示出我们的表定义(DDL)为Postgres的和Oracle,但我想的ID列被定义为在Postgres的serial并因此新的ID自动地从链接到该列

序列检索

Oracle没有这样的概念。如果您不想手动调用sequence.nextval(也可以使用Postgres),您必须创建一个触发器,为该列指定下一个序列值。

CREATE OR REPLACE TRIGGER trg_ins_some_table 
    BEFORE INSERT ON some_table 
    FOR EACH ROW 
BEGIN 
    :new.id := some_table_id_seq.nextval; 
END; 
/
+0

虽然我最终实现了自己的解决方案,但我将您的答案作为接受的答案。 – aug70co

+0

我放弃了试图对两个数据库使用相同的查询,所以我实现了一个带有特殊键名和查询的映射,对于Postgres它选择了不同的插入查询,对于Oracle它使用xxx_id_seq.nextval有不同的查询。 – aug70co