在shell脚本中调用sql语句

查询员工信息

-S:静默登录

[[email protected] 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
[[email protected] 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

使用代码块

[[email protected] 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
[[email protected] shells]$ bash ./shell2.sh
hello world

传入一个部门编号查询出该部门下的员工姓名

[[email protected] 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
[[email protected] shells]$ bash shell3.sh 10

ENAME
----------
CLARK
KING
MILLER

输入一个工作,根据工作查询员工的姓名

在sqlplus的EOF中,
单引号中的取变量符号和外面不同
它可以取到变量值

[[email protected] 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
[[email protected] shells]$ bash shell4.sh
请输入部门编号
[[email protected] shells]$ bash shell4.sh 20

SMITH
JONES
SCOTT
ADAMS
FORD

将sql中的查询结果,传给shell脚本

传入一个部门编号,查询除部门的员工人数
并将sqlplus的结果传到shell脚本的变量中

[[email protected] 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
[[email protected] shells]$ bash shell5.sh 20
5
[[email protected] shells]$ bash shell5.sh 10
3

循环传入部门编号,查询除部门下员工的编号和姓名

[[email protected] 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
[[email protected] shells]$ bash shell6.sh 20
SMITH
JONES
SCOTT
ADAMS
FORD
[[email protected] 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
[[email protected] shells]$ bash shell7.sh 10
CLARK
KING
MILLER

保存到文件

传入部门编号,查询部门下的员工编号和姓名

[[email protected] 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
[[email protected] shells]$ bash shell8.sh 10
[[email protected] shells]$ cat emp.txt 

     EMPNO JOB
---------- ---------
      7782 MANAGER
      7839 PRESIDENT
      7934 CLERK

读取文件

[[email protected] 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
[[email protected] shells]$ bash shell8.sh 20
编号: 7369, 工作: CLERK
编号: 7566, 工作: MANAGER
编号: 7788, 工作: ANALYST
编号: 7876, 工作: CLERK
编号: 7902, 工作: ANALYST

将数据导入到文件中

将emp表中的所有列的数据,导出到文件中,
列和列之间用逗号隔开

[[email protected] 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
[[email protected] 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

传入一个表名,查询该表的所有数据

[[email protected] 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
[[email protected] shells]$ bash shell10.sh dept

    DEPTNO DNAME    LOC
---------- -------------- -------------
  10 ACCOUNTING   NEW YORK
  20 RESEARCH   DALLAS
  30 SALES    CHICAGO
  40 OPERATIONS   BOSTON

脚本备份数据库

将导出文件放到备份服务器或者目标服务器

[[email protected] ~]$ 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 [email protected]:/home/oracle/dmp/
[[email protected] ~]$ bash shell11.sh
[email protected]'s password: 
[[email protected] ~]$ tree
.
├── data
│?? ├── exp.dump
│?? └── exp.log
├── dmp
│?? └── exp.dump
└── shell11.sh

优化上面的语句

[[email protected] ~]$ 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 [email protected]$desip:$dir/
[[email protected] ~]$ bash shell12.sh
[email protected]'s password: 
[[email protected] ~]$ 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
[[email protected] ~]$ bash dept.sh
[[email protected] ~]$ 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;

执行导入脚本

[[email protected] ~]$ 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
[[email protected] ~]$ bash impdept.sh 
SQL> select * from dept_bak;

    DEPTNO DNAME    LOC
---------- -------------- -------------
  10 ACCOUNTING   NEW YORK
  20 RESEARCH   DALLAS
  30 SALES    CHICAGO
  40 OPERATIONS   BOSTON

原文地址:https://www.cnblogs.com/inmeditation/p/12443357.html

时间: 2024-08-06 07:46:13

在shell脚本中调用sql语句的相关文章

Shell脚本中执行sql语句操作

这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中.命令行调用单独的SQL文件.使用管道符调用SQL文件等方法,需要的朋友可以参考下 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到sh

Linux/Unix shell 脚本中调用SQL,RMAN脚本

Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可少的技能之一.本文针对Linux/Unix shell脚本调用sql, rman 脚本给出了相关示例. 一.由shell脚本调用sql,rman脚本 [python] view plain copy print? 1.shell脚本调用sql脚本 #首先编辑sql文件 [email protecte

shell 脚本中执行SQL语句 -e &quot;...&quot;

/usr/local/mysql/bin/mysql -uroot -p123456 -e " use faygo source faygo.sql select * from devquit "

Shell脚本中执行mysql语句

对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到shell脚本文件中 --演示环境 [[email protected] ~]# more /etc/issue CentOS release 5.9 (Final) Kernel \r on an \m   [e

shell脚本中执行mysql语句的方法

方法一:使用文件标签EOF重定向的方法的: #!/bin/bash  user=root  pass=123456  db=mysql  tablename=user  mysql -s --line-numbers -f -u$user -p$pass -D $db --delimiter=";" -E<  --SELECT host,user from $tablename order by 1;  SELECT host,user from $tablename order

Shell脚本中调用另外一个脚本的方法

在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一下在一个shell脚本中如何调用另外一个shell脚本,其方法有 fork    exec    source. 1.fork  ( /directory/script.sh) : 如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令.子级的环境变量不会影响到父

Linux shell脚本中调用另一个shell(exec、source、fork)

  在运行shell脚本时候,有三种方式来调用外部的脚本,exec(exec script.sh).source(source script.sh).fork(./script.sh) exec(exec /home/script.sh): 使用exec来调用脚本相当于在当前shell执行了一条命令,不会产生新的进程,被执行的脚本会继承当前shell的环境变量.但是当exec调用完毕后,当前shell也会结束,剩下的代码不会执行. source(source /home/script.sh) 使

Shell 脚本中调用另一个 Shell 脚本的三种方式

主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell. exec 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了 source 在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行.   第一种:fork 特点:会生成子PID而且可重

如何在脚本中执行SQL语句并获得结果输出?

这里需要用到的工具叫做sqlcmd.exe, 它随SQL server的安装而安装. 该可执行程序的位置在: C:\Program Files\Microsoft SQL Server\xxx\Tools\Binn   其中xxx是你所安装的SQL Server的版本号. Version Number   SQL Server 2005 90   SQL Server 2008 100     在SQL 2014中它的位置在: C:\Program Files\Microsoft SQL Ser