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

时间:2015-01-28 08:59:07

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

我需要提示输入DATABASE NAME。

但它没有,它仍然连接。它连接的数据库是什么?它表示"已连接到"

enter image description here

这是批次代码。

@echo off

sqlplus &username/&password@&db

ECHO About to exit.

timeout t/ 30

:pause

2 个答案:

答案 0 :(得分:4)

&符号(&)用于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脚本中提示三条信息,或者从批处理文件中提示它们并在命令行中传递它们,如果要处理则在循环中传递它们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语句和/或不在脚本中的其他语句来运行任意数量的脚本。但是,如果任何脚本包含exit,或导致退出错误,那将终止整个会话而不仅仅是该脚本。


由于SQL中的任何错误都会导致退出,而不仅仅是凭据问题,因此,如您在评论中所述,当您不想这样做时,您就会循环。你有几个选择:

  • 您可以在whenever sqlerror continue声明后添加connect;但是如果你遇到错误,它会继续并尝试运行后续命令,并且取决于你正在做什么可能会导致奇怪的结果。但是,如果您正在创建对象,那么您可能会有保护性的掉落,而不必担心会抛出您想忽略的错误。
  • 您可以在连接前使用whenever sqlerror exit 2,在其后使用whenever sqlerror exit 1。然后,您的批处理脚本可以根据返回值1或2来决定是否循环再次提示。(我不熟悉Windows退出代码,因此其他值可能更适合避免混淆)。

或者你可以将两者混合在一起,以便以不同方式处理特定命令的失败,所以你忽略drop上的错误,但是其他任何东西都会退出脚本。取决于您正在做什么以及您的详细要求。

Read more about the whenever behaviour

答案 1 :(得分:0)

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

undefine username;
undefine password;
undefine db;

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