如何使 Oracle sqlplus 命令行实用程序成为非交互式的?

How to make Oracle sqlplus command line utility non-interactive?

我在 bash 脚本中调用 sqlplus,提供了一些参数,但可能存在某些参数不正确的情况,例如用户名。在这种情况下 sqlplus 会报告用户名或密码无效的错误,并提示用户输入用户名。不需要该提示。我希望 sqlplus 只在 stderr 上报告错误,退出并使用错误代码退出。完全非交互地执行。

例如,bash 脚本这样调用 sqlplus

sqlplus $username/$password@ORCLPDB1 @script.sql

如果$username变量不正确(比如这样的用户不存在),它会报告错误并一直等待用户输入新的用户名到stdin。 sqlplus 是否有任何错误立即退出的功能,而不提示任何内容?如果没有,是否有任何简单直接的解决方法?

有一个 -s 标志可以停止任何输入提示。

这里有更多详细信息:

http://www.dbatoolz.com/t/sqlplus-s-shell-scripting.html

看起来如果 sqlplus 将其所有命令通过管道传输到其标准输入中,它实际上不会提示用户输入任何内容,无论是否提供 -S 标志。同样在这种情况下, @script.sql 参数似乎被忽略了(如果作为命令行参数给出,它不会被执行)。因此,要执行脚本以便没有提示和错误使 sqlplus 实际上以错误代码退出,您必须这样调用 sqlplus:

sqlplus /nolog <<EOF
whenever sqlerror exit sql.sqlcode
connect $username/$password @ORCLPDB1
@script.sql
EOF

$? 变量在出错时填充,但错误代码本身对我来说意义不大。它不是指 ORA-XXXXX 方案中的数字。

sqlplus -L $username/$password@ORCLPDB1 @script.sql 应该可以。 -L 选项确保 sqlplus 不会提示输入无效的用户名 and/or 密码并且能够从 shell.

退出