Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PreparedStatementCreator插入记录(必须在Oracle和PostgreSQL上运行)_Oracle_Postgresql_Prepared Statement_Spring Jdbc - Fatal编程技术网

使用PreparedStatementCreator插入记录(必须在Oracle和PostgreSQL上运行)

使用PreparedStatementCreator插入记录(必须在Oracle和PostgreSQL上运行),oracle,postgresql,prepared-statement,spring-jdbc,Oracle,Postgresql,Prepared Statement,Spring Jdbc,我正在尝试使用SpringJDBCPrepared语句将记录插入表中。此代码必须在Postgres和Oracle上运行。插入后,我需要读取插入的记录键 我在Spring文档JDBC一章中找到了下面的代码,上面写着“这适用于Oracle”。 (第12.2.8节) 它在Postgres上很好地工作,插入记录,我可以用键盘夹读取插入的记录键。但是,在Oracle上,它会失败,并显示以下错误消息 [junit]STDOUT[ERROR][2011.11.04 01:26:04]…-测试。。。。。。失败。

我正在尝试使用SpringJDBCPrepared语句将记录插入表中。此代码必须在Postgres和Oracle上运行。插入后,我需要读取插入的记录键

我在Spring文档JDBC一章中找到了下面的代码,上面写着“这适用于Oracle”。
(第12.2.8节)

它在Postgres上很好地工作,插入记录,我可以用键盘夹读取插入的记录键。但是,在Oracle上,它会失败,并显示以下错误消息

[junit]STDOUT[ERROR][2011.11.04 01:26:04]…-测试。。。。。。失败。 [junit]消息:PreparedStatementCallback;SQL[];ORA-01400:无法将NULL插入(“某些用户”“某些表格”“ID”) [少年];嵌套异常为java.sql.SQLIntegrityConstraintViolationException:ORA-01400:无法将NULL插入(“某些用户”“某些表格”“ID”)

这是代码

        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(OracleJDBCJAR)、CommonsDBCPJAR

下面是applicationContext数据源bean

<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>


我在Postgres和Oracle上都有序列,用于表
some\u table\u id\u seq
。我必须使这段代码适用于Postgres(在devs机器上运行)和Oracle(在生产环境中运行)。感谢您的帮助/想法。谢谢。

您没有向我们展示Postgres和Oracle的表定义(DDL),但我猜ID列在Postgres中定义为
serial
,因此会自动从链接到该列的序列中检索新ID

甲骨文没有这样的概念。如果不想手动调用
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;
/

有。它是PostgreSQL或简称Postgres。虽然我最终实现了自己的解决方案,但我认为您的答案是公认的答案。我放弃了对两个数据库使用相同的查询,因此我实现了一个带有特殊键名和查询的映射,对于Postgres,它选择不同的插入查询;对于Oracle,它使用xxx_id_seq.nextval进行不同的查询。