我必须创建1个UNIX Shell脚本。在该shell脚本中,我想从同一目录运行多个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脚本文件执行之后
我使用了&&
。因此,在定义 PATH 时,在此处和第三行&&
中使用;
很好吗?请为我提供更好的解决方案。
答案 0 :(得分:3)
不要覆盖系统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
无法表达您对&&
的含义(此语法似乎有quite distinct meaning in sqlplus
)。
答案 1 :(得分:1)
执行功能
#!/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