
No.2ベストアンサー
- 回答日時:
根本的に見直して、SQL*Loaderを使う方が良いんじゃないですかね。
パラメータファイル(5~6行)を書く必要がありますが、コマンド一つでロード可能です。
コミットも1万件ごとに発行可能ですし、インサートに失敗したデータも選別できます。
インサートの処理内容もログに書き出されるので、ログを解析すれば、目的は達成されるハズです。
No.1
- 回答日時:
もう少し、詳しく書かないと分かりませんね。
バッチの実行はコマンドから?(Tera Term や TELNET?)
実行するのは問合せ? プロシージャー?
まあ、PL/SQLなら、DBMS_OUTPUT.PUT_LINE を使うとか
問合せなら、SPOOL でログを取り、最後の何行かを実行後に出力するバッチにするとかですかね。
この回答への補足
ご回答ありがとうございます。
コマンドからです。
現状の仕様はバッチファイルを実行すると、txtファイルよりパラメータを読み込み、INSERT文を作成し、最後に一括して実行するといったものになっています。
SPOOLしているのは、処理開始時刻と処理終了時刻をログファイルに出力するためです。
また、INSERT文1万件ごとにcommit文を挟むようにしています。
rem ログファイルパス
set log_path=LOG.txt
rem 開始時刻をログ出力
echo [開始時刻] >> %log_path%
echo %time% >> %log_path%
rem datファイル名
set dat_name=dat_1.dat
rem READファイルパス
set cmt_path=test.csv
rem INSERT処理件数カウンタ
set count=0
rem sql文の頭
echo set feedback off; > %dat_name%
echo set verify off; >> %dat_name%
echo spool %log_path% append; >> %dat_name%
rem READファイルより一行づつデータを読み込みます。
For /F "tokens=* delims=" %%i in (%cmt_path%) Do Call :Sub %%i
rem sql文のおしり
echo spool off; >> %dat_name%
echo commit; >> %dat_name%
echo exit >> %dat_name%
sqlplus -s */*@* < %dat_name%
rem 完了時刻をログ出力
echo [完了時刻] >> %log_path%
echo %time% >> %log_path%
rem 処理件数をログ出力
echo [処理件数] >> %log_path%
echo %count% >> %log_path%
echo.
echo 処理を終了しました。
echo.
notepad %log_path%
pause >nul
goto :eof
:Sub
set DATA=%1
set word1=%DATA:~0,4%
set word2=%DATA:~4,8%
set word3=%DATA:~12,1%
set word4=%DATA:~13,25%
echo INSERT INTO *_DATA (t1,t2,t3,t4) VALUES(LPAD('%word1%',6,0),LPAD('%word2%',15,0),LPAD('%word3%',6,0),'%word4%'); >> %dat_name%
rem datファイルに書き込んだINSERT文の数をカウントします。
set /a count=count+1
rem 一万件ごとにCOMMITを行うようにします。
set /a result=count%%10000
if %result%==0 goto label1
:else
goto end
:label1
echo commit; >> %dat_name%
echo spool off; >> %dat_name%
echo exit; >> %dat_name%
sqlplus -s */*@* < %dat_name%
set dat_name=dat_%count%.dat
echo set feedback off; > %dat_name%
echo set verify off; >> %dat_name%
echo spool %log_path% append; >> %dat_name%
:end
goto :eof
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
バッチファイルを使用したsql@plusの実行及びログ出力について
Oracle
-
バッチからsqlplusの接続エラーの検知について
その他(プログラミング・Web制作)
-
PL/SQLをWindowsのBATファイルで実行するには
Oracle
-
-
4
batファイルでのSQL(oracle)実行エラーについて
Oracle
-
5
PL/SQLでSPOOLさせたいのですが、可能でしょうか?
Oracle
-
6
PL/SQLで@ファイル名が反応しません
Oracle
-
7
SQLPLUSで結果を画面に表示しない
Oracle
-
8
sqlplusでヘッダーが付かない
Oracle
-
9
SQL*Plusの終了はquit?exit?
Oracle
-
10
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
11
バッチでテキストファイルから任意の行のみ取得したい
その他(プログラミング・Web制作)
-
12
【初心者です】SQLPLUSでのバッチ実行時の引数(パラメータ)指定について
Oracle
-
13
Statement ignored というエラー
Oracle
-
14
SQL*LoaderでCSVから指定した列のみインポートしたい。
Oracle
-
15
SQL>UPDATEと同時にその件数をCOUNTする方法
その他(データベース)
-
16
PL/SQLでログを確認したい。
Oracle
-
17
シェルスクリプトでオラクルのエラーメッセージを取得するには
Oracle
-
18
batファイルからsql文実行
Oracle
-
19
CASE文のエラーについて
Oracle
-
20
selectした結果の余計な余白を取るにはどうしたらよいのでしょうか
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLでログを確認したい。
-
SQL*Plusで、コマンドの返答を...
-
execute使用した時の、完了メッ...
-
SQL*PLUSを終了させる方法
-
サービスの再起動を自動で
-
pl/sqlでのautotraceについて
-
oracle11g listener.logの削除
-
ORACLEの停止失敗
-
batファイルでのSQL(oracle)...
-
ORACLEのエクスポートについて
-
ストアド・プロシージャをバッ...
-
ORA-01013のエラーについて経験...
-
富士通のノートパソコンを使っ...
-
CASE文のエラーについて
-
ORA-01843: 指定した月が無効で...
-
Oracleの起動時に、マウントし...
-
【PL/SQL】SQL文が長すぎてSELE...
-
PL/SQL PLS-00103エラーについて
-
パーティション、未割当ての利...
-
4GB = 4096MB ではない?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Oracleで流したSQLのログを取得...
-
PL/SQLでログを確認したい。
-
SQL*Plusで、コマンドの返答を...
-
ストアド・プロシージャをバッ...
-
batファイルでのSQL(oracle)...
-
SQL実行結果取得
-
ORA-00984のエラーが出ます
-
サービスの再起動を自動で
-
トレースファイルの削除スクリプト
-
oracle11g listener.logの削除
-
execute使用した時の、完了メッ...
-
SQL*PLUSを終了させる方法
-
JavaでのOracle接続について(J...
-
マテリアライズドビューログに...
-
SQL実行結果の出力を見やすくし...
-
Accessからoracleのストアドプ...
-
リスナーログを出力しない設定方法
-
ソート(大文字・小文字を区別...
-
アクセスログのとり方を教えて...
-
pl/sqlでのautotraceについて
おすすめ情報