ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

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
この回答へのお礼この回答にお礼をつける(質問者のみ)