标题: [代码合集] 求助一下批处理sqlplus 实现执行动态sql脚本 [打印本页]
作者: zhl_shanghai 时间: 2012-11-16 23:27 标题: 求助一下批处理sqlplus 实现执行动态sql脚本
请教一下各位强人,小弟最近碰到个麻烦,想用dos批处理实现sqlplus 执行脚本,而脚本名为变量
set username=
echo username is %username%
set script=F:\x.txt
SET /P VAL=Please input passwd:
sqlplus %username%/%VAL%@uaT_NEW.TPAICDOM.COM @F:\x.txt。
环境是dos+oracle . 正如上面脚本中的脚本@F:\x.txt,此处由于脚本需要,需要用变量实现。及执行脚本换为变量,例如上面的变量script. 不知道如何实现,最好是可以给出变量为延迟变量的实现方法。
小弟在线等,不盛感激!
作者: BAT-VBS 时间: 2012-11-16 23:33
- set username=
- echo username is %username%
- set script=F:\x.txt
- SET /P VAL=Please input passwd:
- sqlplus %username%/%VAL%@uaT_NEW.TPAICDOM.COM @%script%
复制代码
作者: zhl_shanghai 时间: 2012-11-16 23:58
谢谢,之前也这样测过,但忽然发现原来是多个了分号,这种常规变量用这个方法是可以了。但我要做的脚本中的用户名和脚本名需要延迟变量。
echo username is !user1!
SET /P VAL=Please input passwd:
sqlplus !user1!/%VAL%@devdb_10.100.55.50 @!b!.tmp
这个代码前有个循环,会依次获取到不同的用户名和脚本完整路径。所以暂时想到用延迟变量实现的。不知道这种情况下sqlplus 该怎么去实现,语法一直有问题,没测出来。如果延迟变量在此处无法实现,是否还有其它解决办法呢?
作者: zhl_shanghai 时间: 2012-11-17 12:21
怎么没有哪位朋友遇到过这样的情况吗,不知道是sqlplus不支持这种延迟变量的用法还是语法有问题,实在头疼
作者: zhl_shanghai 时间: 2012-11-17 12:22
怎么没有哪位朋友遇到过这样的情况吗,不知道是sqlplus不支持这种延迟变量的用法还是语法有问题,实在头疼
作者: BAT-VBS 时间: 2012-11-18 07:58
回复 3# zhl_shanghai
请贴出完整代码
作者: zhl_shanghai 时间: 2012-11-19 11:44
setlocal enabledelayedexpansion
rem ----------测试---------------------
for /d %%i in (F:\11\*) do (
for /f %%j in ('dir /a /b "%%i"') do (
set dirtemp=%%i
set b=%%i\%%j
call :loop
rem -------减去目录前缀获取执行用户名长度-------
set /a usercount=!a!-6
rem -------得到用户名--------
call set user1=%%!dirtemp:~-!usercount!!%%
rem ------拼凑执行脚本------
echo spool !b!.log >!b!.tmp
echo @!b! >>!b!.tmp
echo spool off >>!b!.tmp
echo exit;>>!b!.tmp
rem -----------------------
echo username is !user1!
SET /P VAL=Please input passwd:
sqlplus !user1!/%VAL%@devdb_10.100.55.50 @!b!.tmp---------此处想调用前面获得的user1和sqlplus要执行的拼凑脚本!b!.tmp。
set /a a=0
)
)
pause
rem -------获取完整目录长度----------
:loop
set /a a+=1
if not "!dirtemp:~%a%,1!" equ "" goto :loop
goto :EOF
现在问题就出在sqlplus 怎么使用延迟变量了,
作者: zhl_shanghai 时间: 2012-11-19 16:03
奇怪的是下面这个脚本可以正常执行,也就是可以认为延迟变量的这种用法可行,但实在想不通为什么上面那个脚本却解析有问题,两个脚本sqlplus 位置的用法是完全一样啊
setlocal enabledelayedexpansion
set username=zhl
set username=r_zhl
echo username is !username!
set scr=D:\zhl\x.txt
set script=!scr!.tmp
SET /P VAL=Please input passwd:
sqlplus !username!/%VAL%uat @!script!
pause
作者: Batcher 时间: 2012-11-20 00:20
回复 7# zhl_shanghai
确保代码中没有@echo off,把完整的执行过程贴出来看看。
Q: 怎样把CMD窗口里的结果复制出来?
A: 右键单击CMD窗口的标题栏->"属性"->"选项"->勾选"快速编辑模式"->然后在CMD窗口用鼠标左键选中想要拷贝的内容->在选中的内容上单击鼠标右键->粘贴到文本文件中即可
顺便把!b!.tmp的内容也贴出来
作者: zhl_shanghai 时间: 2012-11-20 17:31
多谢各位,已经解决了,是由于输入的密码变量没有读到,
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |