sqlplus的非交互式使用

1 sqlplus交互界面存在的问题

sqlplus是ORACLE数据库的最重要的官方命令行client软件。是DBA的必备工具,使用它可以完毕差点儿全部的管理任务。然而。sqlplus的交互界面并不是很友好,输入命令时不具备历史命令记录功能。默认的输出结果更是不堪入目。mysql

在易用性方面,sqlplus确实比mysqlclient差了很多。sql

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

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

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

2.1 经过外部命令文件

sqlplus username/password@serverIP/侦听服务名 @命令文件名称

如下举一个样例。
命令文件名称为 1.sql。内容例如如下:安全

select count(*) from dba_objects;
exit;

运行命令为:bash

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

此时运行完毕会把结果输出。
这样的外部命令文件的方式。需要创建单独的物理文件来存储命令。适合经常使用的大批量管理任务。markdown

2.2 经过标准输入

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

echo 命令 | sqlplus username/password@serverIP/侦听服务名

这样的方式不需要在命令中包括 exit;,由于sqlplus运行后本身主动退出。如下是个样例:ui

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

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

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的帐户信息,相对也安全。

相关文章
相关标签/搜索