【问题标题】:Run Oracle SQL script and exit from sqlplus.exe via command prompt运行 Oracle SQL 脚本并通过命令提示符退出 sqlplus.exe
【发布时间】:2020-04-17 17:29:00
【问题描述】:

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

【问题讨论】:

  • 你是用“sqlplus ....

标签: command-line-interface oracle sqlplus


【解决方案1】:

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

echo exit | sqlplus user/pass@connect @scriptname

【讨论】:

  • 酷!你知道“退出”是如何附加到 sqlplus 会话的吗?
  • sqlplus 命令运行脚本,然后尝试从标准输入读取更多命令。使用此管道,从标准输入读取将读取 echo 命令中的字符串“exit”,导致 sqlplus 退出。
  • 请注意,您会通过 unix (ps -ef) 上的进程列表公开您的用户名密码,但我几乎可以肯定它在 Windows 上的工作方式相同
  • stackoverflow.com/questions/1639704/…dba.stackexchange.com/a/65064/16892 描述了一些不必在命令行上使用密码的方法...
  • 为了避免暴露密码,可以使用 echo exit |sqlplus / as sysdba @scriptname
【解决方案2】:

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

echo @scriptname | sqlplus username/password@connect

【讨论】:

  • 虽然这可能在技术上回答了这个问题,但它基本上是其他答案的重复并且几乎没有增加价值。此外,如果您解释了这些命令的作用,它将对其他人有所帮助。谢谢!
  • 这对我有用,我发现它比最佳答案更优雅,因为它避免了“退出”。
【解决方案3】:

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

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

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

【讨论】:

  • 如果使用ssh是为了做退出|而不是退出|这样,如果稍后编辑文件以退出或退出,它就不会关闭您的 ssh 会话。如果也找不到该文件,则此方法有效。
【解决方案4】:

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

从对偶中选择 *; 退出; /

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

【讨论】:

  • 请注意,Dave Costa 的回答也有效:通过管道退出(或退出)到 sqlplus 命令中。
  • 感谢 / 技巧,我正在寻找此信息!
  • 斜线表示执行 SQL 缓冲区中的内容。它不执行多条语句,也不需要执行 SQLPlus 控制命令,如“quit”。如果在交互式 SQLPlus 提示符下键入“quit”,它将立即退出。
【解决方案5】:

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

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

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

【讨论】:

  • 它有效,救生员!
【解决方案6】:

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

也就是说,我根本不推荐这种方法——SQLPlus 有很多程序化使用的陷阱;在过去编写使用 Oracle 的 shell 脚本时,我围绕它构建了一个 Python 包装器(添加了更合理的错误处理行为、stdout/stderr 之间的合理输出分离、原生 CSV 输出支持和其他类似的好东西),并且有效好多了。

【讨论】:

  • 对于任何其他程序,我都会同意你的看法。但我发现 SQLPlus 为我提供了其他环境(在我的情况下为 Perl/DBI/DBD::Oracle)没有的错误查询的有用上下文。如果您正在仔细地处理错误,那是值得的。
  • 此外,根据您对服务器的控制程度,您可能会或可能无法假设除了 shell 和 SQLPlus 之外的任何东西都可用。很多运行 Solaris、HP/UX、AIX 等的更笨重的 unix 商店都使用非常简单的安装,并且不会让您在盒子上安装任何其他东西。请注意,有时解决此问题的方法只是将最小解释器与​​您的应用程序捆绑在一起。
【解决方案7】:

像这样:

sqlplus /nolog userid/password@tnsname @filename

如果你把它放在一个批处理文件中,控制将继续它后面的语句。

编辑:我的错,用 /nolog 标志再试一次

【讨论】:

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

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

【讨论】:

  • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
【解决方案9】:

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

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

我的 test.sql 文件有以下内容: 从对偶中选择 *; 退出

【讨论】:

  • 这很好,但不满足在不修改脚本以包含退出/退出语句的情况下执行此操作的要求。目的是这些脚本可以由 DBA 从 SQL Plus 运行,但也可以从批处理文件运行。
【解决方案10】:

另一个用于 Linux 的,没有管道或分叉另一个子 shell/进程

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

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

【讨论】:

  • 这个问题最干净的答案。
【解决方案11】:

退出 | SQLPLUS /@@

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多