注意 :
v\\\$ 用法, "v\\\$session " ""不能用
sqlplus -S / as sysdba << EOF
set pagesize 0
set verify off
set feedback off
set echo off
col coun new_value v_coun
select count(*) coun from dual;
EOF
value="$?"
VALUE=`sqlplus -s / as sysdba <<EOF
set pagesize 0 feedback off verify off heading off echo off numwidth 5
select count(*) from v\\\$session;
exit;
EOF`
if [ "$VALUE" -gt 0 ]
then
echo "The number of rows is $VALUE."
else
echo "There is no row in the table."
fi
if [ $value == 0 ];
then
echo "222222222"
else
echo "1111111111"
fi
Oracle shell调用SQL操作DB
操作Oracle数据库可以使用sqlplus连接数据库之后,再交互式的使用数据库。另一种非交互的方式就是通过shell直接执行sql命令,可以直接在shell CLI端口执行命令,或者是通过shell脚本的方式。从sql命令的输入方式上,这种非交互的方式又可以分为两种,一种是命令行直接输入,另一种是sql文件输入。
1. 命令行直接输入方式
这种方式就是把要执行的命令直接传给sqlplus,-S是指silent模式。注意此处的反斜杠转义。
sqlplus -S '/ as sysdba' << EOF
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v\$parameter WHERE name = 'background_dump_dest';
exit
EOF
使用脚本的话,如下所示,注意反斜杠。
if test $# -lt 1
then
echo You must pass a SID
exit
fi
ORACLE_SID=$1; export ORACLE_SID
DUMP_DIR=`sqlplus -S '/ as sysdba' << EOF
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v\\$parameter WHERE name = 'background_dump_dest';
exit
EOF`
echo ${DUMP_DIR}
2. 通过文件输入方式
这种方式是先把sql语句存储在一个文件中,这时就不需要反斜杠了,而且输入文件必须要以.sql为后缀。
[oracle@node ~]$ cat /tmp/sqllines.sql
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v$parameter WHERE name = 'background_dump_dest';
exit
[oracle@node ~]$ sqlplus -s "/ as sysdba" @/tmp/sqllines
/u01/app/oracle/diag/rdbms/live/live/trace
这种方式同样可以写成一个shell脚本。
[oracle@node ~]$ cat /tmp/sql
if test $# -lt 1
then
echo You must pass a SID
exit
fi
ORACLE_SID=$1; export ORACLE_SID
echo "
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v\$parameter WHERE name = 'background_dump_dest';
exit
">/tmp/plsql_scr.sql
# --------------------------------
# Execute plsql script
# --------------------------------
if [ -s /tmp/plsql_scr.sql ]; then
echo -e "Running SQL script to find out bdump directory... \n"
$ORACLE_HOME/bin/sqlplus -s "/ as sysdba" @/tmp/plsql_scr.sql >/tmp/plsql_scr_result.log
fi
echo " Check the reslut "
echo "------------------------"
cat /tmp/plsql_scr_result.log
exit
sqlplus -s / as sysdba <<eof
@test.sql
EOF
第二个EOF前面有没有exit效果都一样。 也就是说缺省就是exit
test.sql里最后加不加commit效果都一样,exit缺省的时候就是提交(这个可以控制)
test.sql 名字如果是带空格t est.sql,怎么办?
(下面是好多sql文件进行遍历)
【1】
cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba <<eof
@"$line"
EOF
【2】
cat database.sh
for line in `ls *sql` ;do
sqlplus -s / as sydsba <<eof
@"$line"
EOF
done
用while循环,而不用for in 是因为如果文件名有空格,ls *sql出来以后,line取值是按照空格或者换行符作为间隔符号,
所以一个文件名会被空格分成为2个值使用;而用while read 则是只按照换行符作为间隔符号,所以一个文件名不会被分割。这就是这两种方式的区别。
下面的sqlplus 下面执行@"line",变量line需要加双引号,防止文件名被空格分割解析
sqlplus 的两种方式对比对比:
【1】
#cat test.sql
insert into test values(sysdate);
commit;
#cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba <<eof
@"$line"
EOF
上面的exit退出动作是由EOF完成的
【2】
#cat test.sql
insert into test values(sysdate);
commit;
exit;
#cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba @"$line"
上面的exit退出动作,只能在test.sql中完成。
在这种情况下如果不在test.sql中加exit,那么循环会在第一次sqlplus 执行的时候阻塞,直到被手工处理以后,才能进入到下一次循环。