Как запустить несколько файлов сценариев 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