タブ区切りの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を別シ...
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
SELECT FOR UPDATE で該当レコ...
-
select文の実行結果に空白行を...
-
count関数の値をwhere句で使用...
-
where句中のtrim関数について
-
AccessのSQL文で1件のみヒット...
-
レコードの登録順がおかしい
-
1の行を固定した上でVBAを用い...
-
Oracleで「文字が無効です」の...
-
【PL/SQL】FROM区に変数を使う方法
-
SQL*Loader Append
-
テーブルの最後(最新)のレコー...
-
並べ替えについて
-
トランザクションログを出力せ...
-
エクセル、並び替え正しくソー...
-
一気に複数のレコードをinsert...
-
SQLで曜日のソートを月火水木金...
-
CSVからNULL値をインポート
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6のオラクルのバインド変数
-
oo4oを使ったOracleへのデータ...
-
accessvbaで内容を結合して保存
-
拡張GerberデータRX-274Xについて
-
SQL文で
-
SQL構文
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
select文の実行結果に空白行を...
-
<SQL>重複しているデータの場合...
-
エクセルのソートについて
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
count関数の値をwhere句で使用...
-
複数のテーブルから値を合計出...
-
SELECT FOR UPDATE で該当レコ...
-
AccessのSQL文で1件のみヒット...
-
2つの列が同じ値の行を取得するSQL
-
Oracleで「文字が無効です」の...
-
トランザクションログを出力せ...
おすすめ情報