2011-12-21 13 views
0

Javaを使用してOracle 11gにレコードを挿入しようとしています。私はまだJavaを学んでいます。Javaを使用したスト​​アドプロシージャによるOracle JDBCの挿入

レコードを挿入するためにストアドプロシージャを呼び出す必要があります。ユーザーテーブルの私の主キーはuser_idです。私もuser_idで2をインクリメントしたシーケンスを持っています

入力パラメータをJavaで設定していますが、user_idに渡す必要があるのは何ですか?また、どのような日付のparamの場合のタイプのようになります。

Users:user_id number (primary key), email varchar, created_date Date 

私は、Javaコードの下にきた:

 Class.forName("oracle.jdbc.OracleDriver");   
     Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@101.12.11.11:1521:demo", "demo_app", "demo"); 

     CallableStatement cs = conn.prepareCall("{exec demo.my_pkg.insert_users(?,?,?)}"); 
     cs.registerOutParameter(1, Types.INTEGER); 
     cs.setInt(1, ?????); 

     cs.execute(); 

は、私がここにuser_idを設定する必要がありますか?はいの場合、そのシーケンス以来、私は何を設定すべきですか? 日付フィールド&のメールフィールドはどうですか?

ここでregisterOutParameterが必要ですか?もしそうなら、なぜですか?

最後に、挿入が成功したという確認はどうすれば得られますか?

ありがとうございます!

答えて

0
  1. ここでuser_idを設定する必要はありますか? RE:あなたはそれを設定する前に、シーケンス値を取得することができます:

    を選択sequence_name.nextvalデュアル

    から
  2. を私はここのregisterOutParameterは必要ですか?もしそうなら、なぜですか? RE:戻り値を取得する場合は、OutParameterを登録できます.OutParameterを登録しない場合は、忘れてしまいます。

  3. 挿入が成功したという確認はどうすればわかりますか? RE:出力パラメータまたはプロシージャの戻り値から結果を得ることができます

+0

シーケンスを直接CallableStatementとして渡すことはできますか?cs = conn.prepareCall( "{exec demo.my_pkg.insert_users(seq_users.nextval、?、?)}"); – Mike

+0

@Mike答えはいいえ。私は数分前に試しました。 :( – xuanyuanzhiyuan

0

ストアドプロシージャでuser_idのトリガ/計算がない場合は、Javaコードからuser_idを渡す必要があります(Javaの次のシーケンス値を取得してストアド関数に渡す必要があります)。 関数が値を返す場合は、パラメータを登録する必要があります。 確認は実装によって異なります。たとえば、関数がユーザーの挿入されたかどうかを返す場合は、戻り値をチェックするだけです。

+0

シーケンスのトリガーがあればどうなりますか? paramで渡す必要があるのは何ですか? – Mike

+1

この場合、user_idはデータベース内で生成され、javaから渡すべきではありません。そして、あなたはトリガを持っている場合、なぜあなたはストアドプロシージャのuser_idパラメータを持っていますか? – dbf

0

ここでregisterOutParameterが必要ですか?もしそうなら、なぜですか?

はい、あなたのストアドプロシージャは、任意の値を返す場合、日付フィールドはタイプとしてjava.sql.Dateクラスを使用する設定の場合(すなわち、それは機能です)

のregisterOutParameterする必要があります。

関連する問題