找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30702|回复: 9

[代码合集] 求助一下批处理sqlplus 实现执行动态sql脚本

[复制链接]
发表于 2012-11-16 23:27:08 | 显示全部楼层 |阅读模式
请教一下各位强人,小弟最近碰到个麻烦,想用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. 不知道如何实现,最好是可以给出变量为延迟变量的实现方法。

小弟在线等,不盛感激!
发表于 2012-11-16 23:33:02 | 显示全部楼层
  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%
复制代码
 楼主| 发表于 2012-11-16 23:58:17 | 显示全部楼层
谢谢,之前也这样测过,但忽然发现原来是多个了分号,这种常规变量用这个方法是可以了。但我要做的脚本中的用户名和脚本名需要延迟变量。
echo username is !user1!
SET /P VAL=Please input passwd:
sqlplus !user1!/%VAL%@devdb_10.100.55.50 @!b!.tmp

这个代码前有个循环,会依次获取到不同的用户名和脚本完整路径。所以暂时想到用延迟变量实现的。不知道这种情况下sqlplus 该怎么去实现,语法一直有问题,没测出来。如果延迟变量在此处无法实现,是否还有其它解决办法呢?
 楼主| 发表于 2012-11-17 12:21:45 | 显示全部楼层
怎么没有哪位朋友遇到过这样的情况吗,不知道是sqlplus不支持这种延迟变量的用法还是语法有问题,实在头疼
 楼主| 发表于 2012-11-17 12:22:08 | 显示全部楼层
怎么没有哪位朋友遇到过这样的情况吗,不知道是sqlplus不支持这种延迟变量的用法还是语法有问题,实在头疼
发表于 2012-11-18 07:58:36 | 显示全部楼层
回复 3# zhl_shanghai


    请贴出完整代码
 楼主| 发表于 2012-11-19 11:44:57 | 显示全部楼层
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 怎么使用延迟变量了,
 楼主| 发表于 2012-11-19 16:03:06 | 显示全部楼层
奇怪的是下面这个脚本可以正常执行,也就是可以认为延迟变量的这种用法可行,但实在想不通为什么上面那个脚本却解析有问题,两个脚本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
发表于 2012-11-20 00:20:11 | 显示全部楼层
回复 7# zhl_shanghai


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

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

顺便把!b!.tmp的内容也贴出来
 楼主| 发表于 2012-11-20 17:31:04 | 显示全部楼层
多谢各位,已经解决了,是由于输入的密码变量没有读到,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 19:11 , Processed in 0.063159 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表