4

この質問で述べた方法を使用して、PHPmysql_insert_id()関数やMySQL関数のようなJSPで最後に生成された自動インクリメントIDを取得しようとしています(ただし、Oracle 10gを使用しています)。last_insert_id()getGeneratedKeys()

TRANSPORTEROracleデータベースに、Javaの型にマップされたtypeという名前TRANSPORTER_IDの列があり、シーケンスで生成された主キーであるテーブルがあります。NUMBER(35, 0)BigDecimal

Connection con;
ResultSet rs;
PreparedStatement ps;
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "root";
String pwd = "root";

Class.forName("oracle.jdbc.OracleDriver").newInstance();
con = DriverManager.getConnection(url, user, pwd);

ps = con.prepareStatement("INSERT INTO transporter(transporter_name, transporter_website)VALUES(?, ?)");
ps.setString(1, "New");
ps.setString(2, "New Website");
ps.executeUpdate();

BigDecimal id = new BigDecimal(0);
rs = ps.getGeneratedKeys();

while (rs.next()) {
    id = rs.getBigDecimal("transporter_id");
}

out.println("The generated id is : " + id);

rs = ps.getGeneratedKeys();挿入操作が実行された後、コードは前のwhileループの上でこのメソッドを呼び出そうとしますが、次の例外で失敗します。

javax.servlet.ServletException:java.sql.SQLException:操作は許可されていません

私はで試しましたが、Oracle JDBC Driver version - 10.2.0.5.0失敗したときは、より高いバージョンをダウンロードしました11.2.0.3.0が、役に立ちませんでした。理由は何でしょうか?

4

2 に答える 2

5

これに関するいくつかのドキュメントを見つけました。11gの場合ですが、10gの場合は状況が良くない可能性があります。

エラーの根本的な原因は、おそらく次のような制限です。

getGeneratedKeysメソッドから返されたResultSetオブジェクトに位置のみでアクセスする必要があります

Oracleドライバでは、キー列だけでなくキー列を取得するために、キー列を識別する必要があるようですROWID。このためのサンプルコードは、リンクされたドキュメントに含まれています。

于 2012-11-08T19:57:49.070 に答える
0

ps = con.prepareStatement( "INSERT INTOtransporter(transporter_name、transporter_website)VALUES(?,?)"、new String [] {"transporter_id"});

于 2020-04-20T18:21:35.483 に答える