命令行SQL无效凭据

时间:2015-01-28 01:25:14

标签: database oracle batch-file command-line sqlplus

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

Sample

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

这是批处理(.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

2 个答案:

答案 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 FilesCorrect 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?