时间:2021-07-01 10:21:17 帮助过:3人阅读
运行命令为:
sqlplus sys/***@172.16.2.190/xgdb.db001.xigang @1.sql
此时运行完毕会把结果输出。
这样的外部命令文件的方式。须要建立单独的物理文件来存储命令。适合常常使用的大批量管理任务。
既然sqlplus从标准输入来读取命令,那么就能够利用管道把命令发送给它。
echo 命令 | sqlplus username/password@serverIP/侦听服务名
这样的方式不须要在命令中包括 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 ...
因为$在双引號里也会被当成元字符。所以须要对其进行转义
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 ...
上述命令行方式尽管能够方便的通过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的账户信息,相对也安全。
sqlplus的非交互式使用
标签: