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

评论

您要使用“ sqlplus ....

#1 楼

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

echo exit | sqlplus user/pass@connect @scriptname


评论


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

–anjanb
08-09-23在20:55

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

–戴夫·科斯塔(Dave Costa)
08-09-24在13:42

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

–罗布·范·拉霍芬(Rob van Laarhoven)
2011年3月9日在10:01



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

–rogerdpack
15年2月18日在20:52

为了避免暴露密码,您可以使用echo exit | sqlplus /作为sysdba @scriptname

–奥利维尔
19年5月15日在12:26

#2 楼

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

echo @scriptname | sqlplus username/password@connect


评论


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

–克里斯S
2012年10月26日13:13

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

– Bogdan Calmac
2014年4月3日在1:02

#3 楼

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

select * from dual;

quit;
/


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

评论


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

–克里斯·诺(Chris Noe)
08-09-23在16:42

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

– PhiLho
09年4月28日在9:29

斜杠表示执行SQL缓冲区中的内容。它不会执行多个语句,也不需要执行SQLPlus控制命令(例如“ quit”)。如果在交互式SQLPlus提示符下键入“ quit” ,它将立即退出。

–戴夫·科斯塔(Dave Costa)
2014年8月28日在22:56

#4 楼

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

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


exit提供给sqlplus的输出,强制其退出。 -S在脚本中取代了所有的服务器输出,而不是sql查询。

评论


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

–卡尔·汉森(Karl Henselin)
16 Dec 9'在17:25

#5 楼

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

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


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

评论


它有效,救生员!

–于阳健
20年8月1日在5:49

#6 楼

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

那,我不建议在以下位置使用此方法全部-SQLPlus具有大量可用于程序设计的陷阱;在过去使用Oracle编写Shell脚本时,我围绕它构建了一个Python包装器(添加了更合理的错误处理行为,stdout / stderr之间的输出合理分离,本机CSV输出支持以及其他类似的东西),并且有效好多了。

评论


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

–匿名
08-09-22在23:55

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

– ConcernedOfTunbridgeWells
2010年6月30日9:32

#7 楼

像这样:

sqlplus /nolog userid/password@tnsname @filename


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

EDIT :我不好,请使用/ nolog标志重试

评论


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

– JoshL
08-09-23在0:05

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

– JoshL
08-09-23在13:44

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

–克里斯·诺(Chris Noe)
08/09/23在14:35

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

– JoshL
08/09/23在14:37

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

–克里斯·诺(Chris Noe)
08-09-23在16:04

#8 楼

对于那些担心在脚本中包含密码的安全性的人,AskTom上有一篇有关“外部标识”的文章。
http://asktom.oracle.com/pls/apex/f?p=100:11:0 :::: P11_QUESTION_ID:142212348066

评论


尽管从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。

–斯科特包
2012年10月11日18:31



#9 楼

另一个适用于Linux的不带管道或派生其他子shell /进程的问题

sqlplus -S dbuser/dbpasswd@dbsid @scriptname </dev/null


@scriptname完成后,sqlplus等待用户输入。
在这种情况下,由于这个原因,sqlplus从/dev/null读取文件的结尾并退出。

评论


这个问题的最干净的答案。

– Cristik
20年8月20日在16:22

#10 楼

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

myLOG.LOG

我的test.sql文件包含以下内容:
从双选中选择*;
退出

评论


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

– JoshL
09年6月19日在21:18

#11 楼

退出SQLPLUS / @ @

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