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

How to run multiple SQL script files in a Shell script

我必须创建 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 时,在这里和第 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)。

创建函数

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

process_sql_and_log() {
   if [ $# -ne 2 ]; then
      echo "Usage: [=10=] sqlfile logfile"
      return 1
   fi
   sqlplus usr/password@sid <<EOF
spool 
@
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