db連携について

Avatar
にしやま

dataspiderを始めたばかりの初心者です。

csvを読み取り、読み取ったcsv以外のデータをoracle database上のテーブルから削除するというものを作りたいのですが、読み取ったもの以外を削除する部分がうまくいかず困っております。

よろしければ解決策をご教示願いたいです。

よろしくお願いいたします。

この記事は役に立ちましたか?

0が役に立ったといっています

コメント

  • Avatar
    さいとう

    メディアフォースの齊藤です。

     

    CSVにOracleのレコードデータがすべてある場合はOracleのテーブルを全件DELETEしてから、CSVをINSERTで良いと思います。

    恐らくはCSVにキーだけ(値なし)だと思いますので、何パターンか挙げてみます。

    ・ CSVを読み取って、テーブルのレコードにフラグをたて、CSV読み取り終わったらフラグのたっていないレコードを削除。処理前または処理完了後にフラグをクリア

     - この方法はレコードにフラグを立てるためのカラムがあることが前提になりますが実装難易度は優しいですし、パフォーマンスも悪くないです。

    ・一時テーブルを作って残したいレコードを一時テーブルに移しておき、元のテーブルを全件DELETEしてから一時テーブルのレコードを戻す

    - 一時的に二重にレコードが存在することになります。一時テーブルの管理も必要になるので実装は少々煩雑になりますが、トランザクションやREDOログから元のテーブルは復元できますので安全です。

    ・「繰り返し処理」を使ってキーを変数に連結し、where not inでdeleteする。

     - スクリプトが複雑になりますし、(DB設計等によると思いますが)not in句はパフォーマンスが遅かったりします。

     

    パッと思いついたのは上の3つになりますがご参考までに m(__)m

    0
  • Avatar
    さいとう

     > ・ CSVを読み取って、テーブルのレコードにフラグをたて、CSV読み取り終わったらフラグのたっていないレコードを削除。処理前または処理完了後にフラグをクリア

    このパターンを簡単に実装してみました。

    http://mf-sol-eai.hatenablog.com/entry/2017/06/29/123851

    ご参考になれば。

     

    0
  • Avatar
    にしやま

    さいとう様

    3通り試してみます!

    解説頂いたURLも拝見し、参考にさせていただきました。

    ご教示ありがとうございました。

    0

ログインにログインしてコメントを残してください。