質問 |
||
| QNo.3626052 | SQL実行結果取得 | |
|---|---|---|
| 質問者:yagi-atlas |
バッチファイルにて、 sqlplusコマンドにより*.sqlファイルを実行し、 SQL文を発行していますが、 実行結果(処理件数)をコマンドプロンプト上 に表示したいのですが、どなたか。手法をご存知では ないでしょうか? |
|
困り度:
|
||
| 質問投稿日時: 07/12/25 13:37 |
||
回答良回答20pt |
|
| ANo.2 | 根本的に見直して、SQL*Loaderを使う方が良いんじゃないですかね。 パラメータファイル(5〜6行)を書く必要がありますが、コマンド一つでロード可能です。 コミットも1万件ごとに発行可能ですし、インサートに失敗したデータも選別できます。 インサートの処理内容もログに書き出されるので、ログを解析すれば、目的は達成されるハズです。 |
|---|---|
| 回答者:k_o_r_o_c_h_a_n | |
| 種類:回答 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 07/12/26 00:23 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | もう少し、詳しく書かないと分かりませんね。 バッチの実行はコマンドから?(Tera Term や TELNET?) 実行するのは問合せ? プロシージャー? まあ、PL/SQLなら、DBMS_OUTPUT.PUT_LINE を使うとか 問合せなら、SPOOL でログを取り、最後の何行かを実行後に出力するバッチにするとかですかね。 |
|---|---|
| 回答者:kouta77 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 07/12/25 13:42 |
|
| |
| この回答への補足 | ご回答ありがとうございます。 コマンドからです。 現状の仕様はバッチファイルを実行すると、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 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |