命令行 SQL 无效凭据

Command line SQL invalid credentials

当我输入无效值或 SQL 未连接时,如何使 USERNAME、PASSWORD 和 DATABASENAME INPUT 重新出现?

在上图之后,命令行将关闭。

这是批处理 (.bat) 文件。

@echo off

sqlplus /nolog @C:\Users\myuser\Desktop\conn.sql

ECHO About to exit.

timeout t/ 30

:pause

这是 conn.sql 文件

conn &&username@&&DBNAME


SPOOL C:\Sample.log
SELECT 1 FROM DUAL /
SPOOL OFF

EXIT

根据Oracle 11g – SQLPlus Command Line Options and Starting SQLPlus,可以在sqlplus.exe.

的命令行中指定用户名、密码和数据库

我没有 sqlplus.exe 来测试它,但是像下面这样的东西应该与文件 [=45 的适当适应内容一起工作=].

@echo off
setlocal
set "SqlUserName="
set "SqlPassword="
set "SqlDatabase="
:Credentials
set /P "SqlUserName=Enter username: "
set /P "SqlPassword=Enter password: "
set /P "SqlDatabase=Enter database: "
sqlplus.exe -L "%SqlUserName%/%SqlPassword%@%SqlDatabase%" /nolog @C:\Users\myuser\Desktop\conn.sql
if errorlevel 1 goto Credentials
echo About to exit.
timeout /t 30
endlocal

您可以进一步增强此批处理代码,例如使用代码来检查批处理用户是否真的输入了用户名、密码和数据库。

3 个环境变量的值可以在命令上方插入的其他批处理行中再次使用 endlocal

编辑: 添加了一个简单的循环,以防 sqlplus.exe 以大于或等于 1 的任何代码退出。用户批处理代码有可能只需按 RETURN 键或 ENTER 键即可使用之前输入的用户名、密码或数据库名称。最终解决方案很可能比此处发布的解决方案更好,因为再次输入凭据应该只在访问数据库时出现错误而不是在其他错误时进行。所以批处理文件必须区分 SQL*PLUS.

返回的各种退出代码

另请参阅 Stack Overflow 问题的答案 Sql*plus always return exit code 0? and How do I capture a SQLPlus exit code within a shell script?

唯一的区别是,在 Unix shell 脚本中,if [ $? != 0 ] 等同于 Windows 批处理文件中的 if errorlevel 1(如果退出代码不是负数,则为通常为真)。请参阅有关使用 if errorlevel.

评估退出代码的 Microsoft 支持文章 Testing for a Specific Error Level in Batch Files and Correct Testing Precedence of Batch File ERRORLEVELs

批处理文件

@echo off
setlocal
set "SqlUserName="
set "SqlPassword="
set "SqlDatabase="
:Credentials
set /P "SqlUserName=Enter username: "
set /P "SqlPassword=Enter password: "
set /P "SqlDatabase=Enter database: "
@(
echo whenever sqlerror exit failure
echo connect %SqlUserName%/%SqlPassword%@%SqlDatabase%
echo select * from dual;
echo exit 
) | sqlplus.exe -s /nolog 
if errorlevel 1 goto Credentials
if errorlevel 0 sqlplus /nolog  @C:\Users\myuser\Desktop\conn.sql 
echo About to exit.
timeout /t 30
endlocal

Conn.sql

SPOOL C:\Sample.log
SELECT 1 FROM DUAL /
SPOOL OFF

EXIT

感谢 Mofi 和 Alex: