一、前言
在Linux操作系统下使用shell脚本调用disql执行SQL或SQL脚本,是我们使用数据库一定会遇到的问题。有时需要直接执行SQL,有时需要执行SQL脚本,有时可以从dmdba用户调用,有时必须从root用户调用,总之,具体的情况不尽相同。本文就来详细介绍一下这些不同方式的具体方法。
二、详细教程
2.1 dmdba下操作
2.1.1 disql直接执行SQL
disql / as sysdba -e "select * from v\$instance;"
注意:“$”需要进行转义
2.1.2 disql执行SQL脚本
disql / as sysdba \`/home/dmdba/select.sql
注意:脚本中要加上 exit; 和 /。并且以SQL脚本的方式执行时“$”不需要转义,例如:
[dmdba@shine ~]$ cat select.sql
select * from v$instance;
exit;
/
2.2 root用户下操作
2.2.1 disql直接执行SQL
su - dmdba -c "disql / as sysdba -e \"select * from v\\\$instance;\""
注意:从root直接调用的话,SQL中的“$”需要转义,同时转义符“\”本身也需要转义(所以加三个“\”)。
2.2.2 disql执行SQL脚本
su - dmdba -c "disql / as sysdba \\\`/home/dmdba/select.sql"
注意:同上,从root直接调用的话,“\`”同时需要转义,即“\\\`”。
2.2.3 切换dmdba用户执行shell脚本
su - dmdba -s /bin/bash select.sh
注意:select.sh要放到/home/dmdba目录下,内容如下:
disql / as sysdba -e "select * from v\$instance;"
脚本内容即 2.1.1 的命令。
三、进阶教程
有时我们在调用disql执行SQL时需要将内容输出到文件并保存,那么就需要用到如下的功能。
(1)重定向到文件
只需要在命令后边加上 > your_file.txt。
(2)隐藏disql连接数据库时的输出内容
disql -S
注意:disql的-S参数是隐藏标识符,需要在登录之前配置,所以-S参数要放到 / as sysdba 之前,例如:disql -S / as sysdba。【disql -S /@localhost:5235 as sysdba】
(3)查询时只要表头和数据
如图这张表,如果只需要将表头和数据重定向文本文件中,应该如何操作:

方法:-S+-C([pages]环境变量)
## 注:把pages的数值设置的比结果集的行数大,便可以把所有的数据放到一页中(示例中30>21)。
[dmdba@dameng ~]$ disql -S SYSDBA/'"Dameng@!23"' -C "set pages 30" -E "select * from test.course" > result.txt
[dmdba@dameng ~]$ cat result.txt
COURSE_ID COURSE_NAME COURSE_TYPE CREDITS TEACHER_ID CLASSROOM COURSE_STATUS
----------- ------------------------------ ----------- ------- ----------- --------- -------------
1 计算机科学导论 3 6 6 209 1
2 数据结构与算法 3 3 5 107 3
3 软件工程实践 2 4 15 309 1
4 人工智能基础 2 7 3 207 2
5 数据库系统原理 1 6 7 205 2
6 高等数学Ⅰ 1 5 13 109 3
7 概率论与数理统计 1 3 17 105 3
8 应用数学建模 2 4 7 306 1
9 大学物理实验 3 9 2 202 3
10 量子物理前沿 1 5 8 301 3
11 世界文学经典 3 8 20 404 1
12 中国近代史研究 2 9 9 309 3
13 西方哲学史 2 8 2 204 2
14 电路分析基础 1 1 17 406 2
15 机械设计原理 3 7 8 407 1
16 土木工程材料学 1 3 16 304 2
17 微观经济学 3 5 8 107 1
18 公司财务管理 1 4 12 102 2
19 数字营销策略 1 5 17 208 3
20 设计思维导论 3 6 7 307 1
21 建筑空间设计 3 6 8 105 3
四、配置文件设置环境变量
把需要添加的环境变量添加到文件$DM_HOME/bin/disql_conf/glogin.sql文件中
[dmdba@dameng ~]$ cat $DM_HOME/bin/disql_conf/glogin.sql
SET ECHO OFF
SET HEA OFF
SET NEWPAGE NONE
SET FEED OFF
SET TIMING OFF
这样再使用disql时便会自动应用glogin.sql文件中的环境变量。
附录 disql常用环境变量
用 SET 命令设置环境变量,格式:set [变量名称] on|off,例如:
[dmdba@dameng ~]$ disql SYSDBA/'"******"' -C "set hea off newpage none" -e "select table_name from dba_tables where owner = 'TEST';"
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 101.915(ms)
disql V8
COURSE
FINAL_CALCULATION
GRADED_STUDENTS
GRADE_RANGES
RANKED_STUDENTS
SALES
STUDENT
STUDENT_SCORES
TEACHER
TEST
| 变量名称 | 属性 | 用途 |
| AUTO[COMMIT] | ON|OFF (缺省值) | 设置自动提交 |
| DEFINE | c(默认的变量前缀是&)|ON (缺省 值)|OFF | 定义本地变量 |
| ECHO | ON (缺省值)|OFF | 显示脚本中正在执行的 SQL 语句 |
| FEED[BACK] | 6 (缺省值)|n|ON|OFF | 显示当前 SQL 语句查询或修改的行数 |
| HEA[DING] | ON (缺省值)|OFF | 显示列标题 |
| LINESHOW | ON (缺省值)|OFF | 显示行号 |
| PAGES[IZE] | SET PAGES[IZE] <14(缺省值)|n> | 设置一页有多少行数。 |
| TIMING | ON (缺省值)|OFF | 显示每个 SQL 语句花费的执行时间 |
| LONG | 800(缺省值)|n | 设置大字段类型显示的最大字节数 |
| LINESIZE | screem_length(缺省值,屏幕宽度)|n | 设置屏幕上一行显示宽度 |
| SERVEROUT[PUT] |
ON | OFF(缺省值) [SIZE 20000(缺省值)|n] [FOR[MAT] WRA[PPED] | WOR[D_WRAPPED](缺省值) | TRU[NCATED]] |
在块中有打印信息时,是否打印,及打印的格式 |
| TRIMS[POOL] | OFF(缺省值)|ON | 设置 spool 文件中每行的结尾空格 |
| COLSEP | text | 设置列之间的分割符。缺省为一个空格 |