如何在命令行提示输入数据库?

How do I prompt input for database on command line?

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

但它没有,它仍然连接。它连接到什么数据库?它说 "CONNECTED TO "

这是批处理代码。

@echo off

sqlplus &username/&password@&db

ECHO About to exit.

timeout t/ 30

:pause

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

undefine username;
undefine password;
undefine db;

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

& 符号 (&) 用于 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 传递任何内容,并且只会在该程序完成后查看其后的内容。

username/password 提示完全独立于您的命令行值。它将在本地连接到您的 ORACLE_SID 环境变量设置的任何内容,或者如果您的 TWO_TASK 环境变量已设置,那么它将使用它作为 TNS 连接。

您可以像在 中尝试的那样在 SQL 脚本中提示输入这三条信息,或者从批处理文件中提示输入它们并在命令行上传递它们,在如果您想像 Mofi 显示的那样处理错误,请循环;但正如我在对该答案的评论中提到的那样,将凭据放在命令行上并不是很安全。您可以使用 'heredoc' 直接在代码片段中使用批处理变量,而不是使用 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 语句,and/or 其他不在脚本中的语句。但是,如果任何脚本包含 exit,或导致错误退出,这将终止整个会话,而不仅仅是该脚本。


由于 SQL 中的任何错误都会导致退出,而不仅仅是凭据问题,正如您在评论中指出的那样,您会在不想的时候四处走动。您有几个选择:

  • 可以在connect语句后加上whenever sqlerror continue;但是如果你遇到错误,它会继续并尝试 运行 后续命令,并且根据你正在做的事情可能会得到奇怪的结果。但是,如果您正在创建对象,那么您可能会有保护性的掉落,您不介意抛出您想忽略的错误。
  • 您可以在连接前使用 whenever sqlerror exit 2,在连接后使用 whenever sqlerror exit 1。然后您的批处理脚本可以根据 return 值 1 或 2 决定是否循环再次提示。(我不太熟悉 Windows 退出代码,因此其他值可能更适合避免混乱)。

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

Read more about the whenever behaviour.