sqlplus是ORACLE数据库的最重要的官方命令行客户端软件,是DBA的必备工具,使用它可以完成几乎全部的管理任务。然而,sqlplus的交互界面并不是非常友好,输入命令时不具有历史命令记录功能;默认的输出结果更是不堪入目。在易用性方面,sqlplus确实比mysql客户端差了不少。
既然sqlplus交互模式存在这么多的不便,那么不如干脆直接使用非交互模式使用它,再借助操作系统提供的shell工具集来协助完成更复杂的任务。sqlplus本身就是支持非交互式使用的,而且支持的非常好,符合一般的Unix设计哲学:从标准输入读取命令,把结果写到标准输出。
sqlplus在非交互模式下,可以从两个地方为其提供sql命令:一是通过外部文件,而是通过标准输入。
sqlplus 用户名/密码@服务器IP/侦听服务名 @命令文件名
下面举一个例子。
命令文件名为 1.sql,内容如下:
select count(*) from dba_objects;
exit;
执行命令为:
sqlplus sys/***@172.16.2.190/xgdb.db001.xigang @1.sql
此时执行完毕会把结果输出。
这种外部命令文件的方式,需要建立单独的物理文件来存储命令,适合经常使用的大批量管理任务。
既然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语句了。
既然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);}‘
使用外部文件时,文件中的命令与交互式使用完全相同,无需担心。
使用echo + 管道输入时,要避免 bash 元字符的干扰。一定要把sql命令使用单引号或双引号保护起来。当sql命令中有单引号时,应选择使用双引号保护。如
echo "insert into t1(name) values(‘奥巴马‘);" | sqlplus ...
另外,sqlplus不允许把sqlplus指令和sql命令混合在一行使用。而且sql命令必须以;结尾。这样必须使用echo -e 选项来开启把”\n”解释成换行符。例如
echo -e ‘set pagesize 0\nset linesize 100\nselect * from dba_objects;‘ | sqlplus ...
上述命令行方式虽然可以方便的通过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的账户信息,相对也安全。
原文地址:http://blog.csdn.net/smstong/article/details/45670045