between and 怎么使用
请参考《DM_SQL 语言手册》,手册位于数据库安装路径 /dmdbms/doc 文件夹,示例如下:

BETWEEN ... AND 属于前包含后不包含,包含 2019-01-01 包含 2020-01-01。
如何设置成主键后,生成默认自增
DM 数据库也可以实现这种方式,只是和 MySQL 的操作方式不一样而已。举例如下:
CREATE TABLE "TAB_12" |


小写调用存储过程报错
这个是数据库大小写敏感的问题。数据库在初始化的时候选择是否大小写敏感,默认是大小写敏感。这时执行的 SQL 在到解释器那层解析时,会自动转换为大写名称。举例如下:
create or REPLACE PROCEDURE p_test as |

而以下语句将报错:
create or REPLACE PROCEDURE "p_test1" as |

因为执行 call p_test1() 时,数据库解释器自动换行成 CALL P_TEST1(),而对象 P_TEST1 在数据库中是不存在的,数据库中存的是 p_test1 这个。可以加上“”再执行,执行结果如下图所示:

DM 中按姓氏笔画排序用什么函数
可以使用 NLSSORT 函数实现此功能,NLSSORT 支持以拼音、笔画、部首排序,示例如下:
拼音:SELECT * FROM PEOPLE ORDER BY NLSSORT(name,'NLS_SORT = SCHINESE_PINYIN_M'); |
有类似 Oracle 的 redo 日志的文件吗,如何语句查询
DM 有 redo 日志,默认位置在数据库文件夹内,名称为:数据库名 0X.log。
如 (DAMENG01.log DAMENG02.log) 可以通过如下语句查看 redo 日志信息。
select * from v$rlogfile; |
关于 redo 日志的介绍请参考《DM 系统管理手册》第二章-2.4 节内容(手册位于数据库安装路径 /dmdbms/doc 文件夹下),节选如下:
- 重做日志,又叫 REDO 日志,指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 数据库都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件以 log 为扩展名。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为
DAMENG01.log、DAMENG02.log,这两个文件循环使用。 - 重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。但是如果出现意外情况,例如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页来不及写入数据文件。这样,在重启 DM 实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的状态。
- 重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在 DM 数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的操作也记录在日志内,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。
字符串截断、超长文本截取
- 执行 INSERT 时报错
一般此类问题是由于目标表存在一个(或多个)字段长度不够,导致插入失败。重点关注 CHAR、VARCHAR 字段的长度,可以创建一个具备足够长度的测试表,将报错数据插入测试表中,通过 select max(length(“目标字段”)) from “测试表”,获得插入数据实际的长度信息,从而修改目标表数据或者处理包含超长字段的记录。
另外,注意中文字符的长度问题:数据库初始化参数 LENGTH_IN_CHAR=0 时,unicode 编码下一个中文占据 3 个字节(char(3));GBK 编码下一个中文占据 2 个字节(char(2));当数据库初始化参数 LENGTH_IN_CHAR=1 时,char(1) 即可存储一个字符。

- 执行查询时报此错误
此类问题常见于分组查询中使用了 wm_concat() 之类函数拼接字符串,由于分组数据记录过多导致拼接函数返回值超长,解决方法一般是改写 SQL 查询条件降低分组记录数或者对 SQL 语句进行修改(如改为超长切分)。
此外,clob 字段进行模糊查询时的字符串截断:Case (clob_column_name as varchar) like。
- 数据迁移时报错
一般从 Oracle 迁移到 DM 的时候,出现字符串截断的一般都是字段中含有中文,出现这种问题是因为 DM 初始化的时候选择的字符集是 Unicode(即 utf-8),该字符集的国际标准是一个汉字占 3 个字节,而 Oracle 中默认情况下一个汉字占 2 个字节,此时迁移的时候就会报。
遇到该错误有 3 种解决方法。
- 在初始化数据库的时候,字符集选择【gb18030】。
- 在初始化数据库的时候,选择【VARCHAR 类型以字符为单位】。
- 因为前面 2 种都需要重新初始化数据库,第三种不需要重新初始化数据库即可解决,即在选择迁移方式时,选择字符长度映射关系为 2,如下图所示:

to_date(2019/12/31,’YYYY-MM-DD’)报:无效的日期格式
【场景复现】:

【解决方式】:

【报错原因】:
合法的 DATE 格式为年月日、月日年和日月年三种,各部分之间可以有间隔 (".","-","/") 或者没有间隔符;合法的 TIME 格式为:时分和时分秒,间隔符为”:”。
详见《DM_SQL 语言手册》第八章-函数 8.3 日期时间函数中第 37 条。(手册位于数据库安装路径 /dmdbms/doc 文件夹下)
举例如下:
SELECT TO_DATE('2003-06-19 08:40:36','YYYY-MM-DD HH:MI:SS'); |
查询结果如下:

数据链路在哪里创建
数据链路也就是外部链接,外部链接对象 (LINK) 是 DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。
例如:DM-DM 外部链接的创建
- 两台服务器,其中一个为目的主机 A,另一个为源端机器 B;分别在这两台服务器上修改 dm.ini 中参数
MAL_UTHR_FLAG = 0,MAL_INI=1(开启 MAL 系统),且配置 dmmal.ini (保证源端目的端的 dmmal.ini 文件相同)如下:
[MAL_INST1] |
[MAL_INST2] |
- 分别重启 A,B 两台机器上的 DM 服务。
- 在主机 A 上建表 test:
CREATE TABLE TEST(C1 INT,C2 VARCHAR(20)); |
在 B 上建立到 A 的外部链接 LINK01:
CREATE PUBLIC LINK LINK01 CONNECT WITH SYSDBA IDENTIFIED BY SYSDBA USING '192.168.10.2/5536'; |
- 在 B 上使用链接进行插入,更新,删除等操作,说明外部链接创建成功。如下图所示:

注意异构外部链接创建步骤请参考《DM_SQL 语言使用手册》第 16 章-外部链接。(手册位于数据库安装路径
/dmdbms/doc文件夹下)
DM 有没有类似 pl\sql 的对比表结构,比对表数据差异的工具,生成更新脚本,更新到正式环境
DM 数据库目前没有比对工具,可以自己写一个 SQL 进行比对或手动比对。示例如下:
- 执行如下语句查看表结构信息。
SELECT * FROM DBA_TAB_COLUMNS; |

- 执行如下语句将不同数据库中表结构信息导入至新创建表中,方便进行对比。
CREATE TABLE TABLE_2 AS SELECT * FROM DBA_TAB_COLUMNS; |
表 TABLE_2 是 DM 数据库实例(端口 5236)中的表结构信息,表 TXT_1 是 DM 数据库实例(端口 5237)中的表结构信息,根据不同实例中的表结构进行比对是否存在不一致的表。


- 将 TXT_1(端口 5237)表导入到 DM 数据库(端口 5236)中,进行左连接查询,比对是否存在表结构差异。
SELECT DISTINCT A.OWNER,A.TABLE_NAME |

DM 数据库如何获取表的列注释?在代码中如何修改列属性的注释
DM 数据库查询表的列注释语句如下:
select * from SYSCOLUMNCOMMENTS; |

如题所示:用户可以自行条件筛选得到想要的结果集。
列属性的注释:
select COMMENTS from user_col_comments where TABLE_NAME='TEST' AND COLUMN_NAME='ID'; |
修改列属性的注释:
comment on column "SYSDBA"."TEST"."ID" is 'ttttt'; |
DM 数据库 VARCHAR2 的长度最大是多少
- DM 数据库的 VARCHAR2 长度如果指定了 USINGLONG ROW 存储选项,则插入 VARCHAR 数据类型的长度不受数据库页面大小限制。VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为 32767;
关于 VARCHAR2 长度详细简介详见《DM_SQL 语言使用手册》-1.41 章节。(手册位于数据库安装路径 /dmdbms/doc 文件夹下)
- VARCHAR2 数据类型指定变长字符串,用法类似 CHAR 数据类型,可以指定一个不超过 8188 的正整数作为字符长度,在 DM 数据库中,VARCHAR2 数据类型的实际最大长度由数据库页面大小决定,在建库时指定,之后无法修改。具体最大长度算法如下表所示:
| 数据页面大小 | 实际最大长度 |
|---|---|
| 4K | 1900 |
| 8K | 3900 |
| 16K | 8000 |
| 32K | 8188 |
DM 支持的字段名最大长度
正规标识符的最大长度是 128 个英文字符或 64 个汉字。
- 测试:64 个汉字长度字段。
CREATE TABLE "SYSDBA"."TABLE_1" --64个汉字字段 |
测试结果:最大长度是 64 个汉字字符。

- 测试:128 个英文字符长度字段。
测试成功。
- 测试:129 个英文字符长度字段。
测试结果:最大长度是 128 个英文字符。
DM 数据库有类似于 Oracle 的 v$sql 的视图吗
DM 数据库没有提供完全一样的系统视图,提供了 V$SQL_HISTORY 视图来达到类似的功能。目前 DM 数据库可以兼容 100 多个 Oracle 的系统视图。在《DM 系统管理员手册》中有更多介绍(手册位于数据库安装路径 /dmdbms/doc 文件夹下)。
[不能修改或删除聚集索引的列] 或 [试图删除聚集主键]、[表xx中不能同时包含聚集 KEY 和大字段]
- 情况一
表上某一列上创建有聚集索引,但是该列不是主键列。举例如下:
CREATE TABLE TEST_C (A INT, B VARCHAR, |
或:
CREATE TABLE TEST_C1(A INT,B VARCHAR); |
这种情况下,在列 A 上有一个聚集索引,如下图所示:

此时若想直接修改列 A 的字段类型或删除列 A,会报错:不能修改或删除聚集索引的列。
若想对列 A 进行修改,需要先删除掉 A 上的索引,再做修改。

- 情况二
表上某一列为聚集主键,举例如下:
CREATE TABLE TEST_PK(A INT PRIMARY KEY,B VARCHAR); |

此时修改或删除列 A,会报错:不能修改或删除聚集索引的列;删除表上的主键约束会报错:试图删除聚集主键。
在这种情况下,若想对列 A 进行修改,可以重建表,或者重新在别的列上建立一个聚集索引,然后再删掉,此时主键上的索引变成非聚集了,就可以修改了。
要想在一开始建表的时候就指定非聚集主键,有两种方法:
用语句显式指定;
修改 dm.ini 参数 PK_WITH_CLUSTER 为 0,默认创建主键时为非聚集型;
语句显式指定如下:
CREATE TABLE TEST_PK2(A INT,B VARCHAR, |

此时可以对列 A 进行修改与删除,如下图所示:


- 修改 dm.ini 参数的方式
由于 PK_WITH_CLUSTER 默认取值为 1,即仅指定 PRIMARY KEY 关键字时默认创建为聚集主键,修改为 0 后默认创建非聚集主键。如下所示:
SELECT * FROM V$DM_INI WHERE PARA_NAME = 'PK_WITH_CLUSTER'; |
查询该参数的值可以使用 SP_SET_PARA_VALUE(1,'PK_WITH_CLUSTER',0) 语句来将该参数值修改为 0;使用 SP_SET_PARA_VALUE(1,'PK_WITH_CLUSTER',1) 语句将该参数值改回 1。
另外,报错表 xx 中不能同时包含聚集 KEY 和大字段也可以通过将表重建为非聚集型主键的方式来解决。
DM 数据库如何获取系统时间
DM 数据库提供对应的系统函数获取系统时间,如下所示:
--返回值为:DATE |
DM 是否可以并发创建索引
DM 无法并发创建索引,如下所示:
drop table table1; |
按 Oracle 语法并行创建索引,如下所示:
create index ind_c2 on SYSDBA.TABLE1(c2) parallel 2; |
报错,如下所示:
create index ind_c2 on SYSDBA.TABLE1(c2) parallel 2; |
- DM 并行查询使用方法
修改并行查询相关的 dm.ini 参数,如下所示:
select * from v$dm_ini where para_name |
只有 PARALLEL_POLICY0 时并行才可以使用(取值:0,1,2),MAX_PARALLEL_DEGREE 指定并行度(取值:1-128);PARALLEL_THRD_NUM 指定并行线程数(取值:1-1024);
当 PARALLEL_POLICY=1 时(自动并行模式),修改 PARALLEL_POLICY 的值为 1,需要重启数据库生效:
sp_set_para_value(2,'PARALLEL_POLICY',1); |
修改 MAX_PARALLEL_DEGREE 为 10,即时生效:
sp_set_para_value(1,'MAX_PARALLEL_DEGREE',10); |
此时查询默认开启并行,且并行度为 10,当 MAX_PARALLEL_DEGREE 值为 1 时,无并行:
sp_set_para_value(1,'MAX_PARALLEL_DEGREE',1); |
但是此时指定 hint 的 parallel 仍可以开启并行,且指定hint优先级高于 MAX_PARALLEL_DEGREE 参数。
当 PARALLEL_POLICY=2 时(手动并行模式),修改 PARALLEL_POLICY 的值为 2,需要重启数据库生效:
sp_set_para_value(2,'PARALLEL_POLICY',2); |
此时 MAX_PARALLEL_DEGREE 参数无效,必须指定 hint 的 parallel 才开启并行。如下所示:
create table t_objects as select * from dba_objects; |




