sqlplus的非交互式使用

  • sqlplus交互界面存在的问题
  • sqlplus的两种非交互式使用方式
    • 1 通过外部命令文件
    • 2 通过标准输入
  • 利用管道做后续处理
  • 需要注意的地方
  • 一个简单的脚本

1 sqlplus交互界面存在的问题

sqlplus是ORACLE数据库的最重要的官方命令行客户端软件,是DBA的必备工具,使用它可以完成几乎全部的管理任务。然而,sqlplus的交互界面并不是非常友好,输入命令时不具有历史命令记录功能;默认的输出结果更是不堪入目。在易用性方面,sqlplus确实比mysql客户端差了不少。

既然sqlplus交互模式存在这么多的不便,那么不如干脆直接使用非交互模式使用它,再借助操作系统提供的shell工具集来协助完成更复杂的任务。sqlplus本身就是支持非交互式使用的,而且支持的非常好,符合一般的Unix设计哲学:从标准输入读取命令,把结果写到标准输出

2 sqlplus的两种非交互式使用方式

sqlplus在非交互模式下,可以从两个地方为其提供sql命令:一是通过外部文件,而是通过标准输入。

2.1 通过外部命令文件

sqlplus 用户名/密码@服务器IP/侦听服务名 @命令文件名

下面举一个例子。

命令文件名为 1.sql,内容如下:

select count(*) from dba_objects;
exit;

执行命令为:

sqlplus sys/***@172.16.2.190/xgdb.db001.xigang @1.sql

此时执行完毕会把结果输出。

这种外部命令文件的方式,需要建立单独的物理文件来存储命令,适合经常使用的大批量管理任务。

2.2 通过标准输入

既然sqlplus从标准输入来读取命令,那么就可以利用管道把命令发送给它。

echo 命令 | sqlplus 用户名/密码@服务器IP/侦听服务名

这种方式不需要在命令中包含 exit;,因为sqlplus执行后自动退出。下面是个例子:

echo ‘select count(*) from dba_objects;‘ | sqlplus sys/***@172.16.2.190/xgdb.db001.xigang as sysdba

这样执行后结果输出到屏幕,由于sql语句是bash命令的参数,而整个命令行可以通过bash方便的历史记录来重复调用。又可以方便的使用上下箭头来重复使用执行过的sql语句了。

3 利用管道做后续处理

既然sqlplus把结果输出到了标准输出,那么就可以借助管道,使用sed,awk等文字处理工具来得到想要的输出。

echo -e ‘set pagesize 0\nselect table_name,owner from dba_tables;‘ | sqlplus -S sys/***@172.16.2.190/xgdb.db001.xigang as sysdba | awk ‘{printf("%-10d%-30s%-20s\n",NR,$1,$2);}‘

4 需要注意的地方

使用外部文件时,文件中的命令与交互式使用完全相同,无需担心。

  • 使用echo + 管道输入时,要避免 bash 元字符的干扰。一定要把sql命令使用单引号或双引号保护起来。当sql命令中有单引号时,应选择使用双引号保护。如

    echo  "insert into t1(name) values(‘奥巴马‘);" | sqlplus ...
    
  • 由于$在双引号里也会被当成元字符,所以需要对其进行转义
    echo "select * from v\$nls_valid_values where parameter=‘LANGUAGE‘;" | sqlplus ...
    
  • 另外,sqlplus不允许把sqlplus指令和sql命令混合在一行使用。而且sql命令必须以;结尾。这样必须使用echo -e 选项来开启把”\n”解释成换行符。例如
    echo -e ‘set pagesize 0\nset linesize 100\nselect * from dba_objects;‘ | sqlplus ...
    

5 一个简单的脚本

上述命令行方式虽然可以方便的通过bash的历史记录功能调用执行过的sql语句,但是命令行中除了sql语句还有大量的其他内容,显得繁琐。所以,写一个小脚本(文件名为sql)会让调用起来非常方便,如下:

#!/bin/bash -
if [ $# -ne 1 ]
then
    echo "Usage: $0 ‘SQL statement‘"
else
    SQL="set pagesize 0\nset linesize 300\n$1"
    echo -e "$SQL"
    echo -e "$SQL" | sqlplus -S sys/***@172.16.2.190/xgdb.db001.xigang as sysdba
fi

这样调用起来就像下面一样。

sql ‘select * from dba_objects;‘

这样显得非常干净利落,而且也不会在历史命令中记下ORACLE的账户信息,相对也安全。

时间: 2024-10-03 01:44:56

sqlplus的非交互式使用的相关文章

iOS7新特性 ViewController转场切换(三) 自定义视图控制器容器的切换---非交互式

@继续前面的内容,这一章,主要介绍自定义ViewController容器上视图VC的切换.先来看看系统给我们提供的容器控制器 UINavigationController和UITabBarController 都有一个NSArray类型的属性viewControllers,很明显,存储的就是需要切换的视图VC.同理,我们定义一个ContainerViewController,是UIViewController的直接子类,用来作为容器依托,额,其他属性定义详见代码吧,这里不多说了.(PS:原先我进

交互式fdisk分区工具 VS 非交互式parted分区工具及实例演练!

交互式fdisk分区工具 VS 非交互式parted分区工具 linux中磁盘资源是如何管理? 在windows系统中,我们对磁盘管理或是分区,C盘D盘E盘,打开"磁盘管理器",以设备的形式管理. 而linux哲学"一切皆文本"的思想,无论是设备也好,在linux中都是以文件的形式,来管理磁盘资源的. 设备文件,用于关联至一个设备驱动程序,能够跟与之对应设备产生关联,与硬件设备进行交互使用. 每个设备都有,设备号,用于内核标识识别设备: 主设备号:major num

登录式与非登录式&交互式与非交互式shell及其环境初始化过程

交互式shell和非交互式shell(interactive shell and non-interactive shell) 交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.退出.当你退出后,shell也终止了. shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行.在这种模式 下,shell不与你进行交互,而是读取存

推送文件(expect交互式方式与sshpass非交互式方式)

前提条件 以下两种推送的文件是SSH的公钥,推送方式依赖于SSH,基于SSH的相关方面操作和机器相关配置请参考我的上一篇博文"ssh服务批量管理例子" 1.expect交互式方式 1.1上传文件及文件内容 #以10机器为例. #执行rz –y分别上传"dis-sshkey"."expect-copy-sshkey.exp"和"iplist",三者文件内容如下: [[email protected] ~]$ ls -l dis-

/etc/profile与/etc/bashrc、交互式与非交互式、login与non-login shell的区别

线上的memcached又挂了,仍然没有得到core文件.排查原因,同事发现启动memcached的脚本存在可疑问题. 问题一:没有设置memcached工作目录,有可能core dump时没有工作目录写权限 这些脚本由crontab启动.脚本中没有设置工作目录,而这是非root用户的crontab.启动memcached时,工作目录不是memcached可执行文件所在目录.实验证明,这个是用户的home目录,crontab运行的脚本中打印pwd,结果是"home/work",work

非交互式创建账号和修改密码

ubuntu系统 1. 创建用户 带家目录,登录权限 [email protected]:/home/leco# useradd -m -s /bin/bash apple 2. 非交互式修改密码 [email protected]:/home/leco# echo "apple:111111" | chpasswd centos系统 echo "123456"|passwd --stdin  leco

交互式shell与非交互式shell

首先一点是明确的:/etc/profile是设置所有用户的环境变量的配置文件,/home/omm/.profile是针对特定的用户设置环境变量的配置文件(omm用户). 但是重要的区别是:/etc/profile并不是每次都会加载的.它要区分login,non-login,interactive和non-interactive 模式的情况. login 代表用户登入, 比如使用 "su -" 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 logi

交互式shell和非交互式shell、登录shell和非登录shell的区别

交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(interactive shell and non-interactive shell)交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.退出.当你退出后,shell也终止了.s

交互式shell和非交互式shell的区别

交互式模式就是shell等待你的输入,并且执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.签退.当你签退后,shell也终止了.shell也可以运行在另外一种模式:非交互式模式.在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们.当它读到文件的结尾,shell也就终止了.