获取 sqlplus 的结果并放入脚本 .bat 上的变量中

Posted

技术标签:

【中文标题】获取 sqlplus 的结果并放入脚本 .bat 上的变量中【英文标题】:Take the sqlplus's result and put into a variable on script .bat 【发布时间】:2017-11-29 21:32:59 【问题描述】:

我不知道批处理结构,如果这个问题很琐碎,请原谅我。 我有我的查询,我想用 sqlplus 命令将它们执行到脚本中。之后,当我的 sqlplus 命令给我一个结果时,我想将记录保存在一个变量中,最后一步是使用 mailto 命令创建一个邮件并将其发送给我的联系人。

我的脚本是这样的:

ScriptFather.bat

@echo off
setlocal EnableDelayedExpansion
SET i=0
FOR /f  %%b IN ('C:\Users\samuele.nava\Desktop\idlock.bat') DO (set var!i!=%%b)
echo var0: !var0!
pause

ScriptSon.bat

sqlplus user/pwd@host:port/sid @C:\...\Query.sql

查询.sql

select id_richiesta,id_ric_tipo,id_lock,ts_ins,ts_ultimo_aggiornamento,codice_op_don,codice_op_rec,id_richiesta_stati,data_cut_over_richiesta,data_cut_over_effettiva from richieste where id_lock is not null and ts_ultimo_aggiornamento=(sysdate) order by ts_ultimo_aggiornamento desc;

很抱歉,如果这些问题很常见,但我不知道如何解决这个问题。

尊重和摇滚

【问题讨论】:

您的 for 命令正在使用变量 %%m,但您正在尝试分配变量 %%b。此外,您正在尝试使用 var!i! 变量的延迟扩展,但您尚未使用 SETLOCAL 命令启用延迟扩展。 *** 的工作方式与常规问答论坛略有不同。不要将代码编辑放在评论中。使用更新的代码编辑您的问题并删除您的评论。 @Squashman ty...我正在更新我的问题中的代码。非常感谢 我认为条件ts_ultimo_aggiornamento=(sysdate) 不会返回任何结果。您很可能正在寻找ts_ultimo_aggiornamento=TRUNC(sysdate) 您喜欢为每一行发送一封邮件还是一封包含所有记录的邮件? 【参考方案1】:

我认为市长面临的挑战是格式化 sqlplus 输出。看看这个文档Formatting SQL*Plus Reports

完成此操作后,我建议将结果假脱机到一个文件中并邮寄,例如使用您可以从 http://www.virtualobjectives.com.au/utilitiesprogs/sendsmtp.htm 下载的 SendSMTP

sqlplus -s user/pwd@host:port/sid @Query.sql > %TEMP%\Query_output.txt

SendSMTP.exe /HOST mailhost /FROM "Samuele@domain.net" /TO "Samuele@domain.net" /SUBJECT "Notification from Database" /BODYFILE %TEMP%\Query_output.txt

注意-s 开关,它抑制了 sqlplus 横幅。

【讨论】:

它运行了,但我不是很满意。我喜欢控制行输入,实际上如果记录输出中“没有选择行”,我的脚本一定不能发送电子邮件。使用您的解决方案,我该如何控制这件事?很多 我的建议是从gnuwin32.sourceforge.net下载gnuwin32。然后您可以使用grep "no row selected" 来确定您是否得到任何结果。或者将您的整个脚本更改为 VB 脚本(或现在的 PowerShell),您将拥有更多功能。

以上是关于获取 sqlplus 的结果并放入脚本 .bat 上的变量中的主要内容,如果未能解决你的问题,请参考以下文章

windows下使用SQLPLUS制作BAT执行SQL文件

SQLPLUS BAT 文件

记录昨天用sqlplus批量刷sql的脚本

如何从 shell/shell 脚本获取 sqlplus 命令的输出状态?

java调用shell脚本,并得到shell脚本的返回值

Sqlplus 两次打印结果并使用空行