在Shell脚本中运行SQL查询,然后将输出发送到电子邮件

时间:2019-01-26 18:13:54

标签: linux oracle shell unix scripting

我需要在我们的oracle数据库中执行一个简单的选择计数查询。但这需要几个小时才能完成。我想使用Shell脚本来执行此操作,因此我不需要时常监视查询是否仍在运行,并且因为我只需要计数就想在我的电子邮件中发送输出

我正在远程服务器上进行操作,并且没有管理员权限可以在断开连接之前禁用时间限制。

预先感谢您的帮助。

这是我编写的初始代码。

     #!/bin/ksh
######################################################################
# File Name  : counts.sh
# Created    : 2019/27/19
# Author     :
#-----------------------------------------------------------------------
# $Revision: 1.0 $
# $Date: 2019/01/27 08:00:00 $
#-----------------------------------------------------------------------
# Modification History:
# No      Date       Author         Note
#
#-----------------------------------------------------------------------
#
#
########################################################################
DB_USERNAME=$1
DB_PASSWORD=$2
DB_DBASE=$3

#------------------------------------------------------------
# Start Log
#------------------------------------------------------------
DB_CONN=${DB_USERNAME}/${DB_PASSWORD}@${DB_DBASE}
LOG_DATETIME=`date +%Y-%m-%d:%H:%M:%S`
LOG_FILE=/tmp/$LOG_DATETIME.log
EGREP=/bin/egrep
ORA_ERR_STR=ORA
#==Start Table Space ========================================
sqlplus -S ${DB_CONN} > $LOG_FILE << ORAEND

set serveroutput on;
set feedback off
SPOOL /tmp/counts.txt
PROMPT COUNTS

SELECT COUNT(*) FROM schema.db;

spool off;
ORAEND


mailx -s "Counts on $DB_DBASE is"  user@gmail.com < /tmp/counts.txt     
#===end of script=========#

我将使用nohup命令调用Shell脚本。
调用脚本:nohup ksh counts.sh用户密码DB和

1 个答案:

答案 0 :(得分:2)

您从未说过该查询的结果。是的,它很重要,但是-输出结果如何?一个值?多行中的一列?一行中有很多列?多列甚至更多行?

由于查询本身需要花费数小时才能完成,所以您可能希望能够检查按 this that 排序的结果,执行一些计算等。 -如果是这样,也许最简单的选择是

  • 创建一个包含该查询返回的列的表
  • 编写一个存储过程,将结果插入表中
  • 在过程结束时,使用UTL_MAIL(或UTL_SMTP)向自己发送一封邮件,只是说处理已结束
  • 连接到数据库,然后从表中选择*以查看结果
  • 如果查询结果简单,则可以将其放入电子邮件正文中

另一种选择是实际创建输出文件(使用UTL_FILE)并通过邮件作为附件发送。

或者,如果要从操作系统级别执行此操作,则仍应创建输出文件,并使用一些 tool 来发送邮件。