SelectStmt
手順 7. 変更内容の検証
レ コー ド を 1 つだけ取 り 出す場合のサンプルを以下に示し ます。 こ の方法は、 1 レ コー ド の変更内容を検証するには、 効率的な方法です。 こ のサンプルでは、
query-by-example
(
QBE)
の句を使用し て TableDataSetか ら関心のあ る レ コー ド だけを取 り 出し てい ます。TableDataSet tds2 = new TableDataSet(conn, "empdemo");
tds2.where("empno = 8000") .fetchRecords();
最後の手順 と し て、 各手順の後、 および各 save() メ ソ ッ ド の後に作成し た
「insert」、 「update」、 および 「delete」 の各文字列の後に ク エ リ 結果を表示で き ます。 結果を表示する htmlKona の使用方法については、 前のチュー ト リ アル の 「コー ド のま と め」 を参照し て く だ さ い。
DataSetの操作を終了し た ら、 次の よ う に close() メ ソ ッ ド を使用し て各
DataSet を閉じ ます。
tds.close();
tds2.close();
コー ド のま とめ
次に、 こ の節で説明し た概念を使用する サンプル コー ド を示し ます。
package tutorial.dbkona;
import weblogic.db.jdbc.*;
import java.sql.*;
dbKona
の実装import java.Properties;
public class rowid {
public static void main(String[] argv) throws Exception
{
Driver myDriver = (Driver)
Class.forName("weblogic.jdbc.oci.Driver").newInstance();
conn =
myDriver.connect("jdbc:weblogic:oracle:DEMO", "scott",
"tiger");
// ここで、レコードを 100 個挿入する
TableDataSet ts1 = new TableDataSet(conn, "empdemo");
for (int i = 1; i <= 100; i++) { Record rec = ts1.addRecord();
rec.setValue("empid", i)
.setValue("name", "Person " + i) .setValue("dept", i);
}
// 新しいレコードを保存する。dbKona は選択的に保存を行う // つまり、TableDataSet 内の変更されたレコードだけを保存し、
// ネットワーク トラフィックとサーバ呼び出しを削減する
System.out.println("Inserting " + ts1.size() + " records.");
ts1.save();
// 処理が完了したので DataSet を閉じる ts1.close();
// 更新および削除用の KeyDef を定義する
// ROWID は Oracle 固有のフィールドで、更新および削除用の // 主キーとして機能することができる
KeyDef key = new KeyDef().addAttrib("ROWID");
// 最初に追加した 100 個のレコードを更新する TableDataSet ts2 =
new TableDataSet(conn, "empdemo", "ROWID, dept", key);
ts2.where("empid <= 100");
ts2.fetchRecords();
for (int i = 1; i <= ts2.size(); i++) { Record rec = ts2.getRecord(i);
rec.setValue("dept", i + rec.getValue("dept").asInt());
}
// 更新されたレコードを保存する
System.out.println("Update " + ts2.size() + " records.");
ts2.save();
// 同じ 100 個のレコードを削除する ts2.reset();
ts2.fetchRecords();
for (int i = 0; i < ts2.size(); i++) { Record rec = ts2.getRecord(i);
rec.markToBeDeleted();
}
// レコードをサーバから削除する
System.out.println("Delete " + ts2.size() + " records.");
ts2.save();
// DataSet、ResultSet、および Statement は、
// 操作が終わったら必ず閉じる必要がある ts2.close();
// 最後に、必ず接続を閉じる conn.close();
} }
dbKona での JDBC PreparedStatement の使い方
dbKona
では構文的に正し い SQL 文が作成 さ れる ため、 ベンダ固有の SQL の記述方法について知識がそれほど必要ない と い う 点で便利です。 し か し、 dbKona で JDBC の PreparedStatementを使用で き る場合も あ り ます。
JDBC
PreparedStatementは、 複数回使用 さ れる SQL 構文を あ ら か じ めコ ンパ イルする場合に使用さ れます。PreparedStatementのパ ラ メ ータは、PreparedStatement.clearParameters()を呼び出すこ と で消去で き ます。
PreparedStatmentオブジ ェ ク ト は、 JDBC Connectionク ラ ス ( こ れまでのサ ンプルで conn と い う 名前で使用 さ れていたオブジ ェ ク ト ) の
preparedStatement()メ ソ ッ ド を使用し て作成さ れます。 次のサンプルでは、
PreparedStatementを作成し てそれをループの中で実行 し ています。 こ の文に は、 従業員 ID、 名前、 および部署 と い う 3 つの入力 (IN) パ ラ メ ータ があ り ます。
こ のサンプルでは、 100 人の従業員を テーブルに追加し ます。
String inssql = "insert into empdemo(empid, " + "name, dept) values (?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(inssql);
for (int i = 1; i <= 100; i++) { pstmt.setInt(1, i);
pstmt.setString(2, "Person " + i);
pstmt.setInt(3, i);
pstmt.executeUpdate();
}
dbKona
の実装pstmt.close();
作業が終了し た ら、Statementオブジ ェ ク ト ま たは PreparedStatementオブ ジ ェ ク ト を必ず閉じ ます。
SQL
を意識せずに同じ タ ス ク を dbKona で実行する こ と も でき ます。 こ の場合、KeyDefを使用し て、 更新ま たは削除する フ ィ ール ド を設定し ます。 詳細につい ては、 チュー ト リ アルの6-34 ページの 「KeyDef を使用し た DBMS データの変 更」 を参照し て く だ さ い。
dbKona でのス ト ア ド プロシージ ャの使い方
固有の タ ス ク ( シ ス テム ま たはベンダに依存し ない タ ス ク であ る場合が多い ) を 実行で き る、 リ モー ト マシンに格納さ れたプ ロ シージ ャや関数にア ク セス し て、
dbKona の能力を向上さ せる こ と ができ ます。 ス ト ア ド プ ロ シージ ャおよび関数
を使用する には、 dbKona の Java アプ リ ケーシ ョ ン と リ モー ト マシンの間で リ ク エス ト がどの よ う に受け渡し さ れ るかを理解する必要があ り ます。 ス ト ア ド プ ロ シージ ャ ま たは関数を実行する と 、 入力 さ れたパ ラ メ ータ の値が変更さ れま す。 ま た、 実行が成功し たか失敗し たかを示す値も返 さ れます。dbKona
アプ リ ケーシ ョ ンでの最初の手順は、 DBMS に接続する こ と です。 こ こで示すサンプルでは、 最初のチュー ト リ アルで作成し た同じ Connectionオブ ジ ェ ク ト connを使用し ます。