[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[代码合集] 求助一下批处理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. 不知道如何实现,最好是可以给出变量为延迟变量的实现方法。

小弟在线等,不盛感激!

  1. set username=
  2. echo username is %username%
  3. set script=F:\x.txt
  4. SET /P VAL=Please input passwd:
  5. sqlplus %username%/%VAL%@uaT_NEW.TPAICDOM.COM @%script%
复制代码

TOP

谢谢,之前也这样测过,但忽然发现原来是多个了分号,这种常规变量用这个方法是可以了。但我要做的脚本中的用户名和脚本名需要延迟变量。
echo username is !user1!
SET /P VAL=Please input passwd:
sqlplus !user1!/%VAL%@devdb_10.100.55.50 @!b!.tmp

这个代码前有个循环,会依次获取到不同的用户名和脚本完整路径。所以暂时想到用延迟变量实现的。不知道这种情况下sqlplus 该怎么去实现,语法一直有问题,没测出来。如果延迟变量在此处无法实现,是否还有其它解决办法呢?

TOP

怎么没有哪位朋友遇到过这样的情况吗,不知道是sqlplus不支持这种延迟变量的用法还是语法有问题,实在头疼

TOP

怎么没有哪位朋友遇到过这样的情况吗,不知道是sqlplus不支持这种延迟变量的用法还是语法有问题,实在头疼

TOP

回复 3# zhl_shanghai


    请贴出完整代码

TOP

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 怎么使用延迟变量了,

TOP

奇怪的是下面这个脚本可以正常执行,也就是可以认为延迟变量的这种用法可行,但实在想不通为什么上面那个脚本却解析有问题,两个脚本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

TOP

回复 7# zhl_shanghai


确保代码中没有@echo off,把完整的执行过程贴出来看看。

Q: 怎样把CMD窗口里的结果复制出来?
A: 右键单击CMD窗口的标题栏->"属性"->"选项"->勾选"快速编辑模式"->然后在CMD窗口用鼠标左键选中想要拷贝的内容->在选中的内容上单击鼠标右键->粘贴到文本文件中即可

顺便把!b!.tmp的内容也贴出来
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

多谢各位,已经解决了,是由于输入的密码变量没有读到,

TOP

返回列表