如何在shell脚本中嵌入Oracle数据库操作
借助Oracle数据库交互客户端工具sqlplus sqlplus连接数据库的常用四种方式详见http://www.2cto.com/database/201307/226125.html 本文中均采用万金油的远程连接oracle命令方式作为例子。 1. 使用sqlplus进入cmd模式后批量执行sql命令 例如,想在脚本中获取某张表的记录数 recCount=`sqlplus -S ${TRA_DB_USER}/${TRA_DB_PWD}@${TRA_DB_HOST}:${TRA_DB_PORT}/${TRA_DB_SID} <<EOF set pagesize 0 set feedback off set verify off set heading off set echo off select count(*) from table_name; exit EOF` 记得要exit 2. 使用sqlplus进入cmd模式后批量执行sql脚本文件 start命令可以读取文件中的内容到缓冲区中,然后再SQL*PLUS中运行这些内容 例如,想要在脚本中通过两个sql文件向两张表中导入数据 sqlplus ${PAR_DB_USER}/${PAR_DB_PWD}@${PAR_DB_HOST}:${PAR_DB_PORT}/${PAR_DB_SID}<<EOF start insert_table1.sql; start insert_table2.sql; exit; EOF 记得要exit 3. 使用sqlplus直接单次执行一个sql脚本文件 sqlplus ${PAR_DB_USER}/${PAR_DB_PWD}@${PAR_DB_HOST}:${PAR_DB_PORT}/${PAR_DB_SID} @insert_table1.sql sql脚本文件中要记得exit 4. 用数据泵(Data Dump)工具导出导入数据(格式跟3很像)
导出: exp ${PAR_DB_USER}/${PAR_DB_PWD}@${PAR_DB_HOST}:${PAR_DB_PORT}/${PAR_DB_SID} file=target_file.dmp tables=table_name_you_want
导入: imp ${PAR_DB_USER}/${PAR_DB_PWD}@${PAR_DB_HOST}:${PAR_DB_PORT}/${PAR_DB_SID} file=target_file.dmp full=y ignore=y 值得注意的是,如果shell脚本中有使用here-document(块变量,特殊的重定向)时,如果出现以下报错 warning: here-document at line 17 delimited by end-of-file (wanted `EOF) line 30: syntax error: unexpected end of file 是因为<<xxx 标识一个here-document的开始,必须以仅有xxx,没有其他任何内容的一行结束。 因此检查结尾行除了end-delimeter之外,是否有其它字符(包括空格、制表符),如果有,删掉就对了。
PS:如果密码中包含!等特殊字符,在前面加(反斜杠)即可