【问题标题】:Batch file hangs at SQL Error批处理文件在 SQL 错误时挂起
【发布时间】:2015-02-05 19:49:26
【问题描述】:

我正在使用一个批处理文件 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

请告诉我如何忽略此错误消息并让我的脚本继续运行?

【问题讨论】:

标签: sql windows oracle batch-file


【解决方案1】:

您可以在 SQL 脚本中包含 whenever sqlerror exit failure,但因为您只在成功连接后运行它,它不会捕获此错误。

您可以在不登录的情况下启动 SQL*Plus,使用 /nolog 开关,然后显式连接:

@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 语句直接放在批处理文件中,方法是回显这些语句而不是 @ 启动命令;效果相同,但需要维护的文件更少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多