Database 命令行SQL无效凭据

Database 命令行SQL无效凭据,database,oracle,batch-file,command-line,sqlplus,Database,Oracle,Batch File,Command Line,Sqlplus,当我输入无效值或SQL未连接时,如何使用户名、密码和数据库名输入重新出现 在上图之后,命令行将关闭 这是批处理(.bat)文件 这是conn.sql文件 conn &&username@&&DBNAME SPOOL C:\Sample.log SELECT 1 FROM DUAL / SPOOL OFF EXIT 根据,可以在命令行sqlplus.exe上指定用户名、密码和数据库 @echo off setlocal set "SqlUserName="

当我输入无效值或SQL未连接时,如何使用户名、密码和数据库名输入重新出现

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

这是批处理(.bat)文件

这是conn.sql文件

conn &&username@&&DBNAME


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

EXIT
根据,可以在命令行sqlplus.exe上指定用户名、密码和数据库

@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
我没有sqlplus.exe来测试它,但是下面类似的内容应该可以与文件conn.sql的适当内容配合使用

@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个环境变量的值可以在命令上方插入的其他批处理行上再次使用

@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
Edit:添加了一个简单循环,以防sqlplus.exe退出时出现任何大于或等于1的代码。批处理代码的用户可以只按RETURN键或ENTER键使用以前输入的用户名、密码或数据库名。最终的解决方案很可能比这里发布的更好,因为再次输入凭据只应在访问数据库时出错,而不应在其他错误时执行。因此批处理文件必须区分SQL*PLUS返回的各种退出代码

另请参见有关堆栈溢出问题的答案和

唯一的区别是,在Unix shell脚本中,如果[$?!=0]相当于Windows批处理文件中的
如果errorlevel 1
(如果退出代码不是负数,这通常是真的)。请参阅Microsoft支持文章和关于使用批处理文件评估退出代码的说明

@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:

ECHO的哪些输出将退出%errorlevel%?如果发生无效凭证错误,我们假设
1017
?然后
如果%errorlevel%eq 1017 goto:back
可能会有帮助,我无法回显,因为我正在尝试通过.SQL文件进行连接。我正在处理这样的事情:
@ECHO off sqlplus&&user@&&db/nolog@C:\Users\njediaz\Desktop\conn.SQL ECHO即将退出。超时t/30:再次暂停
:将批处理脚本中的
ECHO即将退出
行替换为
ECHO即将退出%errorlevel%
。运行更改后的脚本,输入错误的用户名或密码,然后告诉我们您可以看到的输出。如果在
conn.sql
文件中更改为
EXIT 12345
,应该有一个关于该如何操作的数字?运行批处理,放置正确的凭据。现在输出什么?对我不起作用。输入无效凭据后,命令行仍将关闭。@ladiesman1792-
-L
标志将再次停止SQL*Plus提示,但这可能是您想要的,因为您希望分别获取这三个元素,因此需要在批处理脚本中使用循环来提示并重复运行。但是,将凭据放在命令行上并不像其他进程看到的那样安全。它不会返回到“:credentials”。当我输入无效凭据时仍然关闭。