Запустите SQL-запрос в сценарии оболочки, затем отправьте вывод на электронную почту

Мне нужно выполнить простой запрос на выборку в нашей базе данных оракула. Но для этого требуется несколько часов. Я хочу сделать это с помощью сценария оболочки, чтобы мне не нужно было время от времени отслеживать, выполняется ли запрос, и я хочу отправить вывод по электронной почте, поскольку мне нужны только подсчеты.

Я делаю это на удаленном сервере и не имею прав администратора, чтобы отключить ограничение по времени перед отключением.

Заранее спасибо за помощь.

Вот исходный код, который я пишу.

     #!/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"  [email protected] < /tmp/counts.txt     
#===end of script=========#

Я вызову сценарий оболочки с помощью команды nohup.
. Сценарий вызова: nohup ksh counts.sh пароль пользователя DB и

🤔 А знаете ли вы, что...
Oracle Database In-Memory Option - это возможность хранить данные в оперативной памяти для быстрого доступа и анализа.


4 421
1

Ответ:

Вы никогда не говорили, что является результатом этого запроса. Да, это считает что-то, но - как выглядит вывод? Одно значение? Один столбец в несколько строк? Много столбцов в одной строке? Много столбцов в еще большем количестве строк?

Поскольку выполнение самого запроса занимает несколько часов, возможно, вы захотите проверить результат, отсортированный по это или тот, выполнить некоторые вычисления и т. д. — если это так, возможно, самый простой вариант —

  • создать таблицу, содержащую столбцы, возвращаемые этим запросом
  • написать хранимую процедуру, которая вставляет результат в таблицу
  • в конце процедуры используйте UTL_MAIL (или UTL_SMTP) и отправьте себе письмо, просто сказав, что обработка завершена
  • подключитесь к базе данных и выберите * из таблицы, чтобы просмотреть результат
  • если результат запроса прост, вы можете поместить его в тело сообщения электронной почты

Другой вариант — создать выходной файл (используя UTL_FILE) и отправить его по почте в виде вложения.

Или, если вы хотите сделать это на уровне операционной системы, вы все равно должны создать выходной файл и использовать некоторый инструмент, который позволит вам отправлять почту.