我正在使用批处理文件 my.bat ,如下所示:
@echo off
setlocal enabledelayedexpansion
for /F "tokens=*" %%A in (user.txt) do (
sqlplus -s -l %%A @fetch.sql
) >> output.txt
其中 user.txt (我需要有效期限的所有用户详细信息列表。此列表可能有大约40-50行)是:
dbuser/password@database1
readuser/p@ssw0rd@database1
adminuser/Pa$$word@database2
.......
.......
.......
和 fetch.sql 是:
set pagesize 200
set linesize 200
select username, expiry_date from user_users;
exit;
我面临的问题是,脚本my.bat在此处捕获output.txt中所有必需的详细信息以及SQL错误(ORA-01017:无效的用户名/密码;登录被拒绝,ORA-12154:TNS:无法解析指定的连接标识符,ORA-28000:帐户被锁定)但是当它遇到以下错误消息时它会被挂起:
ERROR:
ORA-28001: the password has expired
Changing password for readuser
请您告诉我如何忽略此ERROR消息并让我的脚本继续运行?
答案 0 :(得分:1)
您可以在SQL脚本中使用whenever sqlerror exit failure
,但因为您只在成功连接后才运行它,所以它不会捕获此错误。
您可以在不登录的情况下使用/nolog
开关启动SQL * Plus,然后显式连接:
@echo off
setlocal enabledelayedexpansion
for /F "tokens=*" %%A in (user.txt) do (
(
echo whenever sqlerror exit failure
echo connect %%A
echo @fetch.sql
) | sqlplus -s /nolog
) >> output.txt
这也意味着您的凭据不在命令行中提供;不太了解Windows,但在其他平台上存在相当大的安全风险。当然,你仍然将它们存储在一个纯文本文件中,这个文件本身并不是很安全,所以这更像是一个普遍的观点。
如果您愿意,可以将fetch.sql
语句直接放在批处理文件中,方法是回复那些语句而不是@
启动命令;相同的效果,但要维护的文件少一个。