找回密码
 立即注册
首页 业界区 业界 信创-ORACLE迁移到DM8

信创-ORACLE迁移到DM8

颛孙中 2025-6-3 01:14:00
信创-ORACLE迁移到DM8

1. DM8实列初始化

安装可以直接参考官网安装说明(安装说明)[https://eco.dameng.com/document/dm/zh-cn/pm/install-uninstall.html]
安装完成后使用如下命令初始数据库
/dm/dmdbms/bin/dminit path=/dm/data PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CHARSET=0 CASE_SENSITIVE=1 PORT_NUM=5236 BLANK_PAD_MODE=1 SYSDBA_PWD=123456 SYSAUDITOR_PWD=123456
其中参数 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CHARSET=0 CASE_SENSITIVE=1 BLANK_PAD_MODE=1 迁移工具SQLark有校验这些参数,配置必须包含这些参数
2. DM8服务注册

切换到root用户 su root
dm/dmdbms/script/root/root_installer.sh
安装完成后服务名为 DmAPService

  • 可以使用 systemctl start DmAPService 启停服务
  • 也可使用 dm/dmdbms/bin/DmAPService 启停服务
Usage: ./DmAPService { start | stop | status | condrestart | restart }
如果初始配置错误可以使用以下命令删除实列,重新初始化
  1. /dm/dmdbms/script/root/dm_service_uninstaller.sh -n DmAPService
  2. rm -rf /dm/data/DAMENG/*
复制代码
3. 必要兼容配置

设置全局兼容参数
  1. -- 公众号:小满小慢 小游戏: 地心侠士
  2. SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',2);
  3. SP_SET_PARA_VALUE(2,'CALC_AS_DECIMAL',1);
  4. SP_SET_PARA_VALUE(2,'ORDER_BY_NULLS_FLAG',1);
  5. SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',0);
  6. SP_SET_PARA_VALUE(2,'ENABLE_CS_CVT',1);--启用编码转换,类型转换用cast
  7. SP_SET_PARA_VALUE(2,'ENABLE_TABLE_EXP_REF_FLAG',1);
  8. --查询单个配置参数使用 SF_GET_PARA_VALUE 函数
  9. select SF_GET_PARA_VALUE(2,'COMPATIBLE_MODE');
复制代码
安装扩展包
  1. -- 公众号:小满小慢 小游戏: 地心侠士
  2. SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_XMLDOM');
  3. SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_XMLPARSER');
  4. SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_XMLPARSER');
  5. SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_JOB');
  6. DMBS_JOB GRANT DBA TO 用户名; -- JOB必须要添加DBA权限
复制代码
建立适配类型
  1. CREATE OR REPLACE TYPE ODCIVARCHAR2LIST AS VARRAY(32767) OF VARCHAR2(4000);
  2. --公众号:小满小慢 小游戏: 地心侠士
复制代码
建立适配视图

建立适配同义词
  1. CREATE OR REPLACE SYNONYM COLS FOR USER_TAB_COLS;
  2. CREATE OR REPLACE SYNONYM "XMLDOM" FOR "SYS"."DBMS_XMLDOM";
  3. CREATE OR REPLACE SYNONYM "XMLPARSER" FOR "SYS"."DBMS_XMLPARSER";
  4. -- 公众号:小满小慢 小游戏: 地心侠士
复制代码
建立适配函数
  1. -- 解决达梦没有nls_charset_id而Oralce有,达梦默认不使用这个参数,返回null即可
  2. CREATE OR REPLACE OR REPLACE FUNCTION NLS_CHARSET_ID(NAME IN VARCHAR2) RETURN INTEGER AS
  3. BEGIN
  4. -- 公众号:小满小慢 小游戏: 地心侠士
  5. RETURN NULL;
  6. END;
复制代码
关键字冲突处理
  1. LOGIN,EXEC,XML,VIRTUAL
复制代码
重启服务
  1. dm/dmdbms/bin/DmAPService restart
复制代码
4. 迁移必须步骤

为了保障数据库迁移的准确度,总结为以下4步骤

  • 迁移表结构
  • 迁移表数据
  • 迁移触发器外的所有脚本
  • 迁移触发器
  • 迁移完成后,确保启用所有触发器
5.特殊语法处理


  • 迁移过程中SYS_CURSOR有几率被转换成SYS CURSOR,需要修改为SYS_CURSOR 重新执行.
  • 不支持数据隐式转换,需要调用CAST(value AS 类型说明)转换类型(后测试支持)
  • 参数默认值不支持V_PARAM in Integer :=2 的写法,需要调整成 V_PARAM in intger default 2
  1. --- ORACLE----
  2. CREATE Function format(v_Dec Integer := 2) Return Varchar2;
  3. --- DM8----公众号:小满小慢 小游戏: 地心侠士
  4. CREATE Function format(v_Dec intger default 2) Return Varchar2;
复制代码

  • 不支持在SYS模式下建立类型,SYS.ODCIVARCHAR2LIST 需要去掉 SYS 模式
  1. ---ORACLE--
  2. SELECT * FROM TABLE(SYS.ODCIVARCHAR2LIST(1,2,3,4,5))
  3. ---DM8--公众号:小满小慢 小游戏: 地心侠士
  4. SELECT * FROM TABLE(ODCIVARCHAR2LIST(1,2,3,4,5))
复制代码

  • 不支持实用xmltype直接序列化游标 xmltype(sys_refcursor)需要做如下代码调整
  1. declare
  2.    CTX DBMS_XMLGEN.CTXHANDLE;
  3.    x           xmltype;
  4.    str varchar2(2000);
  5.    sysCursor sys_refcursor;
  6. begin
  7.    open sysCursor for select 1 F_A from dual;
  8.    -----Oracl语句------
  9.    x   := xmltype(sysCursor);
  10.    str := x.extract('/*/ROW').getClobVal(0, 0);
  11.    -- 公众号:小满小慢 小游戏: 地心侠士
  12.    -----DM8语句-----
  13.    CTX := DBMS_XMLGEN.NEWCONTEXT(sysCursor); -- 转换游标
  14.    str := EXTRACT(DBMS_XMLGEN.GETXML(CTX), '/*/ROW'); -- 查询xml
  15.    DBMS_XMLGEN.CLOSECONTEXT(CTX); -- 关闭hander
  16. end;
复制代码

  • XMLForest生成xml时,如果嵌套XMLELEMENT使用内容做了xml转义,需要使用xmltype包装
  1. ---ORACLE---
  2. WITH T AS (SELECT 1 F_A, 2 F_B FROM DUAL)
  3. SELECT XMLELEMENT("ROW_DATA", XMLFOREST(F_A, F_B)).GETCLOBVAL() AS ABC
  4. FROM T;
  5. ---DM8--- 公众号:小满小慢 小游戏: 地心侠士
  6. WITH T AS
  7. (SELECT 1 F_A, 2 F_B FROM DUAL)
  8. SELECT XMLELEMENT("ROW_DATA", XMLTYPE(XMLFOREST(F_A, F_B))).GETCLOBVAL() AS ABC
  9. FROM T;
复制代码

  • 不支持XMLTYPE.gettCLOBVAL的静态方法,必须先有xmltype
  1. ----Oracle---
  2. with t as (select 1 F_A, 2 F_B from dual)
  3. SELECT Xmltype.getClobVal(xmlelement("A", F_A)) AS ABC FROM t;
  4. ----DM8--- 公众号:小满小慢 小游戏: 地心侠士
  5. with t as (select 1 F_A, 2 F_B from dual)
  6. SELECT xmlelement("a",F_A).getClobVal() AS ABC FROM t;
复制代码

  • XMLTALBE 解析XML不支持默认列列类型
  1. ----Oracle---
  2. select x.*
  3. from xmltable('/rows/row' passing
  4.                xmltype('<rows><row><name>test</name></row></rows>')
  5.                columns xml_NAME path 'name') x
  6. --DM8---
  7. select x.*
  8. from xmltable('/rows/row' passing
  9.                xmltype('<rows><row><name>test</name></row></rows>')
  10.                columns xml_NAME varchar2(100) path 'name') x
复制代码

  • UTL_HTTP.WRITE_RAW 不支持Blob参数
  1. ---Oracle---
  2. PROCEDURE write_raw(r IN OUT NOCOPY req,data IN RAW);
  3. ---DM8--- 公众号:小满小慢 小游戏: 地心侠士
  4. PROCEDURE WRITE_RAW(r IN OUT NOCOPY REQ,data IN VARBINARY);
  5. --达梦实现Blob转varbinary(不能直接使用cast转换)
  6. DECLARE
  7.   l_blob_data BLOB;
  8.   bin varbinary ;
  9. BEGIN
  10.   l_blob_data := HEXTORAW('0123456789ABCDEF');
  11.   Dbms_lob.READ(l_blob_data,cast(dbms_lob.GETLENGTH(l_blob_data) as INTEGER),1,bin);
  12.   dbms_output.put_line(bin);
  13. END;
复制代码

  • Group by rollup 数据没有按照明细小计汇总的方式排序,需要显示指定排序,可以直接使用 rollup(a,b) order by grouping(a),a,b 排序
  1. ---oracle--- 默认按照明细 小计 合计顺序排序
  2. with t as
  3. (select 1 as F_A, 'a' as F_C, 'L1' F_D
  4.     from dual
  5.   union all
  6.   select 1 as F_A, 'a' as F_C, 'L2' F_D
  7.     from dual
  8.   union all
  9.   select 1 as F_A, 'b' as F_C, 'L1' F_D
  10.     from dual
  11.   union all
  12.   select 1 as F_A, 'b' as F_C, 'L2' F_D
  13.     from dual)
  14. select decode(grouping(F_C), 1, '合计', F_C),
  15.        decode(grouping(F_D) + grouping(F_C), 1, '小计', F_D), sum(F_A),
  16.        grouping(F_C), grouping(F_D), GROUP_ID()
  17.   from t
  18. group by rollup(F_C, F_D);
  19. ---dm--- 默认按照 明细,小计,合计 顺序排序
  20.   with t as
  21. (select 1 as F_A, 'a' as F_C, 'L1' F_D
  22.     from dual
  23.   union all
  24.   select 1 as F_A, 'a' as F_C, 'L2' F_D
  25.     from dual
  26.   union all
  27.   select 1 as F_A, 'b' as F_C, 'L1' F_D
  28.     from dual
  29.   union all
  30.   select 1 as F_A, 'b' as F_C, 'L2' F_D
  31.     from dual)
  32. select decode(grouping(F_C), 1, '合计', F_C),
  33.        decode(grouping(F_D) + grouping(F_C), 1, '小计', F_D), sum(F_A),
  34.        grouping(F_C), grouping(F_D)
  35.   from t
  36. group by rollup(F_C, F_D) order by grouping(F_C),F_C, F_D; --需要指定排序
复制代码

  • group by groupset 语法上不支持分组列通过子查询,转换后排序,可以嵌套一层解决
  1.   ---ORACLE---
  2.   with t as
  3.   (select 1 F_SHENID, '广东' F_SHENMC from dual),
  4.   d as
  5.   (select 1 F_SHENID, '深圳' F_CS, '宝安' F_JC, 100 F_RS
  6.       from dual
  7.     union all
  8.     select 1 F_SHENID, '广州' F_CS, '白云' F_JC, 150 F_RS
  9.       from dual)
  10.   select (select F_SHENMC from t where t.F_SHENID = d.F_SHENID) as F_SHENMC,
  11.         F_SHENID, F_CS, F_JC, sum(F_RS) F_RS
  12.     from d
  13.   group by GROUPING SETS((F_CS, F_JC),(F_SHENID, F_CS, F_JC))
  14.   order by F_SHENMC;  --DM这里报错 [-4080]:第14行附近出现错误:不是 GROUP BY 表达式
  15. ---DM8--- 公众号:小满小慢 小游戏: 地心侠士
  16. -- 要么不使用F_SHENMC排序,要么使用嵌套查询解决排序问题
  17. select * from (
  18. with t as
  19. (select 1 F_SHENID, '广东' F_SHENMC from dual),
  20. d as
  21. (select 1 F_SHENID, '深圳' F_CS, '宝安' F_JC, 100 F_RS
  22.     from dual
  23.   union all
  24.   select 1 F_SHENID, '广州' F_CS, '白云' F_JC, 150 F_RS
  25.     from dual)
  26. select (select F_SHENMC from t where t.F_SHENID = d.F_SHENID) as F_SHENMC,
  27.        F_SHENID, F_CS, F_JC, sum(F_RS) F_RS
  28.   from d
  29. group by GROUPING SETS((F_CS, F_JC),(F_SHENID, F_CS, F_JC)))
  30. order by F_SHENMC;
复制代码

  • ORACLE在PL/SQL中支持中文逗号,中文括号,达梦测试也是支持,遇到了最好还是调整下代码
  1. with t as (select 1 F_A,'a' F_B from dual)
  2. select * from t where t.F_B in ('a')
  3. ---动态sql-- 公众号:小满小慢 小游戏: 地心侠士
  4. DECLARE
  5. sqltxt VARCHAR2(200);
  6. cur    SYS_REFCURSOR;
  7. a      number;
  8. b      VARCHAR2(100);
  9. BEGIN
  10.   sqltxt := 'with t as (select 1 F_A,''a'' F_B from dual)
  11. select * from t where t.F_B in (''a'')';
  12.   OPEN cur FOR sqltxt;
  13.   LOOP
  14.     FETCH cur
  15.       INTO a, b;
  16.     EXIT WHEN cur%NOTFOUND;
  17.     DBMS_OUTPUT.PUT_LINE('F_A: ' || a || ', F_B: ' || b);
  18.   END LOOP;
  19.   CLOSE cur;
  20. END;
复制代码
6. 实用查询语句
  1. SELECT * FROM V$DM_INI; -- 查询配置信息
  2. SELECT * FROM V$VERSION; --查询数据库版本信息
  3. SELECT * FROM V$INSTANCE; --查询实列信息,数据库版本信息
  4. SELECT * FROM V$LICENSE; --查询LINCE,数据库到期日期
  5. SELECT * FROM V$SESSIONS; --查询会话信息
  6. select SF_GET_PARA_VALUE(2,'ENABLE_CS_CVT');--查询配置参数
  7. select * from V$RESERVED_WORDS t; --查询关键字
  8. --公众号:小满小慢 小游戏: 地心侠士
  9. --安装,卸载,检查,扩展包
  10. SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_XMLDOM');
  11. SP_CREATE_SYSTEM_PACKAGES (0,'DBMS_XMLDOM');
  12. SELECT SF_CHECK_SYSTEM_PACKAGE('DBMS_XMLDOM');
  13. --查询所有表信息
  14. select * from user_tables;
  15. select OWNER,TABLE_NAME,TABLESPACE_NAME,TEMPORARY,STATUS,PARTITIONED,DROPPED from all_tables;
  16. --查询所有列信息
  17. SELECT OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,NULLABLE FROM ALL_TAB_COLUMNS
  18. --查询所有函数,存储过程,程序包
  19. SELECT OWNER,OBJECT_NAME,PROCEDURE_NAME,OBJECT_TYPE,AGGREGATE,PIPELINED,PARALLEL FROM ALL_PROCEDURES
  20. --查询所有参数信息
  21. select OWNER,OBJECT_NAME,PACKAGE_NAME,ARGUMENT_NAME,POSITION,DATA_TYPE,DEFAULTED,DEFAULT_VALUE,IN_OUT,DATA_LENGTH from ALL_ARGUMENTS
  22. --查询所有对象(SCHOBJ,TABOBJ,UR,SCH,DSYNOM,PROFILE)
  23. select OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS from ALL_OBJECTS
  24. --查询函数,存储过程,类型,触发器代码
  25. select * from ALL_SOURCE
  26. --查询所有视图代码
  27. select OWNER,VIEW_NAME,TEXT from ALL_VIEWS
复制代码
7. JDBC数据连接配置

JDBC连接需要指定兼容模式为ORACLE
  1. URL:jdbc:dm://127.0.0.1:5236?compatibleMode=oracle
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册