[TOC]
DIsql(DM Interactive SQL)是达梦数据库自带的命令行交互式客户端工具。主要用于在没有图形化界面的环境下,通过命令行与数据库进行交互。它的核心作用就是接收你输入的 SQL 语句,发给数据库去执行,然后把执行结果再返回并展示给你
在 DIsql 中 SQL 语句应以分号 ; 结束。对于执行语句块,创建触发器、存储过程、函数、包以及模式等时需要用 / 结束。
启动方法是去/dmdbms/bin目录下找到disql文件,运行./disql 可启动。

cd /dmdbms/bin
//数据库实例是默认端口5236时
./disql
//数据库实例是非默认端口xxxx时
./disql SYSDBA/123ABCabc@127.0.0.1:xxxx
当进入到DIsql后,如果想切换到其他 DM 数据库实例。有两种实现方式:
//一种是使用 LOGIN 命令。 对应退出是LOGOUT,从登录主库注销会话,断开连接而不退出 DIsql
SQL> LOGIN
服务名:DMSERVER
用户名:SYSDBA
密码:
SSL路径:
SSL密码:
UKEY名称:
UKEY PIN码:
MPP类型:
是否读写分离(y/n):
协议类型:
SQL>LOGOUT
//二是使用 CONN 命令。 对应退出是DISCONN,从登录主库注销会话,断开连接而不退出 DIsql
SQL>CONN SYSDBA/123ABCabc@127.1.1.0:5237
SQL>DISCONN
CREATE TABLESPACE ISLAND443_TS DTATFILE '/dmdata/data/DAMENG/TEST_01.DBF' SIZE 300 AUTOEXTEND ON NEXT 100 MAXSIZE 1024;
CREATE TABLESPACE创建表空间
DATAFILE DBF的地址
SIZE 初始大小
AUTOEXTEND ON 空间不足时允许文件自动扩展
NEXT 扩充的大小
MAXSIZE 最大是多少

CREATE USER ISAND_USER IDENTIFIED BY "Island@443" DEFAULT TABLESPACE ISLAND443_TS;
CREATE USER 创建用户
IDENTIFIED BY 创建密码
DEFAULT TABLESPACE 默认表空间

GRANT DBA TO ISAND_USER;
把DBA的权限授权给用户
GRANT SELECT ANY TABLE TO TEST_USER;
允许查所有的表(但授权了DBA,这个其实多余了)
注意转义密码中的特殊字符@,用双引号即可。

CREATE TABLE DEPT(
DEPT_ID INT PRIMARY KEY,
DEPT_NAME VARCHAR2(50) NOT NULL,
LOCATION VARCHAR2(100)
);
CREATE TABLE EMP(
EMP_ID INT PRIMARY KEY,
EMP_NAME VARCHAR2(50) NOT NULL,
GENDER CHAR(1) CHECK(GENDER IN ('M','F')),
BIRTH_DATE DATE,
HIRE_DATE DATE DEFAULT SYSDATE,
SALARY DECIMAL(10,2) CHECK (SALARY>=0),
DEPT_ID INT,
CONSTRAINT FK_EMP_DEPT FOREIGN KEY (DEPT_ID) REFERENCES DEPT(DEPT_ID)
);
CONSTRAINT FK_EMP_DEPT 创建一个名字为FK_EMP_DEPT的约束, 员工表的DEPT_ID 必须来自部门表的DEPT_ID。(部门表中DEPT_ID只有1,2,那员工表就不能出现3)

CREATE SEQUENCE SEQ_EMP_ID START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE SEQ_DEPT_ID START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE 创建序列,从1开始每次加1
SEQ_EMP_ID.NEXTVAL表示从序列 SEQ_EMP_ID 中获取下一个值,并且序列自动向前递增
INSERT INTO EMP (EMP_ID, EMP_NAME, GENDER, BIRTH_DATE, SALARY, DEPT_ID)
VALUES (SEQ_EMP_ID.NEXTVAL, '张三', 'M', DATE '2001-07-25', 15000.00, 1);
...

格式为SET XXX ON 或者是 SET XXX OFF
SHOW命令查看当前变量状态
SET AUTO ON //开启自动提交,自动COMMIT;
SET AUTO OFF //关闭自动提交(默认)
比如上述向员工表里面插入了张三,如果自动提交是OFF的话,insert执行成功后,数据库并没有真正保存,此时数据只是存在当前事务里,如果执行**ROLLBACK;那刚才插入的数据就没了。只有执行COMMIT;**数据才会真正的保存。
INSETR----->数据暂存在事务里------->COMMIT;---------->永久保存
[!NOTE]
那为什么插入后,我没有进行COMMIT,确能SELECT到张三这条信息呢?
因为这是事务隔离造成的,我的查询SELECT和插入INSETR是在同一个Session里完成的,当前事务中的数据对当前事务是可见的。
SET DEFINE ON;
默认前缀是&
输入一个SQL语句:SELECT * FROM EMP WHERE EMP_ID=&id;
disql处理后会提示:Enter value for id:
这时我再通过键盘输入1001
disql最终处理:SELECT * FROM EMP WHERE EMP_ID=1001;
SET FEED ON
每次执行完SQL后显示查出的或修改的总行数
SQL> HELP
HELP
----
显示打印信息,键入HELP或者 ? 。
HELP|? [topic]
APPEND 添加文本到当前行的末尾。
ACCEPT 读取一行输入数据赋值给指定变量。
COLUMN 设置指定列的显示属性信息,或者列出指定列或所有列的当前显示属性。
CONNECT 连接到服务器。
CLEAR 重置或清理指定操作的缓存。
DISCONNECT 提交所有修改到服务器,但不退出DISQL。要退出DISQL使用exit命令。
DESCRIBE 获取表或视图、存储过程、函数、包、记录、类的结构描述。
DEFINE 定义替换变量,并对其指定一个CHAR类型值,或者显示单个或所有变量的信息。
HOST 在不退出DISQL的情况下执行操作系统命令。
EDIT 打开一个文本编辑器,里面包含最后一条SQL记录。
EXIT 提交或者回滚所有修改,退出DISQL。
MORE 切换到下一个结果集。
LIST 显示最近执行的SQL语句或者PL/SQL块信息,或者使用 ";"命令。不显示DISQL命令。
PROMPT 发送指定的消息或者空行到用户的屏幕。
PRINT 展示当前绑定变量的值,或列出所有绑定变量的值。
QUIT 提交或者回滚所有修改,退出DISQL。
SET 设置某个系统环境变量,设置的值会修改当前会话的DISQL系统设置,例如:
- 设置数据显示宽度
- 制定 HTML 格式
- 允许/禁止打印列头
- 设置每一页的行数
SHOW 显示某个DISQL的系统变量,或者当前DISQL的环境变量。
SPOOL 屏幕显示的内容输出到指定文件。
WHENEVER 当一个SQL命令,或者PL/SQL块生成一个错误的时候,执行特定的命令(默认是DISQL退出)。
UNDEFINE 删除一个或多个define或start命令参数生成变量。
VARIABLE 声明一个可以在PL/SQL中引用的绑定变量,或者列出单个变量或所有变量的当前显示特性。
单输入一个host就可以进入操作系统界面,输入exit再回到disql,非常的好用!

获取对象的结构信息

执行脚本的命令是start,后面加脚本路径即可。
首先host命令进入操作系统界面,写一个脚本放到/home/dmdbs下,命名为test.sql,exit回到disql,运行此脚本。
PROMPT ========= 创建学生表 =========
CREATE TABLE STUDENT(
ID INT,
NAME VARCHAR2(30),
SCORE INT
);
INSERT INTO STUDENT VALUES(1,'张三',90);
INSERT INTO STUDENT VALUES(2,'李四',85);
INSERT INTO STUDENT VALUES(3,'王五',95);
PROMPT ========= 查询学生信息 =========
SELECT * FROM STUDENT;
COMMIT;
START /home/dmdba/test.sql

用户通过使用快速装载工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到 DM 数据库中,或把 DM 数据库中的数据按照一定格式载出到文本文件中。

dmfldr(DM Fast Loader)包含 dmfldr 客户端和 dmfldr 模块两部分。dmfldr 客户端实现初始化快速装载环境、读取数据、打包数据和发送数据功能。dmfldr 功能模块嵌入在数据库服务器中,实现装载功能。两者相互协作,共同完成 dmfldr 的各项功能。
当进行数据载入时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的 dmfldr 模块,由 dmfldr 模块完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
当进行数据载出时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的 dmfldr 模块。dmfldr 模块解析并打包需要导出的数据,发送给 dmfldr 客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。
先导出再导入,导出ISAND_USER用户下的EMP表格。
./dmfldr USERID=ISAND_USER/Island443@localhost:5237 MODE=\'OUT\' TABLE=EMP DATA=\'/dmdata/test.txt\'
USERID为用户和密码
MODE为模式,out为导出,in为导入
TABLE为导出指定表
DATA为导出的地址(可导出txt文件,可导出csv文件,根据导出文件的后缀名决定)


DELETE FROM EMP;
COMMIT;
删除表中所有数据,手动加入到txt文件一些信息,再进行导入。
./dmfldr USERID=ISAND_USER/Island443@localhost:5237 MODE=\'IN\' TABLE=EMP DATA=\'/dmdata/test.txt\'


控制文件 CONTROL 是启动 dmfldr 必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时,dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
控制文件中还可以指定其他 dmfldr 参数值。
一个控制文件的例子:
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/opt/data/test1.txt' STR X '0A'
BADFILE '/opt/data/test1.bad'
INTO TABLE test1
FIELDS '|'
(
F1,
F2 DATE FORMAT 'YYYY-MM-DD',
F3 NULL,
F4 TERMINATED BY WHITESPACE ENCLOSE BY '(',
F5 CONSTANT "test",
F6 "trim()"
)
LOAD DATA
INFILE '/opt/data/test2.txt' STR X '0A'
BADFILE '/opt/data/test2.bad'
INTO TABLE test2
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 "sysdate",
C4 "substr(:C2,1,2)"
)
OPTIONS 全局选项中定义了 SKIP、ROWS、DIRECT 和 INDEX_OPTION 参数
SKIP = 0:表示从数据文件的第一行开始加载,不跳过任何行
ROWS = 50000:表示每处理 50000 行数据就提交一次
DIRECT = TRUE:启用快速加载模式,跳过 SQL 引擎,直接将数据写入数据文件。
INDEX_OPTION:索引选项为2
1 不刷新二级索引,数据按照索引先排序,装载完后再将排序的数据插入索引
2 不刷新二级索引,数据装载完成后重建所有二级索引 (最快,先全装载再建索引)
3 刷新二级索引, 数据装载的同时将数据插入二级索引 (最慢了这种)
第一个Load任务(向表一装载数据)
INFILE:指定数据文件路径为 /opt/data/test1.txt
STR X '0A':指定行分隔符为十六进制 0A(即换行符 \n),说明该文件是 Linux/Unix 格式
BADFILE:指定错误数据记录文件,加载失败的行会被写入 /opt/data/test1.bad
INTO TABLE test1:数据加载到表 test1 中
FIELDS '|':默认列分隔符为 |
F1 普通列,按默认分隔符 | 读取数据,类型默认为 CHAR
F2 DATE FORMAT 'YYYY-MM-DD' 该列为日期类型,数据格式必须是 YYYY-MM-DD(如 2026-07-15)
F3 NULL 忽略数据文件中的该列值,直接赋值为 NULL
F4 TERMINATED BY WHITESPACE ENCLOSE BY'(' 该列不再以|作为结束标志而是以空格作为结束标志,且数据用(作为封闭符(如 (abc),实际取值为 abc)
F5 CONSTANT "test" 该列不读文件数据,固定填入字符串 "test"
F6 "trim()" 对该列数据执行 trim() 函数,去除前后空格后再入库
第二个Load任务(向表二装载数据)
C1 TERMINATED BY ' ' C1 列的结束标志是空格,而是空格
C2 普通列,按默认分隔符 | 读取
C3 "sysdate" 忽略文件中的该列数据,直接填入系统当前时间
C4 "substr(:C2,1,2)" 对 C2 列的数据取前 2 个字符,作为 C4 的值(如 C2 为 abcdef,则 C4 为 ab)
文章
阅读量
获赞
