信创-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 }

如果初始配置错误可以使用以下命令删除实列,重新初始化

/dm/dmdbms/script/root/dm_service_uninstaller.sh -n DmAPService
rm -rf /dm/data/DAMENG/*

3. 必要兼容配置

设置全局兼容参数

-- 公众号:小满小慢 小游戏: 地心侠士
SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',2);
SP_SET_PARA_VALUE(2,'CALC_AS_DECIMAL',1);
SP_SET_PARA_VALUE(2,'ORDER_BY_NULLS_FLAG',1);
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',0);
SP_SET_PARA_VALUE(2,'ENABLE_CS_CVT',1);--启用编码转换,类型转换用cast
SP_SET_PARA_VALUE(2,'ENABLE_TABLE_EXP_REF_FLAG',1);
--查询单个配置参数使用 SF_GET_PARA_VALUE 函数
select SF_GET_PARA_VALUE(2,'COMPATIBLE_MODE');

安装扩展包

-- 公众号:小满小慢 小游戏: 地心侠士
SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_XMLDOM');
SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_XMLPARSER');
SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_XMLPARSER');
SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_JOB');
DMBS_JOB GRANT DBA TO 用户名; -- JOB必须要添加DBA权限

建立适配类型

CREATE OR REPLACE TYPE ODCIVARCHAR2LIST AS VARRAY(32767) OF VARCHAR2(4000);
--公众号:小满小慢 小游戏: 地心侠士

建立适配视图

建立适配同义词

CREATE OR REPLACE SYNONYM COLS FOR USER_TAB_COLS;
CREATE OR REPLACE SYNONYM "XMLDOM" FOR "SYS"."DBMS_XMLDOM";
CREATE OR REPLACE SYNONYM "XMLPARSER" FOR "SYS"."DBMS_XMLPARSER";
-- 公众号:小满小慢 小游戏: 地心侠士

建立适配函数

-- 解决达梦没有nls_charset_id而Oralce有,达梦默认不使用这个参数,返回null即可
CREATE OR REPLACE OR REPLACE FUNCTION NLS_CHARSET_ID(NAME IN VARCHAR2) RETURN INTEGER AS
BEGIN
-- 公众号:小满小慢 小游戏: 地心侠士
RETURN NULL;
END;

关键字冲突处理

LOGIN,EXEC,XML,VIRTUAL

重启服务

dm/dmdbms/bin/DmAPService restart

4. 迁移必须步骤

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

  1. 迁移表结构
  2. 迁移表数据
  3. 迁移触发器外的所有脚本
  4. 迁移触发器
  5. 迁移完成后,确保启用所有触发器

5.特殊语法处理

  • 迁移过程中SYS_CURSOR有几率被转换成SYS CURSOR,需要修改为SYS_CURSOR 重新执行.
  • 不支持数据隐式转换,需要调用CAST(value AS 类型说明)转换类型(后测试支持)
  • 参数默认值不支持V_PARAM in Integer :=2 的写法,需要调整成 V_PARAM in intger default 2
--- ORACLE----
CREATE Function format(v_Dec Integer := 2) Return Varchar2;
--- DM8----公众号:小满小慢 小游戏: 地心侠士
CREATE Function format(v_Dec intger default 2) Return Varchar2;
  • 不支持在SYS模式下建立类型,SYS.ODCIVARCHAR2LIST 需要去掉 SYS 模式
---ORACLE--
SELECT * FROM TABLE(SYS.ODCIVARCHAR2LIST(1,2,3,4,5))
---DM8--公众号:小满小慢 小游戏: 地心侠士
SELECT * FROM TABLE(ODCIVARCHAR2LIST(1,2,3,4,5))
  • 不支持实用xmltype直接序列化游标 xmltype(sys_refcursor)需要做如下代码调整
declare
CTX DBMS_XMLGEN.CTXHANDLE;
x xmltype;
str varchar2(2000);
sysCursor sys_refcursor;
begin
open sysCursor for select 1 F_A from dual;
-----Oracl语句------
x := xmltype(sysCursor);
str := x.extract('/*/ROW').getClobVal(0, 0);
-- 公众号:小满小慢 小游戏: 地心侠士
-----DM8语句-----
CTX := DBMS_XMLGEN.NEWCONTEXT(sysCursor); -- 转换游标
str := EXTRACT(DBMS_XMLGEN.GETXML(CTX), '/*/ROW'); -- 查询xml
DBMS_XMLGEN.CLOSECONTEXT(CTX); -- 关闭hander
end;
  • XMLForest生成xml时,如果嵌套XMLELEMENT使用内容做了xml转义,需要使用xmltype包装
---ORACLE---
WITH T AS (SELECT 1 F_A, 2 F_B FROM DUAL)
SELECT XMLELEMENT("ROW_DATA", XMLFOREST(F_A, F_B)).GETCLOBVAL() AS ABC
FROM T;
---DM8--- 公众号:小满小慢 小游戏: 地心侠士
WITH T AS
(SELECT 1 F_A, 2 F_B FROM DUAL)
SELECT XMLELEMENT("ROW_DATA", XMLTYPE(XMLFOREST(F_A, F_B))).GETCLOBVAL() AS ABC
FROM T;
  • 不支持XMLTYPE.gettCLOBVAL的静态方法,必须先有xmltype
----Oracle---
with t as (select 1 F_A, 2 F_B from dual)
SELECT Xmltype.getClobVal(xmlelement("A", F_A)) AS ABC FROM t;
----DM8--- 公众号:小满小慢 小游戏: 地心侠士
with t as (select 1 F_A, 2 F_B from dual)
SELECT xmlelement("a",F_A).getClobVal() AS ABC FROM t;
  • XMLTALBE 解析XML不支持默认列列类型
----Oracle---
select x.*
from xmltable('/rows/row' passing
xmltype('<rows><row><name>test</name></row></rows>')
columns xml_NAME path 'name') x
--DM8---
select x.*
from xmltable('/rows/row' passing
xmltype('<rows><row><name>test</name></row></rows>')
columns xml_NAME varchar2(100) path 'name') x
  • UTL_HTTP.WRITE_RAW 不支持Blob参数
---Oracle---
PROCEDURE write_raw(r IN OUT NOCOPY req,data IN RAW);
---DM8--- 公众号:小满小慢 小游戏: 地心侠士
PROCEDURE WRITE_RAW(r IN OUT NOCOPY REQ,data IN VARBINARY);
--达梦实现Blob转varbinary(不能直接使用cast转换)
DECLARE
l_blob_data BLOB;
bin varbinary ;
BEGIN
l_blob_data := HEXTORAW('0123456789ABCDEF');
Dbms_lob.READ(l_blob_data,cast(dbms_lob.GETLENGTH(l_blob_data) as INTEGER),1,bin);
dbms_output.put_line(bin);
END;
  • Group by rollup 数据没有按照明细小计汇总的方式排序,需要显示指定排序,可以直接使用 rollup(a,b) order by grouping(a),a,b 排序
---oracle--- 默认按照明细 小计 合计顺序排序
with t as
(select 1 as F_A, 'a' as F_C, 'L1' F_D
from dual
union all
select 1 as F_A, 'a' as F_C, 'L2' F_D
from dual
union all
select 1 as F_A, 'b' as F_C, 'L1' F_D
from dual
union all
select 1 as F_A, 'b' as F_C, 'L2' F_D
from dual)
select decode(grouping(F_C), 1, '合计', F_C),
decode(grouping(F_D) + grouping(F_C), 1, '小计', F_D), sum(F_A),
grouping(F_C), grouping(F_D), GROUP_ID()
from t
group by rollup(F_C, F_D);
---dm--- 默认按照 明细,小计,合计 顺序排序
with t as
(select 1 as F_A, 'a' as F_C, 'L1' F_D
from dual
union all
select 1 as F_A, 'a' as F_C, 'L2' F_D
from dual
union all
select 1 as F_A, 'b' as F_C, 'L1' F_D
from dual
union all
select 1 as F_A, 'b' as F_C, 'L2' F_D
from dual)
select decode(grouping(F_C), 1, '合计', F_C),
decode(grouping(F_D) + grouping(F_C), 1, '小计', F_D), sum(F_A),
grouping(F_C), grouping(F_D)
from t
group by rollup(F_C, F_D) order by grouping(F_C),F_C, F_D; --需要指定排序
  • group by groupset 语法上不支持分组列通过子查询,转换后排序,可以嵌套一层解决
  ---ORACLE---
with t as
(select 1 F_SHENID, '广东' F_SHENMC from dual),
d as
(select 1 F_SHENID, '深圳' F_CS, '宝安' F_JC, 100 F_RS
from dual
union all
select 1 F_SHENID, '广州' F_CS, '白云' F_JC, 150 F_RS
from dual)
select (select F_SHENMC from t where t.F_SHENID = d.F_SHENID) as F_SHENMC,
F_SHENID, F_CS, F_JC, sum(F_RS) F_RS
from d
group by GROUPING SETS((F_CS, F_JC),(F_SHENID, F_CS, F_JC))
order by F_SHENMC; --DM这里报错 [-4080]:第14行附近出现错误:不是 GROUP BY 表达式
---DM8--- 公众号:小满小慢 小游戏: 地心侠士
-- 要么不使用F_SHENMC排序,要么使用嵌套查询解决排序问题
select * from (
with t as
(select 1 F_SHENID, '广东' F_SHENMC from dual),
d as
(select 1 F_SHENID, '深圳' F_CS, '宝安' F_JC, 100 F_RS
from dual
union all
select 1 F_SHENID, '广州' F_CS, '白云' F_JC, 150 F_RS
from dual)
select (select F_SHENMC from t where t.F_SHENID = d.F_SHENID) as F_SHENMC,
F_SHENID, F_CS, F_JC, sum(F_RS) F_RS
from d
group by GROUPING SETS((F_CS, F_JC),(F_SHENID, F_CS, F_JC)))
order by F_SHENMC;
  • ORACLE在PL/SQL中支持中文逗号,中文括号,达梦测试也是支持,遇到了最好还是调整下代码
with t as (select 1 F_A,'a' F_B from dual)
select * from t where t.F_B in ('a')
---动态sql-- 公众号:小满小慢 小游戏: 地心侠士
DECLARE
sqltxt VARCHAR2(200);
cur SYS_REFCURSOR;
a number;
b VARCHAR2(100);
BEGIN
sqltxt := 'with t as (select 1 F_A,''a'' F_B from dual)
select * from t where t.F_B in (''a'')';
OPEN cur FOR sqltxt;
LOOP
FETCH cur
INTO a, b;
EXIT WHEN cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('F_A: ' || a || ', F_B: ' || b);
END LOOP;
CLOSE cur;
END;

6. 实用查询语句

SELECT * FROM V$DM_INI; -- 查询配置信息
SELECT * FROM V$VERSION; --查询数据库版本信息
SELECT * FROM V$INSTANCE; --查询实列信息,数据库版本信息
SELECT * FROM V$LICENSE; --查询LINCE,数据库到期日期
SELECT * FROM V$SESSIONS; --查询会话信息
select SF_GET_PARA_VALUE(2,'ENABLE_CS_CVT');--查询配置参数
select * from V$RESERVED_WORDS t; --查询关键字
--公众号:小满小慢 小游戏: 地心侠士
--安装,卸载,检查,扩展包
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_XMLDOM');
SP_CREATE_SYSTEM_PACKAGES (0,'DBMS_XMLDOM');
SELECT SF_CHECK_SYSTEM_PACKAGE('DBMS_XMLDOM'); --查询所有表信息
select * from user_tables;
select OWNER,TABLE_NAME,TABLESPACE_NAME,TEMPORARY,STATUS,PARTITIONED,DROPPED from all_tables; --查询所有列信息
SELECT OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,NULLABLE FROM ALL_TAB_COLUMNS --查询所有函数,存储过程,程序包
SELECT OWNER,OBJECT_NAME,PROCEDURE_NAME,OBJECT_TYPE,AGGREGATE,PIPELINED,PARALLEL FROM ALL_PROCEDURES --查询所有参数信息
select OWNER,OBJECT_NAME,PACKAGE_NAME,ARGUMENT_NAME,POSITION,DATA_TYPE,DEFAULTED,DEFAULT_VALUE,IN_OUT,DATA_LENGTH from ALL_ARGUMENTS --查询所有对象(SCHOBJ,TABOBJ,UR,SCH,DSYNOM,PROFILE)
select OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS from ALL_OBJECTS --查询函数,存储过程,类型,触发器代码
select * from ALL_SOURCE --查询所有视图代码
select OWNER,VIEW_NAME,TEXT from ALL_VIEWS

7. JDBC数据连接配置

JDBC连接需要指定兼容模式为ORACLE

URL:jdbc:dm://127.0.0.1:5236?compatibleMode=oracle

信创-ORACLE迁移到DM8的更多相关文章

  1. .NET 在信创常用软件适配清单之中?

    2020年8月份写了一篇文章<.NET Core也是国产化信息系统开发的重要选项>, 这又过去了大半年了,在信创领域发生了很大的变化,今天写这篇文章主要是想从信创常用软件适配清单 看一看. ...

  2. 信创国产化,试试 Solon v2.2.2

    Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它不是 Spring.没有用 Servlet.也无关 JavaEE,是一个有自己接口标准的开放生态.可以为应用软件国产化提供支持, ...

  3. Solon v2.2.6 发布,助力信创国产化

    Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它是一个有自己接口标准规范的开放生态,可为应用软件国产化提供支持,助力信创建设. 150来个生态插件,覆盖各种不同的应用开发场景: ...

  4. Solon v2.2.10 发布,助力信创国产化

    Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它不是 Spring.没有使用 Servlet.JavaEE 接口,是一个有自己接口标准的开放生态.可以为应用软件国产化提供支持, ...

  5. iPhone 6 被盗记录二【写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈】

    投诉公司: 北京直信创邺数码科技有限公司  标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔 ...

  6. oracle迁移postgres之-Ora2Pg

    描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成S ...

  7. oracle迁移postgres之-oracle_fdw

    1. 安装oracle_fdw 在编译安装前,需要设置postgres的环境变量,如在.bash_profile中增加: export ORACLE_HOME=/u01/app/oracle expo ...

  8. 适用MySQL Migration Toolkit 1.0 将oracle迁移到mysql中遇到的问题

    这里主要说一下我在适用中碰到的问题,主要过程参考 http://www.cnblogs.com/duwenlei/p/3520759.html. 首先启动MySQLMigrationTool.exe ...

  9. 使用Microsoft SQL Server Migration Assistant for Oracle迁移数据库

    前言:使用Microsoft SQL Server Migration Assistant for Oracle迁移Oracle数据库到SqlServer数据库. 准备:Oracle11g.SqlSe ...

  10. 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

    有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle. 很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面. ...

随机推荐

  1. Abaqus压电材料分析

    目录 1. ABAQUS压电材料定义[快速版] 2. 压电材料的主要特性参数 3. Abaqus 压电分析 1 电响应 2 initial condition & BCs 4 Load 5 M ...

  2. 【ABAQUS 二次开发笔记】输出单元刚度矩阵

    目录 相关的关键字 必须的参数 可选参数 使用关键字 输出到mtx文件 输出到dat文件 参考资料 相关的关键字 *ELEMENT MATRIX OUTPUT 此keyword用于将元素刚度矩阵和质量 ...

  3. npm 如何更新项目最新依赖包

    NPM 是什么? Node 软件包管理器(NPM)提供了各种功能来帮助你安装和维护项目的依赖关系. 由于错误修复.新功能和其他更新,依赖关系可能会随着时间的推移而变得过时.你的项目依赖越多,就越难跟上 ...

  4. OpenGL ES与GLSL ES各版本对应说明

    OpenGL ES 3.2 OpenGL ES 3.2 and OpenGL ES Shading Language 3.20 OpenGL ES 3.1 OpenGL ES 3.1 and Open ...

  5. 这是base-还原数字查正确码表再解码

    题目: dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 1 ...

  6. 使用自制离线数据跑通ElasticFusion

    使用自制离线数据跑通ElasticFusion 实验环境及设备 实验环境: Ubuntu22.04 RTX3060 实验设备: 小米13(Android) Realsense D455 一句话总结就是 ...

  7. 【电脑】重装Win10之后无法唤醒和正常关机(Y9000P 2022)

    问题: Y9000P 2022 改Windows10后经常关机关不全(自带键盘灯亮,电源指示灯不灭),这还不是最重要的,它一会儿不用到时间自动休眠后还经常唤醒不了 解决: 两个问题,总结一下: 一.关 ...

  8. ORA-28001:口令已经失效

    Oracle用户口令默认的有效期导致的一个异常,留爪. Oralce11G下,创建的用户及口令,也就是用户密码默认会有个180天的过期时间, 如果超过180天用户口令未做修改,则该用户口令失效,也就是 ...

  9. 学习Kotlin语法(三)

    简介 在上一节,我们对Kotlin中面向对象编程(OOP)的相关知识有了大致的了解,本章节我们将去进一步了解函数.lambada表达式.内联函数.操作符重载.作用域函数. 目录 函数 函数的使用 参数 ...

  10. [T.2] 团队项目:选题和需求分析

    项目 内容 这个作业属于哪个课程 2025年春季软件工程(罗杰.任健) 这个作业的要求在哪里 T.2团队项目:选题和需求分析 团队在这个课程的目标是 学习软件工程相关知识,培养编程和团队协作能力,做出 ...