【问题标题】:How do I prompt input for database on command line?如何在命令行上提示输入数据库?
【发布时间】:2015-03-27 02:38:47
【问题描述】:

我需要提示输入数据库名称。

但它没有,它仍然连接。它连接到什么数据库?它说“已连接到”

这是批处理代码。

@echo off

sqlplus &username/&password@&db

ECHO About to exit.

timeout t/ 30

:pause

【问题讨论】:

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


【解决方案1】:

与号 (&) 用于 SQL*Plus 替换变量。您在 Windows 命令行上提供它,这意味着其他东西;当您从客户端退出时,您会看到如下内容:

'username' is not recognized as an internal or external command,
operable program or batch file.
'password@' is not recognized as an internal or external command,
operable program or batch file.
'dbname' is not recognized as an internal or external command,
operable program or batch file.

批处理文件会将其视为命令分隔符,因此它不会向 SQL*Plus 传递任何内容,并且只会在程序完成后查看其后的内容。

用户名/密码提示完全独立于您的命令行值。它将在本地连接到您设置的 ORACLE_SID 环境变量,或者如果设置了 TWO_TASK 环境变量,那么它将使用它作为 TNS 连接。

您可以像在your previous question 中尝试的那样在 SQL 脚本中提示这三条信息,或者从批处理文件中提示它们并在命令行中传递它们,如果您想将错误处理为莫菲展示了;但正如我在对该答案的评论中提到的那样,将凭据放在命令行上并不是很安全。您可以使用“heredoc”直接在代码 sn-p 中使用批处理变量,而不是使用 SQL 脚本。

例如,为了模仿您之前所做的事情,您可以将 Mofi 的 sqlplus.exe 行替换为:

@(
echo whenever sqlerror exit failure
echo connect %SqlUserName%/%SqlPassword%@%SqlDatabase%
echo select * from dual;
echo exit 
) | sqlplus.exe -s /nolog

或者从脚本文件运行命令:

@(
echo whenever sqlerror exit failure
echo connect %SqlUserName%/%SqlPassword%@%SqlDatabase%
echo @myscript.sql
echo exit 
) | sqlplus.exe -s /nolog

请注意,由于您在调用脚本之前使用您提供的凭据执行connect,因此脚本本身不应有connect 语句,并且它无法看到您的Windows % 变量。 (可以使它们可见,但我认为您不需要)。另请注意,whenever 语句意味着如果连接失败,它将不会尝试执行脚本。

您可以使用更多echo 语句和/或其他不在脚本中的语句运行任意数量的脚本。但如果任何脚本包含exit,或导致错误退出,则会终止整个会话,而不仅仅是该脚本。


由于您的 SQL 中的任何错误都会导致退出,而不仅仅是凭据问题,因此您会在不想这样做时循环,正如您在评论中指出的那样。您有两种选择:

  • 您可以在connect 语句之后添加whenever sqlerror continue;但是,如果您遇到错误,它将继续并尝试运行后续命令,并且取决于您正在执行的操作,最终可能会产生奇怪的结果。但是,如果您正在创建对象,那么您可能会有保护性下降,您不介意抛出您想忽略的错误。
  • 您可以在连接前使用whenever sqlerror exit 2,在连接后使用whenever sqlerror exit 1。然后,您的批处理脚本可以根据返回值 1 或 2 决定是否循环再次提示。(我不太熟悉 Windows 退出代码,因此其他值可能更适合避免混淆)。

或者您可以将两者混合使用以不同方式处理特定命令的失败,因此您可以忽略 drop 上的错误,但其他任何内容都会退出脚本。取决于您在做什么以及您的详细要求。

Read more about the whenever behaviour.

【讨论】:

  • 我将您的 /nolog 行编辑为:) | sqlplus.exe -s /nolog @C:\Users\njediaz\Desktop\conn.sql .. 这可能吗?
  • 好的,我添加了这一行,if errorlevel 0 sqlplus /nolog @C:\Users\myuser\Desktop\conn.sql,它现在可以工作了。谢谢
  • 这可能吗? if errorlevel 0 sqlplus /nolog @C:\Users\myuser\Desktop\conn.sql .. 它会将 conn.sql 运行到我输入的数据库凭据吗?
  • @ladiesman1792 - 如果您有要运行的脚本,请将其放在示例中,而不是 select from dual;在同一个@(...) 块中,在exit 之前执行echo @myscript.sql。不要启动新的 SQL*Plus 会话,它不会拥有第一个会话的凭据;并且您的脚本中没有connect
  • 好的,我试过了,现在可以了。谢谢。但是当.SQL文件遇到错误时,凭据会再次提示,如何防止这种情况发生?即使 .SQL 文件有错误,我仍然希望它继续。图片供参考->i.imgur.com/70FKfoS.jpg
【解决方案2】:

在运行脚本之前尝试取消定义变量:

undefine username;
undefine password;
undefine db;

并确保在脚本中添加未定义 - 最好在最后完成。

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多