【发布时间】:2020-04-17 17:29:00
【问题描述】:
我想通过 Windows 命令提示符通过 SQL Plus 运行 Oracle 脚本。该脚本不包含“退出”命令,但我仍然希望 SQL Plus 退出,在脚本完成后将控制权返回到命令提示符。我的目标是在修改脚本的情况下做到这一点。这可能吗?
【问题讨论】:
-
你是用“sqlplus ....
标签: command-line-interface oracle sqlplus
我想通过 Windows 命令提示符通过 SQL Plus 运行 Oracle 脚本。该脚本不包含“退出”命令,但我仍然希望 SQL Plus 退出,在脚本完成后将控制权返回到命令提示符。我的目标是在修改脚本的情况下做到这一点。这可能吗?
【问题讨论】:
标签: command-line-interface oracle sqlplus
另一种方法是在批处理文件中使用这个命令:
echo exit | sqlplus user/pass@connect @scriptname
【讨论】:
我发现这是最好的解决方案,它可以在终端或脚本中工作:
echo @scriptname | sqlplus username/password@connect
【讨论】:
隐藏用户信息和退出的最佳方法是:
exit | sqlplus -S user/pwd@server @script.sql
exit 提供给 sqlplus 的输出,强制它退出。 -S 禁止脚本中除 sql 查询以外的所有服务器输出。
【讨论】:
现在意识到您的问题可能出在 sql 文件本身,意识到需要告知 sqlplus 退出。我这样做的方法是:
从对偶中选择 *; 退出; /(斜线很重要。它告诉 sqlplus 执行上面的 statemet。)
【讨论】:
您也可以在您的 shell 脚本中执行此操作。
sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF
您可能需要转义“;”用 \.
【讨论】:
是的,有可能——生成一个适当设置 SQLPlus 的包装脚本,包含您的脚本(即@YourTargetScript.sql),然后退出。
也就是说,我根本不推荐这种方法——SQLPlus 有很多程序化使用的陷阱;在过去编写使用 Oracle 的 shell 脚本时,我围绕它构建了一个 Python 包装器(添加了更合理的错误处理行为、stdout/stderr 之间的合理输出分离、原生 CSV 输出支持和其他类似的好东西),并且有效好多了。
【讨论】:
像这样:
sqlplus /nolog userid/password@tnsname @filename
如果你把它放在一个批处理文件中,控制将继续它后面的语句。
编辑:我的错,用 /nolog 标志再试一次
【讨论】:
对于那些担心将密码包含在脚本中的安全性的人,AskTom 有一篇关于“外部识别”的文章 http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:142212348066
【讨论】:
在您的 SQL 脚本中添加 EXIT。这是示例 我的 test.bat 文件有以下内容:
sqlplus 用户/pwd@server @test.SQL > myLOG.LOG
我的 test.sql 文件有以下内容: 从对偶中选择 *; 退出
【讨论】:
另一个用于 Linux 的,没有管道或分叉另一个子 shell/进程
sqlplus -S dbuser/dbpasswd@dbsid @scriptname </dev/null
@scriptname 完成后,sqlplus 等待用户输入。
在这种情况下,sqlplus 会从/dev/null 读取文件结尾并退出。
【讨论】:
退出 | SQLPLUS /@@
这是正确的解决方案,我已经尝试过了
【讨论】: