【问题标题】:Make SQL*Plus script quit使 SQL*Plus 脚本退出
【发布时间】:2019-06-06 18:44:26
【问题描述】:

我想使用 powershell 自动运行一个目录中的一些 SQL*Plus 脚本。我可以读取目录,但是当我尝试执行脚本时,脚本终止但没有退出 powershell 并转到下一个。

如何让 powershell 退出 SQL*Plus 并自动转到下一个脚本,而无需通过在每个脚本末尾显式添加退出来修改脚本?

下面是最简单形式的图解说明的 powershell 脚本

$Filename=Get-childitem "D:\test\TestSQL" -Filter *.sql | Select -ExpandProperty name
foreach ($f in $Filename)
{
  sqlplus -L -S <username>/<password>@<sid> @$f
}

该目录理论上可以包含数百个脚本,在每个脚本中添加退出命令是不可行的。我想在完成每个脚本后强制 SQL*Plus 退出并继续下一个。

可以这样做吗?

【问题讨论】:

  • 仅供参考,“PL/SQL”、“SQL”和“SQL*Plus”是三个不同的东西。我认为您的意思是 SQL*Plus,它是用于运行查询等的命令行工具。
  • @WilliamRobertson:感谢您澄清术语。我对 oracle 很陌生,并认为 PL/SQL 和 SQL Plus 是相同的东西。我将更正措辞以避免混淆。是的,从您所说的来看,SQL*Plus 似乎更合适。再次感谢。
  • 也许您可以即时构建一个临时 SQL*Plus 脚本,该脚本调用每个 .sql 脚本,然后在最后退出。它甚至可以通过打印文件名和时间戳来增加一些价值。
  • 实际上,我在serverfault.com/q/87035/352734 上找到了更好的方法 - 刚刚添加了答案。顺便说一句,好问题。
  • @WilliamRobertson:构建脚本来运行脚本也可以,但您建议的方法肯定更干净、更好。非常感谢!

标签: oracle powershell sqlplus


【解决方案1】:

您可以将单词exit 通过管道传输到SQL*Plus 命令行中。例如,如果 demo.sql 包含以下内容:

prompt This is my demo script

那么你可以这样称呼它:

echo exit | sqlplus william/w @demo.sql

输出:

Y:\SQL>echo exit | sqlplus william/w @demo.sql

SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 13 10:47:13 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Last Successful login time: Sun Jan 13 2019 10:46:03 +00:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


This is my demo script
SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Y:\SQL>

或者使用-s(静音)选项来抑制横幅等:

Y:\SQL>echo exit | sqlplus -s william/w @demo.sql

This is my demo script

Y:\SQL>

在 Windows 10 上使用 SQL*Plus 12.2 测试。

(来自https://serverfault.com/q/87035/352734 - 事实证明它适用于 Windows 和 Linux。)

您还可以查看避免处理用户名和密码的选项,例如这里:https://dba.stackexchange.com/a/109170/103604

【讨论】:

  • 你的建议就像一个魅力......干净高效。谢谢!
  • 实际上,似乎在 Windows 上将任何内容通过管道传输到 SQL*Plus 会导致它退出,例如echo set time on | sqlplus un/pw@db.
【解决方案2】:

我不熟悉 plsql,但我认为 sqlplus 是一个执行 plsql 脚本的 exe。如果 PowerShell 没有继续执行下一个脚本,那是因为 sqlplus 没有退出。一点谷歌搜索表明结束 pssql 脚本的正确方法是在最后一行放置一个正斜杠:

/

据我了解,这告诉 sqlplus 执行上面的所有内容,没有它 sqlplus 将不会终止。

你说:

在每个脚本中添加退出命令是不可行的

但据我所知,这正是你必须要做的。

幸运的是,PowerShell 也可以提供帮助。只需导航到包含脚本的目录并执行以下操作:

dir *.sql | add-content -value "/"

【讨论】:

  • 谢谢你,杰森。将在星期一给它一个漩涡,让你知道。会将您的回复标记为答案,以便其他人在遇到相同问题时可以轻松参考。
  • 缺少/ 有时可能是个问题,但添加一个不会使SQL*Plus 在最后一个命令后退出。这是一个交互式提示,例如 telnetftp,您必须告诉它退出。
  • @Jason Boyd:谢谢。您的建议有效,尽管它确实改变了脚本,但它有效!非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2010-12-17
  • 2012-11-13
  • 2010-12-16
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
相关资源
最近更新 更多