获取 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 上的变量中的主要内容,如果未能解决你的问题,请参考以下文章