• ベストアンサー

oo4oを使ったOracleへのデータ処理を高速化したい

タブ区切りの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

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 ざっと眺めただけだが確かに遅すぎて使えそうにないな。 アプローチ1.tsvから1行読み込んだら、1列目(顧客コード)をキーにselectして引っかかればupdate、引っかからなければinsertを実行するように変更する。  これはあれなのかな? ひょっとしたらtsvに同じ顧客コードが2行以上あった時に、毎回selectするとエラーが発生せずに1回目に出てきたの餡餅商事はinsert→2回目以降に出てきた餡餅商事はupdateでエラーが発生せずに終わってしまうからダメなのかな? それならこのアプローチを取らなかった理由は分かる。 アプローチ2.顧客コード一覧をダイナセットで取る時に顧客コードを昇順でソートし、バイナリサーチを使うように変更する。  これは説明の必要もないだろう。シーケンシャルサーチはありえんだろう。30万行やし。

rio_grande
質問者

お礼

コードの記述方法がわかりました。 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 でできました。 有難うございました。

rio_grande
質問者

補足

anmochiさんご回答有難うございます。 恐縮ですが、アプローチ1をとる場合の書き方がわかりません。 1列目をキーにSELECTしてダイナセットで取るには Set rs = OraDatabase.CreateDynaset("SELECT COMPANY_CODE FROM CUSTOMER WHERE COMPANY_CODE = :データ0", ORADYN_DEFAULT) でよいかと思いますが、ひっかかっる、ひっかからないのコードはどのように記述すれば宜しいのでしょうか、わかれば教えて頂けませんでしょうか。 宜しくお願いします。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答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.3

Oracle のバージョンはいくつでしょうか? 9i 以降だったら MERGE が使えますけど。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

selectというか、Dynaset不要。insertして一意制約違反だったらupdateすればいいだけ。 updateの際は、主キーの項目はsetに含めない。

関連するQ&A

  • ExcelVBA+OO4O使ったストアドのカーソルの扱い

    お世話になります Dim Cellsvalue(1,1) As Variant Cellsvalue(0,0) = 1: Cellsvalue(1,0) = 1 Cellsvalue(0,1) = 2: Cellsvalue(1,2) = 2 With UsroOraDB   .Parameters.Add "PARA1", Cellsvalue, ORAPARM_INPUT .Parameters("PARA1").serverType = ORATYPE_CURSOR   .BeginTrans   .ExecuteSQL("BEGIN TestPack.TestProc(":PARA1"); END;")   .CommitTrans End With 以上のように、引数としてカーソルを渡したいのですがOracleストアドでは値をひろっていませんでした。 引数の渡し方がまずいと思うのですが、この場合は二次元配列ではだめなのでしょうか? よろしくおねがいします

  • ストアドプロシージャ結果のファイル出力について

    お世話になります。 以下のようにOracleにてストアドプロシージャを作成して、 それをAccessからコールしております。 そしてそのDBMS_OUTPUTの結果をファイル出力したいのですが、 試しに「sqlstmt = "BEGIN proc_SeikyuMeisai(:yyyymm); END;"」の部分を 「sqlstmt = "spool aaa.csv BEGIN proc_SeikyuMeisai(:yyyymm); END; spool off"」 や、ストアド側でspoolしてみましたがダメでした。 UTL_FILEを使うしかないのでしょうか? ご存じの方おられたらご教示いただけますでしょうか? 宜しくお願い致します。 【Access2003側】 ' セッションの作成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'データベースへの接続 Set OraDatabase = OraSession.OpenDatabase("Hoge", "hoge/hoge", ORADB_DEFAULT) '■ ストアド実行 ■ sqlstmt = "BEGIN proc_SeikyuMeisai(:yyyymm); END;" 'バインド変数の設定 OraDatabase.Parameters.Add "yyyymm", 0, ORAPARM_INPUT OraDatabase.Parameters("yyyymm").serverType = ORATYPE_NUMBER '引数設定 OraDatabase.Parameters("yyyymm").value = Forms!F月次データ取込.txt日付1 'SQL文の実行 OraDatabase.ExecuteSQL sqlstmt DoCmd.Hourglass False '砂時計 'バインド変数の削除 OraDatabase.Parameters.Remove "yyyymm" '■ORACLEへの切断■ OraDatabase.Close 'オブジェクトの破棄 Set OraDatabase = Nothing Set OraSession = Nothing MsgBox "正常に出力されました。" 【Oracle10g】 Create or replace procedure Proc_SeikyuMeisai ( P1_YYYYMM IN number ) IS WK_KANID varchar2(10); WK_CODE varchar2(6); WK_SUU varchar2(12); WK_TEN varchar2(9); WK_KAI varchar2(2); -- カーソルタイプの定義 TYPE typeMyCursor IS REF CURSOR; -- カーソル変数の定義 curSeikyu typeMyCursor; curID varchar2(10); curMAX number; curMEISAI varchar2(1000); curTEN number; curKAI number; vSql varchar2(1000); BEGIN vSql := 'select KANNO, MEISAI_MAX, _MEISAI, HOU_TENSUU_KEI, TOTAL_KAISUU from SEIKYUUMEISAI' || P1_YYYYMM; -- カーソルオープン open curSeikyu for vSql; loop fetch curSeikyu into curID, curMAX, curMEISAI, curTEN, curKAI; exit when curSeikyu%NOTFOUND; WK_KANID := curID; for nLpCnt IN 1..curMAX loop WK_CODE := substrb(curMEISAI, 3, 6); WK_SUU := substrb(curMEISAI, 34, 12); WK_TEN := substrb(curMEISAI, 89, 9); WK_KAI := lpad(curKAI, 2, 0); dbms_output.put_line(WK_KANID || ',' || WK_CODE || ',' || WK_SUU || ',' || WK_TEN || ',' || WK_KAI); end loop; end loop; end; /

  • チェックボックスが選択させない

    PHP smartyで4×6のチェックボックスのリストを表示しています。 しかし、上の2行(8つのチェックボックス)が、 初期表示から3分以上たたないと、選択できない状態になります。 ブラウザはIE6.0です。 原因が不明の状態です。どのようにすればよろしいでしょうか。 Mozilla Firefox2.0では正常に動作します。 <table border=0 class="tabledetails"> <{section name="index" loop=$data start="0" step="1" max="10"}> <tr> <th> <{$data[index].name_1}> </th> <td> <{if $data[index].name_1 <> '' }> <{if ($curentview == 'CHECK' or (($modeid == 'SERH1') or ($modeid == 'SERH2') or ($modeid == 'SERH3') or ($modeid == 'SERH4'))) }> <input type="hidden" name='code_<{$data[index].code_1}>' <{if $data[index].name_1_flg}>value='on'<{/if}> > <{if $data[index].name_1_flg}><img src="./images/reten.png" /><{/if}> <{else}> <input type="checkbox" name='code_<{$data[index].code_1}>' <{if $data[index].name_1_flg}>CHECKED<{/if}> > <{/if}> <{/if}> </td> <th> <{$data[index].name_2}> </th> <td> <{if $data[index].name_2 <> '' }> <{if ($curentview == 'CHECK' or (($modeid == 'SERH1') or ($modeid == 'SERH2') or ($modeid == 'SERH3') or ($modeid == 'SERH4'))) }> <input type="hidden" name='code_<{$data[index].code_2}>' <{if $data[index].name_2_flg}>value='on'<{/if}> > <{if $data[index].name_2_flg}><img src="./images/reten.png" /><{/if}> <{else}> <input type="checkbox" name='code_<{$data[index].code_2}>' <{if $data[index].name_2_flg}>CHECKED<{/if}> > <{/if}> <{/if}> </td> <th> <{$data[index].name_3}> </th> <td> <{if $data[index].name_3 <> '' }> <{if ($curentview == 'CHECK' or (($modeid == 'SERH1') or ($modeid == 'SERH2') or ($modeid == 'SERH3') or ($modeid == 'SERH4'))) }> <input type="hidden" name='code_<{$data[index].code_3}>' <{if $data[index].name_3_flg}>value='on'<{/if}> > <{if $data[index].name_3_flg}><img src="./images/reten.png" /><{/if}> <{else}> <input type="checkbox" name='code_<{$data[index].code_3}>' <{if $data[index].name_3_flg}>CHECKED<{/if}> > <{/if}> <{/if}> </td> <th> <{$data[index].name_4}> </th> <td> <{if $data[index].name_4 <> '' }> <{if ($curentview == 'CHECK' or (($modeid == 'SERH1') or ($modeid == 'SERH2') or ($modeid == 'SERH3') or ($modeid == 'SERH4'))) }> <input type="hidden" name='code_<{$data[index].code_4}>' <{if $data[index].name_4_flg}>value='on'<{/if}> > <{if $data[index].name_4_flg}><img src="./images/reten.png" /><{/if}> <{else}> <input type="checkbox" name='code_<{$data[index].code_4}>' <{if $data[index].name_4_flg}>CHECKED<{/if}> > <{/if}> <{/if}> </td> </tr> <{/section}> </table>

  • VB6でのPL/SQLの実行について

    現在VB6(SP6)でORACLEのデータベースに接続後、プロシージャを実行してOUTのパラメータを取得したいと思ってプログラムを作っております。 ORACLEへの接続はいろいろ調べてできたのですが、プロシージャの実行(呼び出し)のしかたがわからず困っております。 PL/SQL(プロシージャ名"TEST_DATA") out1 = TEST(OUTパラメータ1) out2 = これはテストです。(OUTパラメータ2) VB6(SP6) Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset As OraDynaset Dim P1 AS String Dim P2AS String '接続処理 Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase("TEST", "TEST/TEST DB_DEFAULT) OraSession.BeginTrans 'ここでPL/SQLを実行して、パラーメタを取得したいです。 '取得したパラメータをセット P1 = パラメータ1(TEST) P2 = パラメータ1(これはテストです。) OraSession.CommitTrans '結果表示 Call MsgBox(P1 & "結果" & P2) ご教授のほどをお願いいたします。

  • csvファイルの読み込みとOracleDBへの更新

    VB6.0とOracle9i、どちらも初心者です。 C:\直下にあるtest.csvファイルを読み込み、Oracleのテーブルと比較して存在しないものはinsert、存在するものはupdateする。 ・test.csvファイル(百行) "LOCATE", "COMPANY_CODE", "COMPANY_NAME", "COMPANY_KANA", "ZIPCODE", "ADDRESS", "TEL_NO", "FAX_NO", "CATEGORY", "INDUSTRIES", "PERSONS" ・OracleのCustomerテーブル COMPANY_CODE NUMBER COMPANY_NAME VARCHAR2 COMPANY_KANA VARCHAR2 ZIPCODE CHAR ADDRESS VARCHAR2 TEL_NO CHAR TEL_NO_2 CHAR FAX_NO CHAR HP_URL VARCHAR2 NOTE VARCHAR2 CUST_VARCHAR_1 VARCHAR2 CUST_VARCHAR_2 VARCHAR2 CUST_VARCHAR_3 VARCHAR2 CUST_VARCHAR_4 VARCHAR2 ・ロジック 1.oo4oでOracleに接続 2.csvファイルの読み込み 3.oracleのレコードとの比較 4.insertプログラム 5.updateプログラム ・コード '** oo4o 接続 dbname = "****" cnuser = "****/****" Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, ORADB_DEFAULT) Open "c:\test.csv" For Input As #1 ' csvファイルをオープンして、1行ずつループで取り込んで、取り込んだcsvレコード(行)を元にキー項目(COMPANY_CODE)を条件に既にOracleテーブルにあればInsertクエリを, なければUpdateクエリを発行する、をファイルエンドまで繰り返します。 自分でなんとか書いて聞くのが礼儀だと思いますが、調べてもやっぱりどう書けばよいのか全くわかりません。懸念事項として、Oracleのテーブルの列とCSVの列の数や並び方が異なっていることがあります。よろしくお願いします。

  • aspファイルの内容が全くわかりません。困っています。

    asp.netの初心者です。 今まで管理されていた人が休職してしまったので、代わりに修正や加工を少し行っていました。 しかし、以下のファイル内容が全く分かりません。(抜粋です。) 正常に使用しているファイルです。 最後の Session("pointzan")=rs("PointZan") はどこのデータベースから受け取っているのでしょうか? Select文がどこにも書かれていないので、全くわかりません。 それとも別のファイルなどに飛んで処理しているのでしょうか? rs("PointZan")を呼び出しているデータベースがどこなのかを知りたいです!! よろしくお願いいたします。 ---------------------------------------------- If Request.Form("CODE")="" then wID = Trim(Request("CODE")) Set pm = cm.CreateParameter("ID",129,1,13,wID) '(name,Char,Input,Length,Value) cm.Parameters.Append pm cm.CommandText = "UP_HIKI01" cm.CommandType = 4 cm.ActiveConnection = cn Set rs=cm.Execute Else wID = Trim(Request.Form("CODE")) Set pm = cm.CreateParameter("ID",129,1,13,wID) '(name,Char,Input,Length,Value) cm.Parameters.Append pm cm.CommandText = "UP_HIKI01" cm.CommandType = 4 cm.ActiveConnection = cn Set rs=cm.Execute End If Session("code")=rs("Code") Session("pointzan")=rs("PointZan") YVC1=rs("YVC1") If YVC1="" or isNULL(YVC1) Then session("YVC1")="" End If ----------------------------------------------

  • 01722 数値が無効です

    ドラえもん 2012-10-29(月) 10:30 ホームページで公開されていたVBAを流用して、EXCELからデータベースの更新、削除をしようとしています。 データベースの更新に関してはうまく動作するのですが、データ削除を実施すると、 440)データをフェッチ中にエラーが発生しました。ORA-01722数値が無効です。 というエラーが発生してしまいます。 01722のエラー内容をホームページ並びに、本サイトで検索したのですが、 データの型が違うという内容で、類似の内容が無い状況でした。 型が違うという内容に対して、何をどうしたらよいかが分かりません。 コーディングのミスを指摘いただきたく よろしくお願いいたします。 VBAまったくの初心者です。 下記は、マクロの構成です。 (1)B3からR***の領域にデータベースからダウンロードしたデータが表示される。  ***は列数でデータベースの項目数で変化する (2)B2からR2には項目名称が表示されている。 (3)編集用の領域はT2からAJ2に(2)と同じ項目名を表示する。 (4)編集用のデータ領域はT3からAJ20まで。 ※ID並びにパスワードは実際のものから変更しています。  ORACLE9.0 EXCEL2003 ------------------------------------------------------------- '「データの削除」ボタン押下後の処理 ' oo4o使用時 Private Sub btnDeleteDataoo4o_Click() On Error GoTo ERR_HANDLER 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer Dim sSQL As String '削除対象のみを抽出するSQL文の作成 sSQL = "select * from M_TOOL_MEISAI where LINECD=" & ActiveSheet.Cells(3, 20) For rownum = 4 To 20 If ActiveSheet.Cells(rownum, 20) = "" Then Exit For End If sSQL = sSQL & " OR LINECD=" & ActiveSheet.Cells(rownum, 20) Next 'oo4oセッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(DBへUserID:○、パスワード:×で接続) Set OraDatabase = OraSession.OpenDatabase(ActiveSheet.Cells(26, 1), "○/×", 0&) 'oo4oデータセット(レコードセット)の生成(削除対象データのみを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset(sSQL, 0&) 'レコードセット内の全レコードの削除 Do Until rs.EOF rs.Delete rs.MoveNext Loop 'オブジェクトのクローズ rs.Close 'データ表示の更新 btnGetDataoo4o_Click QUIT_OPER: 'オブジェクト変数用に確保したメモリの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Exit Sub ERR_HANDLER: 'エラー処理 'エラー番号とエラー内容の表示 MsgBox Err.Number & ")" & Err.Description Err.Clear GoTo QUIT_OPER End Sub ------------------------------------------------------------------------------- 以上がエラーが発生するVBA 下記は、更新処理で正しく動作するVBA ------------------------------------------------------------------------------- '「データの更新」ボタン押下後の処理 ' oo4o使用時 Private Sub btnUpdateDataoo4o_Click() On Error GoTo ERR_HANDLER 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer 'oo4oセッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(DBへUserID:○、パスワード:×で接続) Set OraDatabase = OraSession.OpenDatabase(ActiveSheet.Cells(26, 1), "○/×", 0&) 'oo4oデータセット(レコードセット)の生成(全データを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset("select * from M_TOOL_MEISAI", 0&) 'データの更新 For rownum = 3 To 20 If ActiveSheet.Cells(rownum, 20) = "" Then Exit For End If '更新対象データの検索 rs.Findfirst ("LINECD=" & ActiveSheet.Cells(rownum, 20)) '編集モードに設定 rs.Edit For colnum = 1 To rs.Fields.Count - 1 Select Case rs(colnum).Type Case 10 rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 20) Case 8 rs(colnum).Value = CDate(ActiveSheet.Cells(rownum, colnum + 20)) Case Else rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 20) End Select Next rs.Update Next 'オブジェクトのクローズ rs.Close 'データ表示の更新 btnGetDataADO_Click QUIT_OPER: 'オブジェクト変数用に確保したメモリの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Exit Sub ERR_HANDLER: 'エラー処理 'エラー番号とエラー内容の表示 MsgBox Err.Number & ")" & Err.Description Err.Clear GoTo QUIT_OPER End Sub

  • Perl5で同時刻のデータを統合したい

    perl初心者です。 下記のような同時刻の2つのデータを1つのデータに統合させたいのですが うまく出来ず困っています。 どうかお知恵を貸していただけないでしょうか。 データは時刻(時:分:秒), 値1, 値2になっています。 test1.txtの同時刻の後ろにtest2.txtの値1と値2を入れ、 欠測値には-999を入れるプログラムを作っています。 厄介なのは、 開始時刻がtest1.txtよりtest2.txtが早い場合や 終了時刻がtest2.txtよりtest1.txtが遅い場合がある事です。 test1.txt 10:13:14, 3.1, 0.1 10:13:15, 6.1, 0.3 10:13:16, 8.7, 0.2 10:13:17, 12.8, 0.3 10:13:18, 13.4, 0.5 10:13:19, 15.2, 0.4 test2.txt 10:13:16, 32.5, 0.01 10:13:17, 33.1, 0.03 10:13:18, 36.2, 0.02 10:13:19, 34.3, 0.01 10:13:20, 33.8, 0.04 10:13:21, 32.6, 0.09 10:13:22, 32.1, 0.08 希望結果 test.txt 10:13:14, 3.1, 0.1, -999.0, -999.00 10:13:15, 6.1, 0.3, -999.0, -999.00 10:13:16, 8.7, 0.2, 32.5, 0.01 10:13:17, 12.8, 0.3, 33.1, 0.03 10:13:18, 13.4, 0.5, 36.2, 0.02 10:13:19, 15.2, 0.4, 34.3, 0.01 10:13:20, -999.0, -999.0, 33.8, 0.04 10:13:21, -999.0, -999.0, 32.6, 0.09 10:13:22, -999.0, -999.0, 32.1, 0.08 以下が自分が作成したプログラムです。 open IN_1, "test1.txt"; open IN_2, "test2.txt"; open OUT, ">test.txt"; while ($input1 = <IN_1>) { # test1.txtの処理 chomp $input1; # 改行削除 @input1 = split(/,/, $input1); # カンマ区切り $n = $n + 1; $time1[$n] = @input1[0]; @time1 = split(/:/, $time1[$n]); # 時刻をコロン区切り @hours1[$n] = @time_l[0]; @min1[$n] = @time_l[1]; @sec1[$n] = @time_l[2]; @a[$n] = @input1[1]; # 値1 @b[$n] = @input1[2]; # 値2 } while ($input2 = <IN_2>) { # test2.txtの処理 chomp $input2; @input2 = split(/,/, $input2); $m = $m + 1; $time2[$m] = @input2[0]; @time2 = split(/:/, $time2[$m]); @hours2[$m] = @time2[0]; @min2[$m] = @time2[1]; @sec2[$m] = @time2[2]; @c[$m] = @input2[1]; # 値1 @d[$m] = @input2[2]; # 値2 } # 開始と終了時刻の計算 # test1.txtの時刻 $hours1_S = @hours1[1]; # 開始時 $hours1_E = @hours1[$n]; # 終了時 $min1_S = @min1[1]; # 開始分 $min1_E = @min1[$n]; # 終了分 $sec1_S = @sec1[1]; # 開始秒 $sec1_E = @sec1[$n]; # 終了秒 $time1_S = $hours1_S*3600 + $min1_S*60 + $sec1_S; # 開始時刻を秒に計算 $time1_E = $hours1_E*3600 + $min1_E*60 + $sec1_E; # 終了時刻を秒に計算 # test2.txtの時刻 $hours2_S = @hours2[1]; $hours2_E = @hours2[$m]; $min2_S = @min2[1]; $min2_E = @min2[$m]; $sec2_S = @sec2[1]; $sec2_E = @sec2[$m]; $time2_S = $hours2_S*3600 + $min2_S*60 + $sec2_S; $time2_E = $hours2_E*3600 + $min2_E*60 + $sec2_E; if($time1_S <= $time2_S){ # 開始時刻の比較 $starttime = $time1_S; }else{ $starttime = $time2_S; } if($time1_E <= $time2_E){ # 終了時刻の比較 $endtime = $time2_E; }else{ $endtime = $time1_E; } $j = $endtime - $starttime; # 全体のデータ個数 # test.txtへ出力 for($i=1; $i<=$j; $i++){ if(@hours1[$i] != @hours2[$i] && @min1[$i] != @min2[$i] && @sec1[$i] != @sec2[$i]){ printf OUT "%2d:%2d:%2d %5.1f% 5.1f %5.1f %7.2f\n", @hours1[$i], @min1[$i], @sec1[$i], @a[$i], @b[$i], -999, -999; }elsif(@hours1[$i] == @hours2[$i] && @min1[$i] == @min2[$i] && @sec1[$i] == @sec2[$i]){ printf OUT "%2d:%2d:%2d %5.1f% 5.1f %5.1f %7.2f\n", @hours1[$i], @min1[$i], @sec1[$i], @a[$i], @b[$i], @c[$i], @d[$i]; }else{ printf OUT "%2d:%2d:%2d %5.1f% 5.1f %5.1f %7.2f\n", @hours2[$i], @min2[$i], @sec2[$i], -999@, -999, @c[$i], @d[$i]; } } close IN_1; close IN_1; close OUT; とても汚いプログラムになってしまいました… このプログラム以外でも構いませんのでどうかよろしくお願い致します。

    • ベストアンサー
    • Perl
  • 教えてください。

    これらは何を意味しているのでしょうか? ----------------------------------------------- Dim icon_cnt:icon_cnt=0 Dim set_date Dim start_date1 Dim end_date1 Do Until rs.EOF sch2_seq = rs("sch2_seq")&""  '()のデータDBのビューです。 start_date = rs("start_date") &"" end_date = rs("end_date") &"" start_time = rs("start_time") &"" end_time = rs("end_time") &"" category = rs("category") &"" category_nm = rs("category_nm") &"" subject = rs("subject") &"" client_cd = rs("client_cd") &"" icon_sec1 = rs("icon_sec1")&"" company_nm = rs("company_nm") &"" If CLng(start_date) <= CLng(min_date) Then set_date = min_date Else set_date = start_date End If If CLng(end_date) >= CLng(max_date) Then end_date1 =max_date Else end_date1 = end_date End If ※宜しければ詳しく教えてください。

  • EXCEL VBAでデータベース更新

    OFFICE2010 ORACLE 9.1 あるサーバ(A)にあるデータを(B)にコピーする方法を教えていただきたく。 サーバ(A)には、オーダ情報が毎日登録されます。 サーバ(B)は、ソフト開発用に用意されていたサーバで、 このサーバを利用して、EXCEL連携でデータ参照したいと思っています。 EXCEL VBAでサーバ(A)、サーバ(B)両方とも連携可能なので、 直接サーバ(A)を参照すればデータ自体は見られます。 しかし、他部門にツールとして渡すので、データベースを壊されたら困るので、 サーバ(B)を参照サーバとして利用したいというおもいです。 実施したいのは、 サーバ(A)のinfoというテーブルから サーバ(B)のinfoというテーブルへデータを更新する方法。 サーバ(A)とサ-バ(B)の差分を更新する方法もあるかと思いますが、 サーバ(A)は、レコード自体が更新されていくので、 サーバ(B)のinfoデーブルの内容を全て削除してから、 サーバ(A)のinfoテーブルの内容をコピー という方法を教えていただきたく。 参考に、下記はサーバ(A)のinfoテーブルから全レコードを取得するマクロです。 Private Sub receive_Click() Application.ScreenUpdating = False 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer 'セッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(サーバA) Set OraDatabase = OraSession.OpenDatabase("A", "name/password", 0&) 'oo4oデータセット(レコードセット)の生成(全データを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset("select * from info", 0&) 'すでに表示されている内容のクリア Call ClearDisp 'フィールド名の表示 For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(2, colnum + 2) = rs(colnum).Name Next 'データの表示 rownum = 0 Do Until rs.EOF For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(rownum + 3, colnum + 2) = rs(colnum).Value Next rs.MoveNext rownum = rownum + 1 Loop 'セル幅の自動調整 ActiveSheet.Columns("B:I").EntireColumn.AutoFit 'オブジェクトのクローズ rs.Close '各種オブジェクトの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Application.ScreenUpdating = True End Sub B2からBI2までがタイトル B3からBI10000くらいまでデータがあります。 D2列がシリアル番号になっており、同じ番号は登録されません。 マクロ、全くの初心者です。 ベタのコードで教えていただきたく。 上記マクロは、ホームページに記載されていたものを分かる範囲で変更したものです。 サーバ(B)からのデータ取得はAがBになるだけです。 'oo4oデータベースオブジェクトの生成(サーバB) Set OraDatabase = OraSession.OpenDatabase("B", "name/password", 0&) ※A,Bは実際のサーバ名ではありません。