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


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


101
2017-09-22 23:33




你用“sqlplus .... <scriptname”或“sqlplus ... @scriptname”执行这个?我发现不同的行为取决于您在Unix上执行的操作。 - runrig


答案:


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

echo exit | sqlplus user/pass@connect @scriptname

128
2017-09-23 12:28



凉!你知道如何将“exit”附加到sqlplus会话吗?
sqlplus命令运行脚本然后尝试从标准输入读取更多命令。使用此管道,从标准输入读取将从echo命令读取字符串“exit”,从而导致sqlplus退出。 - Dave Costa
很棒 - 这正是我想要的。谢谢! - JoshL
请注意,您通过unix(ps -ef)上的进程列表公开了您的用户名密码,但我几乎可以肯定它在Windows上的工作方式相同 - Robert Merkwürdigeliebe
stackoverflow.com/questions/1639704/... 和 dba.stackexchange.com/a/65064/16892 描述一些不必在命令行上使用密码的方法...... - rogerdpack


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

echo @scriptname | sqlplus username/password@connect

12
2017-10-26 12:21



虽然这可能在技术上回答了问题,但它基本上与其他答案重复,并且几乎没有增加价值。此外,如果您解释了这些命令正在做什么,它会帮助其他人。谢谢! - Chris S
这对我有用,我发现它比最佳答案更优雅,因为它避免了“退出”。 - Bogdan Calmac


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

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

exit 提供给sqlplus的输出强制它退出。 -S 在脚本中压缩除sql查询之外的所有服务器输出。


12
2018-03-18 21:20



如果使用ssh就是退出|而不是退出|因此,如果稍后编辑该文件以使其退出或退出,则它不会关闭您的ssh会话。如果找不到该文件,则此方法有效。 - Karl Henselin


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

选择*来自双;

放弃;
/

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


11
2017-09-23 16:04



请注意,Dave Costa的答案也是有效的:管道退出(或退出)到sqlplus命令。
感谢/技巧,我一直在寻找这个信息!
斜杠意味着执行SQL缓冲区中的内容。它不执行多个语句,也没有必要执行像“quit”这样的SQLPlus控制命令。如果在交互式SQLPlus提示符下键入“quit”<Enter>,它将立即退出。 - Dave Costa


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

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

你可能需要逃避“;”用\。


6
2017-09-23 12:33





像这样:

sqlplus / nolog userid / password @ tnsname @filename

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

编辑:我的坏,再次使用/ nolog标志


4
2017-09-22 23:43



不幸的是,这不起作用。当我执行批处理文件时,SqlPlus在SQL>提示符下等待用户输入,而不是将控制返回到命令提示符。 - JoshL
对不起,这也不起作用。 / nolog允许sqlplus在不登录的情况下启动。它与完成后退出脚本无关。 - JoshL
嗯,我开始怀疑环境差异。我有很多以这种方式使用sqlplus的bat脚本。
克里斯,你能提供一个有效的例子吗?只是简单的东西运行“选择*来自双重”或其他东西......我已经创建了一些例子来尝试你的建议,但无济于事。请记住,这是在Windows上。 - JoshL
乔希,请看下面的新答案。


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

也就是说,我根本不推荐这种方法 - SQLPlus有许多用于程序化的问题;在过去编写使用Oracle的shell脚本时,我在它周围构建了一个Python包装器(添加了更合理的错误处理行为,stdout / stderr之间的输出理智分离,本机CSV输出支持和其他此类好东西),并且工作正常好多了。


3
2017-09-22 23:40



对于任何其他程序,我会同意你的意见。但是我发现SQLPlus给了我一个关于其他环境(在我的例子中是Perl / DBI / DBD :: Oracle)没有的错误查询的有用上下文。如果你正在做小心的错误处理,那值得痛苦。
此外,根据您对服务器的控制程度,您可能会或可能不会假设可用于shell和SQLPlus的任何内容。很多运行Solaris,HP / UX,AIX等的stixier unix商店使用非常简单的安装,并且不允许你在盒子上安装任何其他东西。请注意,有时一种解决方法是将最小的解释器与应用程序捆绑在一起。 - ConcernedOfTunbridgeWells