如何在Shell脚本中运行多个SQL脚本文件

时间:2019-02-12 11:12:40

标签: shell unix ksh sql-scripts

我必须创建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 时,在此处和第三行&&中使用;很好吗?请为我提供更好的解决方案。

2 个答案:

答案 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