运行Oracle SQL脚本并通过命令提示符从sqlplus.exe退出


114

我想通过Windows命令提示符通过SQL Plus运行Oracle脚本。该脚本不包含“退出”命令,但是我仍然希望SQL Plus退出,在脚本完成时将控制权返回给命令提示符。我的目标是无需修改脚本即可执行此操作。这可能吗?


您要使用“ sqlplus .... <scriptname”或“ sqlplus ... @scriptname”来执行此操作吗?我发现不同的行为取决于您在Unix上执行的行为。
runrig 2011年

Answers:


140

另一种方法是在批处理文件中使用此命令:

echo exit | sqlplus user/pass@connect @scriptname

1
凉!您知道“出口”如何附加到sqlplus会话吗?

6
sqlplus命令运行脚本,然后尝试从标准输入中读取更多命令。使用此管道,从标准输入中读取将读取echo命令中的字符串“ exit”,从而导致sqlplus退出。
戴夫·科斯塔

太好了-这正是我想要的。谢谢!
JoshL

4
请注意,您是通过unix(ps -ef)上的进程列表公开您的用户名密码的,但我几乎可以肯定,它在Windows上的工作方式相同
RobertMerkwürdigeliebe2011年

3
stackoverflow.com/questions/1639704/…dba.stackexchange.com/a/65064/16892描述了一些不必在命令行上使用密码的方法...
rogerdpack 2015年

13

我发现这是最好的解决方案,它可以在终端或脚本中运行:

echo @scriptname | sqlplus username/password@connect

1
虽然从技术上讲这可以回答问题,但基本上是其他答案的重复,几乎没有任何价值。另外,如果您解释了这些命令的作用,则对其他人也有帮助。谢谢!
克里斯·S

5
这对我有用,我发现它比最佳答案更优雅,因为它避免了“退出”。
Bogdan Calmac

12

现在意识到您的问题可能出在sql文件本身上,意识到需要告诉sqlplus退出。我这样做的方式是:

从双选*;

放弃;
/

(斜杠很重要。它告诉sqlplus执行其上方的statemet。)


请注意,Dave Costa的答案也适用:将退出(或退出)管道传递到sqlplus命令中。

感谢您的/技巧,我一直在寻找此信息!

2
斜杠表示执行SQL缓冲区中的内容。它不会执行多个语句,也不需要执行诸如“ quit”之类的SQLPlus控制命令。如果在交互式SQLPlus提示符下键入“ quit” <Enter>,它将立即退出。
戴夫·科斯塔

12

隐藏用户信息和退出的最佳方法是:

exit | sqlplus -S user/pwd@server @script.sql

exit提供给sqlplus的输出,强制其退出。-S禁止脚本中除sql query之外的所有服务器输出。


2
如果使用ssh是要退出的| 而不是退出| 因此,如果稍后对该文件进行编辑以使其退出或退出,则它不会关闭ssh会话。如果也找不到该文件,则此方法有效。
Karl Henselin '16

6

您也可以在Shell脚本中执行此操作。

sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF

您可能需要转义“;” 用\。


3

是的,有可能-生成一个包装器脚本,该脚本适当地设置SQLPlus,包括您的脚本(即@YourTargetScript.sql),然后退出。

就是说,我根本不推荐这种方法,因为SQLPlus有很多可用于程序设计的陷阱。过去使用Oracle编写Shell脚本时,我围绕它构建了一个Python包装器(添加了更合理的错误处理行为,stdout / stderr之间输出的合理分离,本机CSV输出支持以及其他类似的东西),并且可以正常工作好多了。


对于任何其他程序,我都同意。但是,我发现SQLPlus在错误的查询中为我提供了有用的上下文,而其他环境(在我的情况下为Perl / DBI / DBD :: Oracle)却没有。如果您正在认真处理错误,那是值得的。

另外,根据对服务器的控制程度,您可能会或可能不会假设只能使用Shell和SQLPlus。许多运行Solaris,HP / UX,AIX之类的比较笨拙的unix商店都使用非常裸露的安装,不允许您在盒子上安装其他任何东西。请注意,有时解决此问题的方法只是将最小的解释器与您的应用程序捆绑在一起。
ConcernedOfTunbridgeWells

3

像这样:

sqlplus / nolog用户ID /密码@tnsname @文件名

如果将其放在批处理文件中,控制将继续其后的语句。

编辑:我不好,请使用/ nolog标志再试一次


不幸的是,这不起作用。当我执行批处理文件时,SqlPlus在SQL>提示符下等待用户输入,而不是将控制权返回给命令提示符。
JoshL

抱歉,这也不起作用。/ nolog允许sqlplus在不登录的情况下启动。它与完成脚本时退出脚本无关。
JoshL

嗯,我开始怀疑环境差异。我有许多以这种方式使用sqlplus的蝙蝠脚本。

克里斯,你能提供一个可行的例子吗?只是运行“ select * from dual”的简单方法或其他方法...我已经创建了一些示例来尝试您的建议,但无济于事。请记住,这是在Windows上。
JoshL

乔什,请参见下面的新答案。


0

在您的SQL脚本中添加EXIT。这是我的test.bat文件具有以下示例:

sqlplus用户/ pwd @ server @ test.SQL> myLOG.LOG

我的test.sql文件具有以下内容:选择* from dual; 出口


很好,但不满足不修改脚本以包含exit / quit语句的要求。目的是这些脚本可以由SQL Plus的DBA运行,也可以从批处理文件运行。
JoshL 2009年

0

退出 SQLPLUS / @ @

这是正确的解决方案,我已经尝试过了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.