0

SpringJdbcPreparedステートメントを使用してレコードをテーブルに挿入しようとしています。このコードは、PostgresとOracleで実行する必要があります。挿入後、挿入したレコードキーを読み取る必要があります。

SpringドキュメントのJDBCの章で以下のコードを見つけましたが、「これはOracleで動作します」と書かれています。
こちらのリンクを参照してください(セクション12.2.8)。

これはPostgresでうまく機能し、レコードを挿入し、挿入されたレコードキーをkeyHolderで読み取ることができます。ただし、Oracleでは、以下のエラーメッセージで失敗します...

[junit] STDOUT [ERROR] [2011.11.0401:26:04].....-テスト......失敗しました。[junit]メッセージ:PreparedStatementCallback; SQL []; ORA-01400:("SOME_USER"。"SOME_TABLE"。"ID")[junit]にNULLを挿入できません。ネストされた例外はjava.sql.SQLIntegrityConstraintViolationExceptionです:ORA-01400:NULLを("SOME_USER"。"SOME_TABLE"。"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(Oracle jdbc jar)、commonsdbcpjarを使用しています

これがapplicationContextdataSourceBeanです

<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_table_id_seq。このコードをPostgres(開発マシンで実行)とOracle(本番で実行)で機能させる必要があります。どんな助け/アイデアもありがたいです。ありがとうございました。

4

1 に答える 1

2

Postgres と Oracle のテーブル定義 (DDL) は示されていませんが、ID 列はserialPostgres のように定義されているため、その列にリンクされているシーケンスから新しい 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;
/
于 2011-11-05T08:18:58.233 に答える