タブ区切りのtsvファイルの1項目目に並んでいるデータをDBのプライマリーキーとみなして、DB上に既にあればupdate、なければinsertします。
下のPGは、DBに30万件のデータが入った状態で実行すると、遅すぎて使えません。もっと速くすることはできませんでしょうか。
Public Const OraSQL_01 = "INSERT INTO CUSTOMER (COMPANY_CODE, TEST1) Values (:データ0, :データ1)"
Public Const OraSQL_02 = "UPDATE CUSTOMER SET COMPANY_CODE = :データ0, TEST1 = :データ1 WHERE COMPANY_CODE = :データ0"
wkFile1 = "c:\test\test.csv"
Open wkFile1 For Input As #1
OraSession.BeginTrans
Set rs = OraDatabase.CreateDynaset("SELECT COMPANY_CODE FROM CUSTOMER", ORADYN_DEFAULT)
OraDatabase.Parameters.Add "データ0", 0, ORAPARM_INPUT
OraDatabase.Parameters("データ0").ServerType = ORATYPE_NUMBER
OraDatabase.Parameters.Add "データ1", 0, ORAPARM_INPUT
OraDatabase.Parameters("データ1").ServerType = ORATYPE_VARCHAR2
Do Until EOF(1)
Line Input #1, Text
sec = Split(Text, vbTab)
OraDatabase.Parameters("データ0").Value = sec(0)
OraDatabase.Parameters("データ1").Value = sec(1)
Dim flg As Boolean
Do Until rs.EOF
flg = False
If rs("COMPANY_CODE") = sec(0) Then
OraDatabase.ExecuteSQL OraSQL_02
flg = True
Exit Do
Else
rs.MoveNext
End If
Loop
If flg = False Then
OraDatabase.ExecuteSQL OraSQL_01
End If
rs.MoveFirst
Loop
OraSession.CommitTrans
No.1ベストアンサー
- 回答日時:
ざっと眺めただけだが確かに遅すぎて使えそうにないな。
アプローチ1.tsvから1行読み込んだら、1列目(顧客コード)をキーにselectして引っかかればupdate、引っかからなければinsertを実行するように変更する。
これはあれなのかな? ひょっとしたらtsvに同じ顧客コードが2行以上あった時に、毎回selectするとエラーが発生せずに1回目に出てきたの餡餅商事はinsert→2回目以降に出てきた餡餅商事はupdateでエラーが発生せずに終わってしまうからダメなのかな? それならこのアプローチを取らなかった理由は分かる。
アプローチ2.顧客コード一覧をダイナセットで取る時に顧客コードを昇順でソートし、バイナリサーチを使うように変更する。
これは説明の必要もないだろう。シーケンシャルサーチはありえんだろう。30万行やし。
この回答への補足
anmochiさんご回答有難うございます。
恐縮ですが、アプローチ1をとる場合の書き方がわかりません。
1列目をキーにSELECTしてダイナセットで取るには
Set rs = OraDatabase.CreateDynaset("SELECT COMPANY_CODE FROM CUSTOMER WHERE COMPANY_CODE = :データ0", ORADYN_DEFAULT)
でよいかと思いますが、ひっかかっる、ひっかからないのコードはどのように記述すれば宜しいのでしょうか、わかれば教えて頂けませんでしょうか。
宜しくお願いします。
コードの記述方法がわかりました。
Set rs = OraDatabase.CreateDynaset("SELECT COMPANY_CODE FROM CUSTOMER WHERE COMPANY_CODE = :データ0", ORADYN_DEFAULT)
If rs("COMPANY_CODE") = sec2(0) Then
OraDatabase.ExecuteSQL OraSQL_02
Else
OraDatabase.ExecuteSQL OraSQL_01
End If
でできました。
有難うございました。
No.4
- 回答日時:
こんな手も。
1.空のテンポラリの表を作成。主キーもつけておく。
2.テキストファイルの内容をテンポラリ表にSQL*Loaderでロード
3.更新対象のデータをCUSTOMERから削除
delete from CUSTOMER where COMPANY_CODE in (select COMPANY_CODE from テンポラリ表);
4.テンポラリ表の内容をCUSTOMERに追加
insert into CUSTOMER select * from テンポラリ表;
5.テンポラリ表の削除。
#CUSTOMERテーブルの行数だけではなく、テキストファイルの行数も多ければ、下手にロジック組むよりこの方が高速です。
No.2
- 回答日時:
selectというか、Dynaset不要。
insertして一意制約違反だったらupdateすればいいだけ。updateの際は、主キーの項目はsetに含めない。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) Sub 分けてソートして貼り付ける() Dim srcSheet As Worksheet Dim 6 2023/08/04 19:57
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba TextBox1.ControlSourceに...
-
サブフォルダに格納されている...
-
VBA 別ブックからコピペしたい...
-
Excel VBA 定義されたプロージ...
-
IF文、条件分岐の整理方法
-
時間短縮のために、テキストフ...
-
【ExcelVBA】インデックスが有...
-
Excel VBA マクロ あるフォルダ...
-
重複確認
-
VBAの質問です、複数のテキスト...
-
エクセルのマクロについて教え...
-
vba アクティブシートの名前変...
-
IEを使わないでhtmlテキストを...
-
ファイル名の日付について教え...
-
excelのVBAについて、以下のコ...
-
VBAに詳しい方教えてください。
-
Outlookの「受信日時」「件名」...
-
ExcelVBAのFindFirstエラ...
-
[VB.net] ボタン(Flat)のEnable...
-
VBAでCOPYを繰り返すと、処理が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6のオラクルのバインド変数
-
指定文字を太字にするVBAを別シ...
-
Pro*Cの大文字小文字
-
複数のデータテーブルのデータ...
-
配列への分割方法
-
VBA 条件に合わせたデータ抽出
-
SQL構文
-
oo4oを使ったOracleへのデータ...
-
SQLローダーCSV取込で、囲み文...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
SQL*Loader Append
-
count関数の値をwhere句で使用...
-
Oracleで「文字が無効です」の...
-
where句中のtrim関数について
-
AccessのSQL文で1件のみヒット...
-
group byの並び順を変えるだけ...
-
2つの列が同じ値の行を取得するSQL
おすすめ情報