如何实现Sqlplus并行脚本执行完毕后再执行后续SQL脚本?
解决批处理并行执行Sqlplus脚本后等待全部完成再执行后续命令的方法
方法一:通过生成标记文件等待
方式1:修改SQL脚本添加标记生成
在每个并行执行的SQL脚本(myscript1.sql、myscript2.sql、myscript3.sql)末尾添加如下命令,让脚本执行完成后生成对应标记文件:
-- 在myscript1.sql结尾添加 HOST echo. > script1_done.txt
-- 在myscript2.sql结尾添加 HOST echo. > script2_done.txt
-- 在myscript3.sql结尾添加 HOST echo. > script3_done.txt
修改主批处理文件,实现并行启动、等待标记文件生成后执行后续脚本:
@echo off :: 清理历史标记文件 del /q script1_done.txt script2_done.txt script3_done.txt :: 并行启动三个Sqlplus脚本 start sqlplus user/pwd@tnsid @myscript1.sql & start sqlplus user/pwd@tnsid @myscript2.sql & start sqlplus user/pwd@tnsid @myscript3.sql :: 循环等待所有标记文件生成 :wait_loop if not exist script1_done.txt goto wait_loop if not exist script2_done.txt goto wait_loop if not exist script3_done.txt goto wait_loop :: 所有并行脚本执行完毕,执行第四个脚本 sqlplus user/pwd@tnsid @myscript4.sql :: 清理标记文件 del /q script1_done.txt script2_done.txt script3_done.txt
方式2:用小批处理包装Sqlplus调用
如果不想修改原SQL脚本,可创建三个小批处理文件分别包装每个Sqlplus调用:
run_script1.bat:
sqlplus user/pwd@tnsid @myscript1.sql echo. > script1_done.txt
run_script2.bat:
sqlplus user/pwd@tnsid @myscript2.sql echo. > script2_done.txt
run_script3.bat:
sqlplus user/pwd@tnsid @myscript3.sql echo. > script3_done.txt
主批处理文件内容同方式1,仅需将并行启动命令改为:
start cmd /c run_script1.bat & start cmd /c run_script2.bat & start cmd /c run_script3.bat
方法二:使用Windowswaitfor信号机制
利用Windows内置的waitfor命令实现进程间信号通知,无需创建文件或修改原SQL脚本:
@echo off :: 并行启动三个Sqlplus脚本,每个执行完成后发送对应信号 start cmd /c "sqlplus user/pwd@tnsid @myscript1.sql && waitfor /si script1_finish" & start cmd /c "sqlplus user/pwd@tnsid @myscript2.sql && waitfor /si script2_finish" & start cmd /c "sqlplus user/pwd@tnsid @myscript3.sql && waitfor /si script3_finish" :: 等待所有并行脚本的完成信号 waitfor script1_finish waitfor script2_finish waitfor script3_finish :: 执行第四个Sqlplus脚本 sqlplus user/pwd@tnsid @myscript4.sql :: 清理已注册的信号(避免影响后续执行) waitfor /d script1_finish waitfor /d script2_finish waitfor /d script3_finish
说明:
/si参数表示发送信号到同一台机器的所有会话/d参数表示删除已注册的信号
内容的提问来源于stack exchange,提问作者Javi Torre
相关产品推荐
相关产品推荐

