我需要提示输入DATABASE NAME。
但它没有,它仍然连接。它连接的数据库是什么?它表示"已连接到"
这是批次代码。
@echo off
sqlplus &username/&password@&db
ECHO About to exit.
timeout t/ 30
:pause
答案 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
上的错误,但是其他任何东西都会退出脚本。取决于您正在做什么以及您的详细要求。
答案 1 :(得分:0)
在运行脚本之前尝试取消定义变量:
undefine username;
undefine password;
undefine db;
并确保在脚本中添加undefines - 最好在最后完成。