db連携について にしやま 2017年06月28日 02:41 フォローする dataspiderを始めたばかりの初心者です。 csvを読み取り、読み取ったcsv以外のデータをoracle database上のテーブルから削除するというものを作りたいのですが、読み取ったもの以外を削除する部分がうまくいかず困っております。 よろしければ解決策をご教示願いたいです。 よろしくお願いいたします。
メディアフォースの齊藤です。
CSVにOracleのレコードデータがすべてある場合はOracleのテーブルを全件DELETEしてから、CSVをINSERTで良いと思います。
恐らくはCSVにキーだけ(値なし)だと思いますので、何パターンか挙げてみます。
・ CSVを読み取って、テーブルのレコードにフラグをたて、CSV読み取り終わったらフラグのたっていないレコードを削除。処理前または処理完了後にフラグをクリア
- この方法はレコードにフラグを立てるためのカラムがあることが前提になりますが実装難易度は優しいですし、パフォーマンスも悪くないです。
・一時テーブルを作って残したいレコードを一時テーブルに移しておき、元のテーブルを全件DELETEしてから一時テーブルのレコードを戻す
- 一時的に二重にレコードが存在することになります。一時テーブルの管理も必要になるので実装は少々煩雑になりますが、トランザクションやREDOログから元のテーブルは復元できますので安全です。
・「繰り返し処理」を使ってキーを変数に連結し、where not inでdeleteする。
- スクリプトが複雑になりますし、(DB設計等によると思いますが)not in句はパフォーマンスが遅かったりします。
パッと思いついたのは上の3つになりますがご参考までに m(__)m
> ・ CSVを読み取って、テーブルのレコードにフラグをたて、CSV読み取り終わったらフラグのたっていないレコードを削除。処理前または処理完了後にフラグをクリア
このパターンを簡単に実装してみました。
http://mf-sol-eai.hatenablog.com/entry/2017/06/29/123851
ご参考になれば。
さいとう様
3通り試してみます!
解説頂いたURLも拝見し、参考にさせていただきました。
ご教示ありがとうございました。