转:sqlplus与shell互相传值的几种情况
Posted feiyun8616的作坊 (半个程序员and dba)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转:sqlplus与shell互相传值的几种情况相关的知识,希望对你有一定的参考价值。
sqlplus与shell互相传值的几种情况
情况一:在shell中最简单的调用sqlplus
$cat test.sh
#!/bin/sh
sqlplus oracle/[email protected]>file.log <<EOF
select * from test;
exit
EOF #注意EOF要顶格写
$sh test.sh
$cat file.log
--省略若干系统提示信息-------
SQL>
EMPNO EMPNAME SAL DEPTNO
----- ------------- ----- ------
10002 Frank Naude 500 20
10001 Scott Tiger 1000 40
--省略若干系统提示信息-------
将执行过程重定向入文件file.log,可通过cat file.log查看
情况二:直接将sqlplus的值赋值给shell变量
$cat test.sh
#!/bin/sh
# 将sqlplus的结果输出给变量VALUE
# set命令的使用可查询手册
#注意shell中等号两边不能有空格
VALUE=`sqlplus -S /nolog <<EOF
set heading off feedback off pagesize 0 verify off echo off
conn oracle/[email protected]
select count(*) from test;
exit
EOF`
#输出记录数
echo "The number of rows is $VALUE."
$sh test.sh
The number of rows is 2.
显示结果正确,表test共2条记录
情况三:间接将sqlplus的值赋值给shell变量
$cat test.sh
#!/bin/sh
#利用COL column NEW_VALUE variable定义变量
#sqlplus执行完后最后返回值为v_coun
#利用$?将最后返回值赋值给VALUE,也即为test的记录数
sqlplus -S /nolog <<EOF
set heading off feedback off pagesize 0 verify off echo off
conn oracle/[email protected]
col coun new_value v_coun
select count(*) coun from test;
exit v_coun
EOF
VALUE="$?"
echo "The number of rows is $VALUE."
$sh test.sh
2
The number of rows is 2.
脚本执行结果中第一个2为sqlplus返回值,第二个2为VALUE的值
情况四:将shell变量的值传给sqlplus使用
$cat test.sh
#!/bin/sh
#sqlplus引用shell变量TABLENAME的值
#注意赋值时,等号两边不能有空格
TABLENAME="test"
sqlplus -S oracle/[email protected] <<EOF
select * from ${TABLENAME};
exit
$sh test.sh
EMPNO EMPNAME SAL DEPTNO
----- -------------------------------------------------- ---------- ------
10002 Frank Naude 500 20
10001 Scott Tiger 1000 40
脚本执行结果为:select * from test;的结果
情况五:通过交互方式手工输入shell变量值
$cat test.sh
#!/bin/sh
#将手工输入变量值读入变量TABLENAME
echo "Enter the tablename you want to select:"
read TABLENAME
sqlplus -S oracle/[email protected] <<EOF
select * from ${TABLENAME};
exit
$sh test.sh
#按提示输入表名test
Enter the tablename you want to select:
test
EMPNO EMPNAME SAL DEPTNO
----- -------------------------------------------------- ---------- ------
10002 Frank Naude 500 20
10001 Scott Tiger 1000 40
脚本执行结果为select * from test的执行结果
chapte 2:
有时因工作需要,得写一些脚本,都是shell和sqlplus混合的。
一般情况下,shell变量带入到sql脚本,比较方便,但是把sql的一些结果,输出给shell,就比较麻烦一些了。以前用的方法比较土一点,就是在sqlplus里面,spool到一个临时文件,然后在shell里面用grep,awk一类的来分析这个输出文件。后来在网上看到一篇介绍,受益匪浅啊。在此表示感谢。
http://hi.baidu.com/edeed/blog/item/291698228a5694f4d7cae2c1.html/cmtid/e87926977f74636155fb968f
我试了三种,一个是退出sqlplus时顺带返回值。这个方法有限制,只能是数字,不能是字符串。
SQL> col global_name new_value xxx
SQL> select global_name from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
XXX.XXX.XXX
SQL> exit xxx
SP2-0584: EXIT variable "XXX" was non-numeric
第二个就是直接select语句的输出。
脚本如下(test1.sh):
#!/bin/bash
VALUE=`sqlplus -S user/[email protected] <<EOF
set heading off feedback off pagesize 0 verify off echo off numwidth 4
select * from global_name;
exit
EOF`
echo $VALUE
测试结果如下:
[[email protected] tmp]# sh test1.sh
XXX.XXX.COM
[[email protected] tmp]#
第三个是定义一个变量,然后在sqlplus里面print。
脚本如下(test2.sh):
#!/bin/bash
VALUE=`sqlplus -S user/[email protected] <<EOF
set heading off feedback off pagesize 0 verify off echo off numwidth 4
var username varchar2(30)
begin
select user into :username from dual;
:username := ‘username ‘|| :username;
end;
/
print username
exit
EOF`
echo $VALUE
测试结果如下:
[[email protected]]# sh test2.sh
username USER_A
[[email protected]]#
以上是关于转:sqlplus与shell互相传值的几种情况的主要内容,如果未能解决你的问题,请参考以下文章