【问题标题】:Command line SQL invalid credentials命令行 SQL 无效凭据
【发布时间】:2015-03-26 19:32:46
【问题描述】:

当我输入无效值或 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

【问题讨论】:

  • ECHO About to exit %errorlevel% 的输出是什么?如果发生 invalid credential 错误,假设1017?那么if %errorlevel% EQU 1017 goto :back 可以提供帮助
  • 我无法 ECHO,因为我正在尝试通过 .SQL 文件进行连接。
  • 我正在做一些看起来像这样的事情:@echo off sqlplus &&user@&&db /nolog @C:\Users\njediaz\Desktop\conn.sql ECHO About to exit. timeout t/ 30 :pause
  • 再一次:将批处理脚本中的ECHO About to exit 行替换为ECHO About to exit %errorlevel%。运行更改后的脚本,输入错误的用户名或密码,然后告诉我们您可以看到什么作为输出。应该有数字
  • 如果在您的conn.sql 文件中更改为EXIT 12345 会怎样?运行批处理,放入 right 凭据。现在有什么输出?

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


【解决方案1】:

批处理文件

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

【讨论】:

    【解决方案2】:

    根据Oracle 11g – SQLPlus Command Line OptionsStarting SQLPlus可以在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

    【讨论】:

    • 这对我不起作用。输入无效凭据后,命令行仍然关闭。
    • @ladiesman1792 - -L 标志再次停止 SQL*Plus 提示,但这可能是您想要的,因为您想分别获取三个元素,因此您需要在批处理脚本中进行循环提示并重复运行。但是,将凭据放在命令行上并不像其他进程可见那样安全。
    • 它没有返回到 ':Credentials'。当我输入无效凭据时仍然关闭。
    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多