Как запустить несколько файлов сценариев SQL в сценарии оболочки

Я должен создать 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-й строке ; когда я определяю ПУТЬ. Пожалуйста, предоставьте мне лучшее решение.

2 ответа

Не переопределяйте систему 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).

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

#!/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
Другие вопросы по тегам