转:sqlplus与shell互相传值的几种情况
sqlplus与shell互相传值的几种情况
情况一:在shell中最简单的调用sqlplus
$cat test.sh
#!/bin/sh
sqlplus oracle/oracle@oracle>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/oracle@oracle
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/oracle@oracle
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/oracle@oracle <<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/oracle@oracle <<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/pass@tns <<EOF
set heading off feedback off pagesize 0 verify off echo off numwidth 4
select * from global_name;
exit
EOF`
echo $VALUE
测试结果如下:
[root@xxx tmp]# sh test1.sh
XXX.XXX.COM
[root@xxx tmp]#
第三个是定义一个变量,然后在sqlplus里面print。
脚本如下(test2.sh):
#!/bin/bash
VALUE=`sqlplus -S user/pass@tns <<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
测试结果如下:
[root@xxxtmp]# sh test2.sh
username USER_A
[root@xxxtmp]#
转:sqlplus与shell互相传值的几种情况的更多相关文章
- sqlplus与shell互相传值的几种情况
2578人阅读 sqlplus与shell互相传值的几种情况 情况一:在shell中最简单的调用sqlplus $cat test.sh #!/bin/sh sqlplus oracle/orac ...
- 上传图片shell绕过过滤的几种方法
一般网站图片上传功能都对文件进行过滤,防止webshelll写入.但不同的程序对过滤也不一样,如何突破过滤继续上传? 本文总结了七种方法,可以突破! 1.文件头+GIF89a法.(php)//这个很好 ...
- MVC控制器向View视图传值的三种方法
首先创建一个MVC的项目,其中需要一个控制器(TestController),三个视图(index,edit,detail) 1.项目结构如下:
- android fragment传递参数_fragment之间传值的两种方法
在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...
- ASP.NET 页面之间传值的几种方式
开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...
- 第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)
简 介 在前面的章节中,我们已经很清楚,MVC工作模型的流程,Controller中的Action接收到客户端的请求,处理后要将数据返回给View,那么Action中是如何将数据返回给View的,二 ...
- React Router v4 页面传值的三种方法
传值方法 1.props.params 使用React router定义路由时,我们可以给指定一个path,然后指定通配符可以携带参数到指定的path: <Route path='/user/: ...
- 【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法
shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...
随机推荐
- Vasya and String(尺取法)
Vasya and String time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Android Studio 项目结构
在Android Studio中创建项目后,会出现 activity_main.xml 和 MainActivity.java 两个文件 其中 Java文件定义了一个Activity,当应用运行时, ...
- 当引用了Properties.Settings后,如果执行的时候,出现"配置系统无法初始化" 或者 某某节点不正确
自定义了一个 PowerConfig命名空间 PowerSettings.Settings 然后一个exe,引用了该dll,在app.cinfig里增加了配置项 <applicationSe ...
- shell变量的替换
1 shell变量基础shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义.所以若要进行数学运算,必须使用一些命令例如let.declare.expr. ...
- Linux中seq命令的用法
用于产生从某个数到另外一个数之间的所有整数 例一: # seq 1 10 结果是1 2 3 4 5 6 7 8 9 10 例二: #!/bin/bash for i in `seq 1 10`; do ...
- hdu_5795_A Simple Nim(打表找规律的博弈)
题目链接:hdu_5795_A Simple Nim 题意: 有N堆石子,你可以取每堆的1-m个,也可以将这堆石子分成3堆,问你先手输还是赢 题解: 打表找规律可得: sg[0]=0 当x=8k+7时 ...
- 矩阵快速幂AC代码HDU 2035
#include <iostream> using namespace std;const int MOD = 1000;//像这样的一个常量就应该专门定义一下 int PowMod(in ...
- jni中的参数含义
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_helloFromC ( ...
- github 安装配置以及使用遇到的一些问题
Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括Rubinius ...
- “strcmp()” Anyone?
“strcmp()” Anyone? strcmp() is a library function in C/C++ which compares two strings. It takes two ...