ダイレクト検索を使用したレコードIDによるデータ削除または更新処理について説明します。
まず、ダイレクト検索APIを発行して、対象データのレコードIDとデータ全体を取得します。
次に、取得したレコードID情報を使用して、対象データの削除または更新を実行します。
処理の流れ
ダイレクト検索とレコードID削除・更新の流れについて以下の図に示します。
図6.15 ダイレクト検索を使用したデータ削除/更新の流れ

データ操作の効果
通常のレコードIDによるデータ操作と比較して、ダイレクト検索を使用したデータ操作の効果について、以下に示します。
図6.16 図:ダイレクト検索を使用したデータ操作の効果

通常のレコードIDを取得の検索処理がダイレクト検索に代わることで、searcherへのアクセスが不要になり、高速な処理が実現できます。
以下に、Java API、.NET API、C APIの記述例を示します。
Java APIの場合
ダイレクト検索を使用してデータ削除を行う場合の記述例
| ShunConnection con = new ShunConnection();
ShunPreparedKey preSkey = con.prepareSearchKey("key1", "/");
preSkey.add("20061101,00000001");
ShunResultSet rs = preSkey.searchByKey();
ShunPreparedRecordID prid = con.prepareDeleteRecordID();
while (rs.next()) {
  prid.add(rs.getRecordID());
}
prid.deleteByRecordID();
prid.close();
rs.close();
preSkey.close();
con.close(); | 
ダイレクト検索を使用してデータ更新を行う場合の記述例
| ShunConnection con = new ShunConnection();
ShunPreparedKey preSkey = con.prepareSearchKey("key1", "/");
preSkey.add("20061101,00000001");
ShunResultSet rs = preSkey.searchByKey();
ShunPreparedRecordID prid = con.prepareUpdateRecordID();
while (rs.next()) {
  prid.add(rs.getRecordID(), updateData);
}
prid.updateByRecordID();
prid.close();
rs.close();
preSkey.close();
con.close(); | 
.NET APIの場合
ダイレクト検索を使用してデータ削除を行う場合の記述例
| ShunService service = new ShunService();
service.Connect();
ShunRecord searchRecord = new ShunRecord();
searchRecord.Key = "20061101,00000001";
ShunKeyRequirement keyReq = new ShunKeyRequirement();
keyReq.KeyName = "key1";
keyReq.SearchType = ShunKeySearchType.CompleteMatch;
keyReq.Records.Add( searchRecord );
ShunResultSet rs = service.SearchByKey( keyReq, "/" );
ShunRecordCollection deleteRecords = new ShunRecordCollection();
foreach ( ShunRecord record in rs.Records ) {
  deleteRecords.Add( record );
}
service.Delete( deleteRecords );
service.Disconnect(); | 
ダイレクト検索を使用してデータ更新を行う場合の記述例
| ShunService service = new ShunService();
service.Connect();
ShunRecord searchRecord = new ShunRecord();
searchRecord.Key = "20061101,00000001";
ShunKeyRequirement keyReq = new ShunKeyRequirement();
keyReq.KeyName = "key1";
keyReq.SearchType = ShunKeySearchType.CompleteMatch;
keyReq.Records.Add( searchRecord );
ShunResultSet rs = service.SearchByKey( keyReq, "/" );
ShunRecordCollection updateRecords = new ShunRecordCollection();
foreach ( ShunRecord record in rs.Records ) {
  record.Data = updateData;
  updateRecords.Add( record );
}
service.Update( updateRecords );
service.Disconnect(); | 
C APIの場合
ダイレクト検索を使用してデータ削除を行う場合の記述例
| /* 以下のように用意されていることを仮定しています           */
/* pKey       :ダイレクトアクセスキーを設定する構造体配列  */
SHUNHSTMT StmtH_Search;
SHUNHSTMT StmtH_Delete;
/* データ操作ハンドルの割当て */
ShunAllocHandle( ConH, &StmtH_Search );
ShunAllocHandle( ConH, &StmtH_Delete );
/* ダイレクトアクセスキーによる検索を実行 */
pKey[0].Key = "20061101,00000001";
pKey[0].Key_Len = strlen( pKey[0].Key );
ShunSearchKey( StmtH_Search, "key1", SHUN_KEY_COMPLETE_MATCH, 1, pKey, "/",
               &Return_Cnt, &Rec_Id_Out, &Data, &Key_Out );
/* レコードIDによる削除を実行 */
if ( Return_Cnt > 0 ) {
  ShunDeleteRecId( StmtH_Delete, Return_Cnt, Rec_Id_Out);
}
/* データ操作ハンドルの解放 */
ShunFreeHandle( StmtH_Search );
ShunFreeHandle( StmtH_Delete ); | 
ダイレクト検索を使用してデータ更新を行う場合の記述例
| /*以下のように用意されていることを仮定しています           */
/* pKey       :ダイレクトアクセスキーを設定する構造体配列 */
SHUNHSTMT StmtH_Search;
SHUNHSTMT StmtH_Update;
/* データ操作ハンドルの割当て */
ShunAllocHandle( ConH, &StmtH_Search );
ShunAllocHandle( ConH, &StmtH_Update );
/* ダイレクトアクセスキーによる検索を実行 */
pKey[0].Key = "20061101,00000001";
pKey[0].Key_Len = strlen( pKey[0].Key );
ShunSearchKey( StmtH_Update, "key1", SHUN_KEY_COMPLETE_MATCH, 1, pKey, "/",
               &Return_Cnt, &Rec_Id_Out, &Data, &Key_Out);
/* レコードIDによる更新を実行 */
if ( Return_Cnt > 0 ) {
  ShunUpdateRecId( StmtH_Update, Return_Cnt, Rec_Id_Out, updateData );
}
/* データ操作ハンドルの解放 */
ShunFreeHandle( StmtH_Search );
ShunFreeHandle( StmtH_Update ); |