如何在 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
我必须创建 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