在shell脚本中调用sql语句
查询员工信息
-S:静默登录
[oracle@localhost shells]$ cat shell1.sh
#!/bin/bash
#查询员工信息
sqlplus -S /nolog <<EOF
conn scott/scott
set feedback off
set linesize 300
set pagesize 100
col empno for 99999
col ename for a12
col mgr for 9999
col hiredate for a20
col comm for 9999
col deprno for 99999
select * from emp;
exit
EOF
[oracle@localhost shells]$ bash ./shell1.sh
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ------------ --------- ----- -------------------- ---------- ----- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
使用代码块
[oracle@localhost shells]$ cat shell2.sh
#!/bin/bash
sqlplus -S scott/scott<<EOF
set feedback off
set serveroutput on
begin
dbms_output.put_line('hello world');
end;
/
exit
EOF
[oracle@localhost shells]$ bash ./shell2.sh
hello world
传入一个部门编号查询出该部门下的员工姓名
[oracle@localhost shells]$ cat shell3.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请传入部门编号
exit
fi
dno=$1
sqlplus -S scott/scott<<EOF
set feedback off
select ename from emp where deptno=${dno};
exit
EOF
[oracle@localhost shells]$ bash shell3.sh 10
ENAME
----------
CLARK
KING
MILLER
输入一个工作,根据工作查询员工的姓名
在sqlplus的EOF中,
单引号中的取变量符号和外面不同
它可以取到变量值
[oracle@localhost shells]$ cat shell4.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请输入部门编号
exit
fi
sqlplus -S scott/scott<<EOF
set heading off
set feedback off
select ename from emp where deptno='$1';
exit
EOF
[oracle@localhost shells]$ bash shell4.sh
请输入部门编号
[oracle@localhost shells]$ bash shell4.sh 20
SMITH
JONES
SCOTT
ADAMS
FORD
将sql中的查询结果,传给shell脚本
传入一个部门编号,查询除部门的员工人数
并将sqlplus的结果传到shell脚本的变量中
[oracle@localhost shells]$ cat shell5.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请输入部门编号
exit
fi
dno=$1
num=`sqlplus -S scott/scott<<EOF
set heading off
set feedback off
select count(*) from emp where deptno=${dno};
exit
EOF`
echo $num
[oracle@localhost shells]$ bash shell5.sh 20
5
[oracle@localhost shells]$ bash shell5.sh 10
3
循环传入部门编号,查询除部门下员工的编号和姓名
[oracle@localhost shells]$ cat shell6.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请输入部门编号
exit
fi
dno=$1
informations=`sqlplus -S scott/scott<<EOF
set heading off
set feedback off
select ename from emp where deptno=${dno};
exit
EOF`
for information in $informations
do
echo $information
done
[oracle@localhost shells]$ bash shell6.sh 20
SMITH
JONES
SCOTT
ADAMS
FORD
[oracle@localhost shells]$ cat shell7.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请输入部门编号
exit
fi
dno=$1
names=`sqlplus -S scott/scott<<EOF
set heading off
set feedback off
select ename from emp where deptno=$dno;
exit
EOF`
for((i=1;i<=100;i++))
do
name=`echo $names | cut -f $i -d ' '`
if [ -z $name ];then
break
fi
echo $name
done
[oracle@localhost shells]$ bash shell7.sh 10
CLARK
KING
MILLER
保存到文件
传入部门编号,查询部门下的员工编号和姓名
[oracle@localhost shells]$ cat shell8.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请输入部门编号
exit
fi
dno=$1
sqlplus -S scott/scott > emp.txt<<EOF
set feedback off
select empno,job from emp where deptno=$dno;
exit
EOF
[oracle@localhost shells]$ bash shell8.sh 10
[oracle@localhost shells]$ cat emp.txt
EMPNO JOB
---------- ---------
7782 MANAGER
7839 PRESIDENT
7934 CLERK
读取文件
[oracle@localhost shells]$ cat shell8.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请输入部门编号
exit
fi
dno=$1
file=emp.txt
sqlplus -S scott/scott > $file<<EOF
set heading off
set feedback off
select empno,job from emp where deptno=$dno;
exit
EOF
while read line
do
if [[ -z $line ]];then
continue
fi
mpno=`echo $line | cut -f 1 -d ' '`
name=`echo $line | cut -f 2 -d ' '`
echo "编号: ${mpno}, 工作: ${name}"
done < $file
rm -rf $file
[oracle@localhost shells]$ bash shell8.sh 20
编号: 7369, 工作: CLERK
编号: 7566, 工作: MANAGER
编号: 7788, 工作: ANALYST
编号: 7876, 工作: CLERK
编号: 7902, 工作: ANALYST
将数据导入到文件中
将emp表中的所有列的数据,导出到文件中,
列和列之间用逗号隔开
[oracle@localhost shells]$ cat shell9.sh
#!/bin/bash
file=emp.txt
sqlplus -S scott/scott > $file<<EOF
set heading off
set feedback off
set pagesize 100
set linesize 300
select empno||','||ename||','||job||','||mgr||','||sal||','||comm||','||deptno from emp;
exit
EOF
[oracle@localhost shells]$ cat emp.txt
7369,SMITH,CLERK,7902,800,,20
7499,ALLEN,SALESMAN,7698,1600,300,30
7521,WARD,SALESMAN,7698,1250,500,30
7566,JONES,MANAGER,7839,2975,,20
7654,MARTIN,SALESMAN,7698,1250,1400,30
7698,BLAKE,MANAGER,7839,2850,,30
7782,CLARK,MANAGER,7839,2450,,10
7788,SCOTT,ANALYST,7566,3000,,20
7839,KING,PRESIDENT,,5000,,10
7844,TURNER,SALESMAN,7698,1500,0,30
7876,ADAMS,CLERK,7788,1100,,20
7900,JAMES,CLERK,7698,950,,30
7902,FORD,ANALYST,7566,3000,,20
7934,MILLER,CLERK,7782,1300,,10
传入一个表名,查询该表的所有数据
[oracle@localhost shells]$ cat shell10.sh
#!/bin/bash
if [ $# -lt 1 ];then
echo 请输入一个表名
exit
fi
tab=$1
sqlplus -S scott/scott<<EOF
set feedback off
set pagesize 100
set linesize 300
select * from $tab;
exit
EOF
[oracle@localhost shells]$ bash shell10.sh dept
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
脚本备份数据库
将导出文件放到备份服务器或者目标服务器
[oracle@localhost ~]$ cat shell11.sh
#!/bin/bash
exp system/"oracle"@192.168.0.33:1521/orcl file='/home/oracle/data/exp.dump' log='/home/oracle/data/exp.log' owner=scott indexes=n
scp -r /home/oracle/data/exp.dump oracle@192.168.0.33:/home/oracle/dmp/
[oracle@localhost ~]$ bash shell11.sh
oracle@192.168.0.33's password:
[oracle@localhost ~]$ tree
.
├── data
│ ├── exp.dump
│ └── exp.log
├── dmp
│ └── exp.dump
└── shell11.sh
优化上面的语句
[oracle@localhost ~]$ cat shell12.sh
#!/bin/bash
#导出配置
dbuser=system
passwd=oracle
dbip=192.168.0.33
port=1521
sid=orcl
dumppath=/home/oracle/data
dt=`date "+%Y%m%d%H%M%S"`
logpath=/home/oracle/data
schema=scott
dumpfile=exp_${dt}.dump
logfile=exp_${dt}.log
#备份服务器配置
desuser=oracle
desip=oracle
desip=192.168.0.33
dir=/home/oracle/dmp
#将数据库中的数据导出
exp $dbuser/"$passwd"@$dbip:$port/$sid file=$dumppath/$dumpfile log=$dumppath/$logfile owner=$schema indexes=n
#将导出文件放到备份服务器或者目标服务器
scp -r $dumppath/$dumpfile $desuser@$desip:$dir/
[oracle@localhost ~]$ bash shell12.sh
oracle@192.168.0.33's password:
[oracle@localhost ~]$ tree
.
├── data
│ ├── exp_20200307030903.dump
│ ├── exp_20200307030903.log
│ ├── exp.dump
│ └── exp.log
├── dmp
│ ├── exp_20200307030903.dump
│ └── exp.dump
├── shell11.sh
└── shell12.sh
将dept中的数据导出为dept.txt文件,并导入到另一张表中(dept_bak和dept表结构相同)
导出到dept.txt
sqlplus -S scott/scott > dept.txt<<EOF
set heading off
set feedback off
set pagesize 100
set linesize 300
select deptno||'|'||dname||'|'||loc from dept;
exit
EOF
[oracle@localhost ~]$ bash dept.sh
[oracle@localhost ~]$ cat dept.txt
10|ACCOUNTING|NEW YORK
20|RESEARCH|DALLAS
30|SALES|CHICAGO
40|OPERATIONS|BOSTON
在oracle中新建一张表
SQL> create table dept_bak as select * from dept where 1=0;
执行导入脚本
[oracle@localhost ~]$ cat impdept.sh
#!/bin/bash
while read line
do
if [[ -z $line ]];then
continue
fi
dno=`echo $line | cut -f 1 -d '|'`
name=`echo $line | cut -f 2 -d '|'`
l=`echo $line | cut -f 3 -d '|'`
sqlplus -S scott/scott > /dev/null<<EOF
insert into dept_bak(deptno,dname,loc) values($dno,'$name','$l');
exit
EOF
done < ./dept.txt
[oracle@localhost ~]$ bash impdept.sh
SQL> select * from dept_bak;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
在shell脚本中调用sql语句的更多相关文章
- Shell脚本中执行sql语句操作mysql
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...
- Shell脚本中执行sql语句操作mysql的5种方法【转】
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...
- SHELL脚本中执行SQL语句操作MYSQL的5种方法
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...
- Linux/Unix shell 脚本中调用SQL,RMAN脚本
Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...
- shell 脚本中执行SQL语句 -e "..."
/usr/local/mysql/bin/mysql -uroot -p123456 -e " use faygo source faygo.sql select * from devqui ...
- Linux脚本中调用SQL,RMAN脚本
Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...
- shell脚本中select循环语句用法
shell脚本中select循环语句 1. 脚本中select的语法格式 select VAR in LIST do command1 command2 ... ... commandN done s ...
- Shell 脚本中调用另一个 Shell 脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- Shell脚本中调用另外一个脚本的方法
(转载): 在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我 ...
随机推荐
- springboot支付项目之日志配置
日志框架 本节主要内容: 1:常见的几种日志框架 2:Logback的使用 3:怎么配置info和error级别日志到不同文件中并且按照日期每天一个文件. 以上几个框架可以分类如下: SLF4J和Lo ...
- vue 起步(一)
准备 安装nodejs(下载),Windows 安装包(.msi) npm相关 打开cmd查看npm版本, npm -v,如果没有安装npm,执行npm install npm -g进行安装 查询当前 ...
- spring cache问题记录
1.是否可以设置过期时间 timeout ttl 对于单个key设置过期时间 需要自定义CacheManager, 见3中的问题 spring boot 1版本可以重写RedisCacheManage ...
- 蓝桥杯-PREV45-图形排版
这是2017年蓝桥杯C组C++的压轴题,拿到之后没什么想法.但是蓝桥杯有部分分.所以直接敲了个大暴力提交上去过了一半的数据.后来想到了DP,但是没能实现出来,感觉还是有问题的.后来看了解题视频发现是预 ...
- jQuery插件开发小结
jQuery插件开发规范 1. 使用闭包 (function($) { // Code goes here })(jQuery); 这是来自jQuery官方的插件开发规范要求,使用这种编写方式有什么好 ...
- windows下的tfjs-node安装异常总结
大约有半年没有写博客了,奔波于上海这座魔都之中.险些忘了自己是个有梦想的全栈工程师 书接上回,由于个人非常厌恶python的语法,半年前发现了tensorflow.js这个宝贝(下简称tfjs),喜出 ...
- SpringMVC学习笔记七:SpringMVC的数据验证
SpringMVC支持JSR(Java Specification Requests, Java规范提案)303-Bean Validation数据验证规范,该规范的实现者很多,其中较常用的是 Hib ...
- VRRP笔记三:配置keepalived为实现haproxy高可用的双主模型配置文件示例:
说明:其基本实现思想为创建两个虚拟路由器,并以两个节点互为主从. ! Configuration File for keepalived global_defs { notification_emai ...
- 关于Synchornized,Lock,AtomicBoolean和volatile的区别介绍
1. volatile 变量可以被看作是一种 "程度较轻的 synchronized". 2. Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的 ...
- python标准库-array 模块
原文地址:http://www.bugingcode.com/blog/python_module_array.html array 模块是python中实现的一种高效的数组存储类型.它和list相似 ...