信创-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 Boundary Condition XSYMM 对称边界条件,对称面为与坐标轴1垂直的平面,即U1=UR2=UR3=0; YSYMM 对称边界条件,对称面为与坐标轴2垂直的平面,即U2 ...

  2. 考勤运行提示‘Length of values (115) does not match length of index (116) >>> ’

    源码 df['餐补'] = money_list 解决思路: 1.分别打印输出两个字段长度 本来以为是每个月的文件格式不一致导致有的文件好用有的文件不好用 经过耐心查看代码 前面的算法统计有一个本应该 ...

  3. CCRC软件开发评审-材料应该怎么准备

    1. 什么是CCRC软件开发评审 软件安全开发资质认证是对软件开发方的基本资格.管理能力.技术能力和软件安全过程能力等方面进行评价全软件开发服务资质级别是衡量服务提供方的软件安全开发服务资格和能力的尺 ...

  4. python 如何生成exe程序

    cmd 安装包 pip install pyinstaller cd 进入程序文件夹内 3.输入命令pyinstaller -F xx.py 在dist文件夹下找到安装包即可

  5. 修改docker的默认存储位置及镜像存储位置

    前言 Docker 默认安装的情况下,会使用 /var/lib/docker/ 目录作为存储目录,用以存放拉取的镜像和创建的容器等. 不过由于此目录一般都位于系统盘,遇到系统盘比较小,而镜像和容器多了 ...

  6. 用状态模式开发一个基于WPF的截图功能

    状态模式 状态模式是设计模式中的一种行为设计模式,对很多人来说,这个模式平时可能用不到.但是如果你做游戏开发的话,我相信你应该对这个模式有一个很深刻的理解.状态模式在游戏中开发中还是比较常见的.状态模 ...

  7. 【离线地图】地图瓦片css复杂滤镜线段绘制

    需求: 目前已经对地图瓦片做了复杂滤镜的黑夜展示,现在又要在这个图片上绘制新的线段等内容,且不能被这个复杂滤镜影响,变成奇奇怪怪的颜色. 同时因为框架限制,只能在这个img上绘制 思考: 1.既然不想 ...

  8. 面试题-MySQL和Redis(更新版)

    前言 MySQL和Redis部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到 ...

  9. 【JVM之内存与垃圾回收篇】垃圾回收概述

    垃圾回收概述 概念 这次我们主要关注的是黄色部分,内存的分配与回收 垃圾收集 垃圾收集,不是 Java 语言的伴生产物.早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp 语言诞 ...

  10. 学习Django【1】模型

    编辑 models.py 文件,改变模型. 运行 python manage.py makemigrations 为模型的改变生成迁移文件. 运行 python manage.py migrate 来 ...