Как запустить несколько файлов сценариев SQL в сценарии оболочки - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужно создать 1 сценарий оболочки UNIX.В этом сценарии оболочки я хочу запустить несколько файлов сценариев SQL из одного каталога.Я использовал вот так:

#!usr/bin/ksh
SQLPATH = /usr/sql/
(cd $SQLPATH;
'sqlplus usr/password@sid <<EOF
 spool <db_file>.log
 @<db_name>.sql
 set echo off
 set heading off
 spool off
 &&

 spool <db_file2>.log
 @<db_name2>.sql
 set echo off
 set heading off
 spool off
 &&

 spool <db_file3>.log
 @<db_name3>.sql
 set echo off
 set heading off
 spool off
 exit;
 EOF')

exit 0

Существует несколько таких скриптов SQL, и для каждого скрипта SQL мне нужно создавать файлы журналов, поэтому я использовал здесь spool.После выполнения каждого файла сценария SQL я использовал &&.Так хорошо ли использовать && здесь и в 3-й строке ;, когда я определяю PATH .Пожалуйста, предоставьте мне лучшее решение.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Сделать функцию

#!/usr/bin/ksh
SQLPATH=/usr/sql # Offtopic: Better use lowercase for your own variables

process_sql_and_log() {
   if [ $# -ne 2 ]; then
      echo "Usage: $0 sqlfile logfile"
      return 1
   fi
   sqlplus usr/password@sid <<EOF
spool ${2}
@${1}
set echo off
set heading off
spool off
exit;
EOF
}

  cd "${SQLPATH}" &&
  process_sql_and_log db_name.sql  db_file.log  &&
  process_sql_and_log db_name2.sql db_file2.log &&
  process_sql_and_log db_name3.sql db_file3.log

exit 0
0 голосов
/ 12 февраля 2019

Не переопределяйте систему PATH (или теперь SQLPATH) и не помещайте команды в одинарные кавычки.Используйте строчные буквы для своих личных переменных, и вы не можете иметь пробелы вокруг знака равенства в присваивании;но переменная, которую вы используете только один раз, в любом случае бесполезна, поэтому я вынул ее и жестко закодировал аргумент cd.

Я предполагаю, что вы хотите что-то вроде

#!/usr/bin/ksh

# No spaces around equals sign, and don't use uppercase for private variables
# But why use a variable at all anyway
#sqlpath=/usr/sql
cd /usr/sql  # is this really necessary and useful??

sqlplus usr/password@sid <<____EOF &&
 spool <db_file>.log
 @<db_name>.sql
 set echo off
 set heading off
 spool off
____EOF

sqlplus usr/password@sid <<____EOF &&
 spool <db_file2>.log
 @<db_name2>.sql
 set echo off
 set heading off
 spool off
____EOF

sqlplus usr/password@sid <<____EOF
 spool <db_file3>.log
 @<db_name3>.sql
 set echo off
 set heading off
 spool off
____EOF

# exit 0  # Not necessary or useful

Еслинесколько команд sqlplus могут быть выполнены за один сеанс, что было бы очевидным улучшением;но я предполагаю, что sqlplus не имеет возможности выразить то, что вы, по-видимому, имеете в виду с && (этот синтаксис имеет совершенно отличное значение в sqlplus).

...