0

概要:Oracleビューから行を読み取り、Notesドキュメントを作成し、ドキュメントを保存してから、ドキュメントの一意のIDをOracleに書き戻す必要があります。

接続とデータの読み取りに問題はありません。Oracle11データベースに接続するタイプ4接続を使用しています。Oracleビューは、更新を許可するように設定されています。ビューには、ここで概説されているものは何もありません。Oracleでは、ビューを介してレコードをINSERTまたはUPDATEすることは可能ですか?

*同じユーザー名とパスワードを使用して、SQLステートメントを入力することでビューを正常に更新できます。

* conn.setAutoCommit(false);を使用してみました これは効果がありませんでした。

*結果セットが更新可能であることを確認しました(1008)

*ユーザーには(一時的に)完全なDBAアクセス権が付与されています

*createStatementメソッドの最初のパラメーターの可能なすべての組み合わせを試しました

...
Statement statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.executeQuery(fetch);
...
String UNID = doc.getUniversalID(); //gets unique id from saved Notes Document  
System.out.println("This is what to write to Oracle:" + UNID);
System.out.println("is updatable=1008, not updatable=1007 value is:" + rs.getConcurrency());
System.out.println("is Result Set Closed:" + rs.isClosed());

rs.updateString("NOTES_DOC_ID", UNID);
System.out.println("got past updating NOTES_DOC_ID column");
rs.updateRow();  //fails here

コンソールからのエラーは次のとおりです。

これは、Oracleに書き込む内容です:BF8091259610C61B87257B16005C14FB

はupdatable=1008であり、updatable=1007ではありません。値は1008です。

結果セットが閉じています:false

NOTES_DOC_ID列の更新を過ぎました

java.security.AccessControlException:アクセスが拒否されました(java.lang.RuntimePermission exitVM.0)

ユーザーにDBAアクセス権を要求する前に、

java.sql.SQLSyntaxErrorException:ORA-01031:権限が不十分です

これは大きな手がかりだと思います。私のDBAは、私にさらにどのようなアクセス権を与えるべきかを知りません。

DBAは、refカーソルの使用を開始することを望んでいますが、これは問題ありませんが、JDBCアクセスに何らかのセキュリティ設定があり、私をつまずかせているのではないかと思います。最初にそれを調べたいと思います。セキュリティ上の問題がある場合は、行の読み取り方法を変更しても違いはないと思います。これを行う方法に関するすべてのドキュメントのほとんどは、オラクルのWebサイトおよびこのサイトから入手したものです。

4

1 に答える 1

0

私の質問に答えて、この障害をどのように乗り越えたかを説明します。結局、私は基本的に「a_horse_with_no_name」が提案したことをしました。

resultSetカーソルまたはrefカーソルを使用して更新を実行する代わりに、プレーンなUPDATEステートメントを使用することができました。これが可能だったのは、DBAに一意の識別子の列を作成するように説得できたからです。resultSetのupdateRow()メソッドによって引き起こされる例外を回避することはできませんでした。彼が一意の識別子を追加する前は、UPDATEステートメントを確実に使用するためのキーがありませんでした。

updateSQLがupdateSQLステートメントを保持する文字列であるコードは次のとおりです。

updateResultInt = updateStatement.executeUpdate(updateSQL);

成功した場合は1を返します。

注意点として、TOraやsql plusなどのツールを使用して更新ステートメントを確認する場合は、手動でコミットすることを忘れないでください。そうしないと、Javaエージェントを実行しようとしたときにハングします。これは、その問題を解決するのに役立つ参考資料です 。SQLUpdateがJavaプログラムをハングさせる

コメントしてくれた人に感謝します!

于 2013-02-19T23:53:50.753 に答える