当我输入无效值或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
答案 0 :(得分:2)
根据Oracle 11g – SQLPlus Command Line Options 和Starting SQL Plus,可以在 sqlplus.exe的命令行中指定用户名,密码和数据库强>
我没有 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个环境变量的值可以在命令 endlocal 上方插入的其他批次行上重复使用。
修改:如果 sqlplus.exe 退出时添加了一个简单的循环,任何代码大于或等于1.批处理代码的用户有可能只是命中键RETURN或ENTER使用之前输入的用户名,密码或数据库名称。最终的解决方案必须比这里发布的更好,因为再次输入凭证应该只在访问数据库时出错而不是其他错误。因此批处理文件必须区分SQL * PLUS返回的各种退出代码。
另请参阅Stack Overflow问题Sql*plus always return exit code 0?和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和Correct Testing Precedence of Batch File ERRORLEVELs。
答案 1 :(得分:0)
批处理文件
@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:How do I prompt input for database on command line?