达梦8数据库适配ORACLE的8个参数

目录

1、概述

1.1 概述

1.2 实验环境

2、参数简介

3、实验部分

3.1 参数BLANK_PAD_MODE

3.2 参数COMPATIBLE_MODE

3.3 参数ORDER_BY_NULLS_FLAG

3.4 参数DATETIME_FMT_MODE

3.5 参数PL_SQLCODE_COMPATIBLE

3.6 参数CALC_AS_DECIMAL

3.7 参数ENABLE_PL_SYNONYM

3.8 参数VIEW_ACCESS_MODE


1、概述

1.1 概述

        本文整理了达梦8数据库适配ORACLE的8个参数,设计了3个实验场景,通过实验观察各参数在数据库中的作用。

1.2 实验环境

达梦数据库版本:DM Database 64 V8 03134284094-20231108-207962-20067

ORACLE版本:V19.3

2、参数简介

参数含义缺省值属性适配ORACLE值
BLANK_PAD_MODE设置字符串比较时,结尾空格填充模式是否兼容 ORACLE。取值 0 或 1。0不兼容,1 兼容。0不可修改1
COMPATIBLE_MODE是否兼容其他数据库模式。0:不兼容,1:兼容 SQL92 标准,2:部分兼容 ORACLE,3:部分兼容 MS SQL SERVER,4:部分兼容 MYSQL,5:兼容 DM6,6:部分兼容 TERADATA,7:部分兼容 POSTGRES0静态2
ORDER_BY_NULLS_FLAG控制排序时 NULL 值返回的位置,取值 0、1、2、3。0 表示 NULL 值始终在最前面返回;1 表示 ASC 升序排序时NULL 值在最后返回,DESC 降序排序时 NULL 值在最前面返回,在参数等于 1 的情况下,NULL 值的返回与 ORACLE保持一致;2 表示 ASC 升序排序时 NULL 值在最前面返回,DESC 降序排序时 NULL 值在最后返回,在参数等于2 的情况下,NULL 值的返回与 MYSQL 保持一致;3 表示在取值为 1 的基础上,将空串置于 NULL 值和非空值之间0动态,会话级1
DATETIME_FMT_MODE是否兼容 ORACLE 的五种日期时间类型的默认日期时间格式。0:不兼容;1:兼容 注:此参数被动态修改后仅影响新生成的会话0动态,系统级1
PL_SQLCODE_COMPATIBLE默认值为 0;如果设置为 1,则 PL 的异常处理中,SQLCODE 的错误码值需要尽量与 ORACLE 一致0静态1
CALC_AS_DECIMAL0:默认值,表示整数类型的除法、整数与字符或 BINARY 串的所有四则运算,结果都处理成整数;
1:表示将整数类型的除法、整数与字符或 BINARY 串的除法转换为 DECIMAL 处理;
2:表示将整数类型的除法、整数与字符或 BINARY 串的所有四则运算都转换为 DECIMAL 处理;
3:所有涉及整型的四则运算全部转换为 DECIMAL 处理。
注: 该 参 数 只有 在 USE_PLN_POOL 为 0 或 1 时有 效。 当 USE_PLN_POOL 为 2 或 3 时, 按 照CALC_AS_DECIMAL=2 处理
0静态1
ENABLE_PL_SYNONYM是否可以通过同义词执行非系统用户创建的包或者存储过程。1是,0否。若设置为0,在解析过程/包名时,如果借助了同义词,则这些对象要么是系统内部创建的,或者其创建者必须为系统用户,否则一律报错0动态,系统级1
VIEW_ACCESS_MODE指定视图的自主访问控制机制。0:兼容 DM;1:兼容 ORACLE0静态1

3、实验部分

3.1 参数BLANK_PAD_MODE

从oracle迁移数据到达梦数据库中,有时会遇到主键或唯一约束创建失败的情况,这有可能跟BLANK_PAD_MODE的设置有关,通常将BLANK_PAD_MODE设置为1可以解决问题。

测试方案说明:在表中插入3条数据,数据分别是字符串a、a加1个空格、a加两个空格。在ORACLE中这样的3条数据不被视为重复数据。在达梦8中,默认情况下视为重复数据,创建主键会报错。

1)在DM8中测试BLANK_PAD_MODE=0

准备测试数据

create table tb_dm8_001
(
C1 varchar2(10) not null
);

--第1条数据是:'a'
insert into tb_dm8_001 values('a');
commit;

--第2条数据是:'a'+1个空格
insert into tb_dm8_001 values('a ');
commit;

--第3条数据是:'a'+2个空格
insert into tb_dm8_001 values('a  ');
commit;

测试是否能成功创建主键

ALTER table tb_dm8_001 ADD PRIMARY KEY(c1);

测试结果:BLANK_PAD_MODE=0时,用案例数据创建主键失败。 

2)在DM8中测试BLANK_PAD_MODE=1

BLANK_PAD_MODE是初始化参数,不能修改,我们创建个新库做下面的测试。

dminit path=/dm8/datadm db_name=dbtest01 BLANK_PAD_MODE=1

启动新库

dmserver path=/dm8/datadm/dbtest01/dm.ini

准备测试数据

disql SYSDBA/SYSDBA
create table tb_dm8_002
(
C1 varchar2(10) not null
);
--第1条数据是:'a'
insert into tb_dm8_002 values('a');
commit;

--第2条数据是:'a'+1个空格
insert into tb_dm8_002 values('a ');
commit;

--第3条数据是:'a'+2个空格
insert into tb_dm8_002 values('a  ');
commit;

测试是否能成功创建主键

ALTER table tb_dm8_002 ADD PRIMARY KEY(c1);

测试结果:BLANK_PAD_MODE=1时,用案例数据创建主键成功。

3)ORACLE中的相关测试

准备测试数据

create table tb_oracle_001
(
C1 varchar2(10) not null
);

--第1条数据是:'a'
insert into tb_oracle_001 values('a');
commit;

--第2条数据是:'a'+1个空格
insert into tb_oracle_001 values('a ');
commit;

--第3条数据是:'a'+2个空格
insert into tb_oracle_001 values('a  ');
commit;

测试是否能成功创建主键

ALTER table tb_oracle_001 ADD PRIMARY KEY(c1);

测试结果:ORACLE中用案例数据创建主键成功。

3.2 参数COMPATIBLE_MODE

静态参数,修改后要重启数据库。

是否兼容其他数据库模式。0:不兼容,1:兼容 SQL92 标准,2:部分兼容 ORACLE,3:部分兼容 MS SQL SERVER,4:部分兼容 MYSQL,5:兼容 DM6,6:部分兼容 TERADATA,7:部分兼容 POSTGRES

这个参数是达梦数据库中最重要的兼容性参数,涉及内容较多,实验略。

3.3 参数ORDER_BY_NULLS_FLAG

动态,会话级参数:

控制排序时 NULL 值返回的位置,取值 0、1、2、3。

0 表示 NULL 值始终在最前面返回;

1 表示 ASC 升序排序时NULL 值在最后返回,DESC 降序排序时 NULL 值在最前面返回,在参数等于 1 的情况下,NULL 值的返回与 ORACLE保持一致;

1)在DM8中测试ORDER_BY_NULLS_FLAG=0

准备测试数据

create table tb_dm8_order_null_0
(
id int,
C1 varchar2(10) 
);
insert into tb_dm8_order_null_0 values(1,'a');
insert into tb_dm8_order_null_0 values(2,'b');
insert into tb_dm8_order_null_0 values(3,'c');
insert into tb_dm8_order_null_0 values(4,null);
commit;

测试

select * from tb_dm8_order_null_0 order by c1 asc;
select * from tb_dm8_order_null_0 order by c1 desc;

测试结果:ORDER_BY_NULLS_FLAG=0时,NULL 值始终在最前面返回。

2)在DM8中测试ORDER_BY_NULLS_FLAG=1

动态参数,设置后立即生效

sp_set_para_value(1,'ORDER_BY_NULLS_FLAG',1);

准备测试数据

create table tb_dm8_order_null_1
(
id int,
C1 varchar2(10) 
);
insert into tb_dm8_order_null_1 values(1,'a');
insert into tb_dm8_order_null_1 values(2,'b');
insert into tb_dm8_order_null_1 values(3,'c');
insert into tb_dm8_order_null_1 values(4,null);
commit;

测试

select * from tb_dm8_order_null_1 order by c1 asc;
select * from tb_dm8_order_null_1 order by c1 desc;

测试结果:ORDER_BY_NULLS_FLAG=1时,ASC 升序排序时NULL 值在最后返回,DESC 降序排序时 NULL 值在最前面返回。

3)在ORACLE中的相关测试

准备测试数据

create table tb_oracle_order_null
(
id int,
C1 varchar2(10) 
);
insert into tb_oracle_order_null values(1,'a');
insert into tb_oracle_order_null values(2,'b');
insert into tb_oracle_order_null values(3,'c');
insert into tb_oracle_order_null values(4,null);
commit;

测试

select * from tb_oracle_order_null order by c1 asc;
select * from tb_oracle_order_null order by c1 desc;

测试结果:在ORACLE中, ASC升序排序时NULL 值在最后返回,DESC 降序排序时 NULL 值在最前面返回

3.4 参数DATETIME_FMT_MODE

动态系统级参数,是否兼容 ORACLE 的五种日期时间类型的默认日期时间格式。0:不兼容;1:兼容。 注:此参数被动态修改后仅影响新生成的会话

1)在DM8中测试DATETIME_FMT_MODE=0

日期格式为:YYYY-MM-DD

2)在DM8中测试DATETIME_FMT_MODE=1

动态系统级参数,不需要重启数据库

sp_set_para_value(1,'DATETIME_FMT_MODE',1);

进入新会话测试

日期部分格式为:DD-MM月-YY

3)在ORACLE中的相关测试

在ORACLE中测试

日期格式为:DD-MM月-YY

3.5 参数PL_SQLCODE_COMPATIBLE

静态参数,默认值为 0;如果设置为 1,则 PL 的异常处理中,SQLCODE 的错误码值需要尽量与 ORACLE 一致。

1)在DM8中测试PL_SQLCODE_COMPATIBLE=0

制造异常1,让系统抛出异常

begin
  select 2/0 from dual;
end;
/

除0错误代码是-6103

制造异常2,做异常处理,查看SQLCODE的代码值

BEGIN
  select 2/0 from dual;
EXCEPTION
WHEN OTHERS THEN 
	SELECT  SQLCODE ||' '|| SQLERRM;
END;
/

除0错误代码还是-6103

2)在DM8中测试PL_SQLCODE_COMPATIBLE=1

静态参数,需要重启数据库

sp_set_para_value(2,'PL_SQLCODE_COMPATIBLE',1); -- 重启服务后生效

制造异常1,让系统抛出异常

BEGIN
  select 2/0 from dual;
END;
/

虽然配置了兼容性参数PL_SQLCODE_COMPATIBLE=1,但是在系统抛出异常的场景中,除0错误码依然是-6103

制造异常2,做异常处理,查看SQLCODE的代码值

BEGIN
  select 2/0 from dual;
EXCEPTION
WHEN OTHERS THEN 
	SELECT  SQLCODE ||' '|| SQLERRM;
END;
/

测试结果:PL_SQLCODE_COMPATIBLE=1时,错误码发生了变化,现在是-1476

小结,通过上面的测试我们看到:

(1)系统抛出的异常代码不会去兼容ORACLE

(2)异常处理代码中的SQLCODE,可以配置成兼容ORACLE

3)在ORACLE中的相关测试

执行测试代码

declare
 var_1 number(10,2);
begin
  select 2/0 into var_1 from dual;
end;
/

Oracle除数为0的代码是1476

3.6 参数CALC_AS_DECIMAL

静态参数。

0:默认值,表示整数类型的除法、整数与字符或 BINARY 串的所有四则运算,结果都处理成整数;

1:表示将整数类型的除法、整数与字符或 BINARY 串的除法转换为 DECIMAL 处理;

2:表示将整数类型的除法、整数与字符或 BINARY 串的所有四则运算都转换为 DECIMAL 处理;

3:所有涉及整型的四则运算全部转换为 DECIMAL 处理。

注: 该 参 数 只有 在 USE_PLN_POOL 为 0 或 1 时有 效。 当 USE_PLN_POOL 为 2 或 3 时, 按 照CALC_AS_DECIMAL=2 处理

1)在DM8中测试CALC_AS_DECIMAL=0

执行测试代码

select 2/3 ;
select 5/4;
select 2.0/3;

小结:

1)这个参数适用于除数和被除数都是整数,具体可以观察实验中2/3与2.0/3的区别。

2)我们看到2/3的结果是0,而不是1,说明系统采用的是“舍位进位”而不是“四舍五入进位”。

2)在DM8中测试CALC_AS_DECIMAL=1

静态参数,配置后需要重启数据库生效

sp_set_para_value(2,'CALC_AS_DECIMAL',1);

执行测试代码

select 2/3 ;
select 5/4;
select 2.0/3;

测试结果:除法的结果有小数部分了。

3)在ORACLE中的相关测试

执行测试代码

select 2/3 from dual;
select 5/4 from dual;
select 2.0/3 from dual;

小结:通过实验我们发现,配置CALC_AS_DECIMAL=1后,达梦和ORACLE的小数位精度还是有一定差异的。

3.7 参数ENABLE_PL_SYNONYM

动态,系统级。是否可以通过同义词执行非系统用户创建的包或者存储过程。1是,0否。若设置为0,在解析过程/包名时,如果借助了同义词,则这些对象要么是系统内部创建的,或者其创建者必须为系统用户,否则一律报错

1)在DM8中测试ENABLE_PL_SYNONYM=0

创建非系统用户

create user user01 identified by "usr01";
grant "PUBLIC","RESOURCE","SOI","VTI" to user01;

用新用户登录

disql user01/user01

创建存储过程

CREATE OR REPLACE PROCEDURE "USER01"."P_TEST01" ()
AS
	VARNAME INT;
BEGIN
	SELECT 1 INTO VARNAME;
END;

创建同义词

CREATE SYNONYM "USER01"."P_T01" FOR "USER01"."P_TEST01";

执行存储过程

CALL USER01.P_TEST01();

用同义词执行存储过程

CALL USER01.P_T01();

我们看到,ENABLE_PL_SYNONYM=0时,用同义词执行存储过程失败。

2)在DM8中测试ENABLE_PL_SYNONYM=1

动态参数,不需要重启

sp_set_para_value(1,'ENABLE_PL_SYNONYM',1);

调整完参数,再次测试用同义词执行非系统用户创建的存储过程

CALL USER01.P_T01();

测试结果:ENABLE_PL_SYNONYM=1时,用同义词执行存储过程成功。

3)在ORACLE中的相关测试

在ORACLE中测试,准备:

create user c##USER01 identified by "usr01";
grant PUBLIC,RESOURCE to c##USER01;

CREATE OR REPLACE PROCEDURE c##user01.P_ORACLE_TEST01
AS
  VARNAME INT;
BEGIN
  SELECT 1 INTO VARNAME FROM DUAL;
END;

CREATE SYNONYM c##USER01.P_S01 FOR c##USER01.P_ORACLE_TEST01;

用同义词执行存储过程

CALL c##USER01.P_S01();

测试结果:ORACLE中默认可以用同义词执行存储过程。

3.8 参数VIEW_ACCESS_MODE

静态参数。

指定视图的自主访问控制机制。0:兼容 DM;1:兼容 ORACLE

实验部分待补充。(博主没有用过这个参数,有了解这个参数使用场景的欢迎在评论区留言)

本文结束!

参考文档:《DM8系统管理员手册》

2024年11月9日

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914916.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何低成本、零代码开发、5分钟内打造一个企业AI智能客服?

传统客服因员工效率低、时段需求波动大、数据管理费时费力等管理难题,导致难以满足用户需求,无法深入挖掘客服数据价值,造成客源流失。而智能体搭建的“智能客服”能借助大模型和知识库知识,助力实现数字化运营,破解企…

CC1链学习记录

🌸 前言 上篇文章学习记录了URLDNS链,接下来学习一下Common-Colections利用链。 🌸 相关介绍 Common-Colections是Apache软件基金会的项目,对Java标准的Collections API提供了很好的补充,在其基础上对常用的数据结构…

【启明智显分享】5G CPE为什么适合应用在连锁店中?

连锁门店需要5G CPE来满足其日益增长的网络需求,提升整体运营效率和竞争力。那么为什么5G CPE适合连锁店应用呢,小编为此做了整理,主要是基于以下几个方面的原因: 一、高效稳定的网络连接 1、高速数据传输: 5G CPE能…

怎么禁止文件外发?企业如何禁止文件外发,教你6种方法,综合运用效果加倍

在当今数字化的商业环境中,企业内部文件承载着大量关键信息,犹如企业的命脉。这些文件可能包含着核心技术机密、客户资料、未公开的战略规划以及敏感的财务数据等,它们是企业在激烈市场竞争中立足的重要资产。然而,随着信息传播途…

FPGA学习笔记#8 Vitis HLS优化总结和案例程序的优化

本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 学习笔记:《FPGA学习笔记》索引 FPGA学习笔记#1 HLS简介及…

替代CX8835车充5V/3.4A恒流恒压降压转换器内置MOS

概述:PIN对PIN替代CX8835 PC3313是宽输入电压,高效率有源CC降压DC/DC转换器,可以在CV(恒压)或CC模式下运行(恒流)输出模式。PC3313在5V输出时提供高达典型3.4A的电流限制带有18mΩ电流感测电阻…

2024年8个最佳在线websocket调试工具选择

精选了 8 款功能强大且易于使用的 WebSocket 测试工具: 工具名称支持的系统是否免费ApifoxWindows, Mac, Linux是WebSocket KingWindows, Mac, Linux是PostmanWindows, Mac, Linux是Socket.IO Test ClientWindows, Mac, Linux是InsomniaWindows, Mac, Linux是Wires…

ML 系列:第 21 节 — 离散概率分布(二项分布)

一、说明 二项分布描述了在固定数量的独立伯努利试验中一定数量的成功的概率,其中每个试验只有两种可能的结果(通常标记为成功和失败)。 二、探讨伯努利模型 例如,假设您正在抛一枚公平的硬币 (其中正面成功&#xff…

2024开发者浏览器必备扩展,不允许还有人不知道~

在开发过程中,优秀的扩展工具能够极大提升我们的工作效率,简化工作流程,并使得在浏览器中的开发和调试变得更加便捷。 根据市场占比,Chrome、Safari、Edge、Firefox、Opera 是前五大浏览器,其中Chrome浏览器占据了领先…

安装paddle

网址:飞桨PaddlePaddle-源于产业实践的开源深度学习平台 或者找对应python和cuda版本的paddle下载后安装: https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html 你想要安装paddlepaddle - gpu2.6.1.post112版本。在你提供的文件列表中&am…

(六)Spark大数据开发实战:豆瓣电影数据处理与分析(scala版)

目录 一、Spark 二、数据介绍 三、Spark大数据开发实战(Scala) 1、数据文件上传HDFS 2、导入模块及数据 3、数据统计与分析 ①、计算演员参演电影数 ②、依次罗列电影番位前十的演员 ③、按照番位计算演员参演电影数 ④、求每位演员所有参演电影中的最早、最晚上映…

‘nodemon‘ 不是内部或外部命令,也不是可运行的程序

解决方法:使用 npx 临时运行 nodemon 如果你不想全局安装 nodemon,你可以使用 npx(npm 5.2 及以上版本自带)来临时运行 nodemon: npx nodemon server.jsnodemon正常配置 要在开发过程中实现每次修改 Node.js 代码后…

Docker 的安装与使用

Docker 的安装 Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。 Docker CE 的安装请参考官方文档&#xf…

单相锁相环,原理与Matlab实现

单相锁相环基本原理 单相锁相环的基本原理图如下所示, u α u_\alpha uα​ u β u_\beta uβ​经Park变换、PI控制实现对角频率 ω \omega ω和角度 θ \theta θ的估算。不同锁相环方案之间的差异,主要表现在正交电压 u β u_\beta uβ​的生成&#x…

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本: 安装 使用方法 使用文件 URL: 使用本地路径&…

Redis集群模式之Redis Sentinel vs. Redis Cluster

在分布式系统环境中,Redis以其高性能、低延迟和丰富的数据结构而广受青睐。随着数据量的增长和访问需求的增加,单一Redis实例往往难以满足高可用性和扩展性的要求。为此,Redis提供了两种主要的集群模式:Redis Sentinel和Redis Clu…

OPENCV手把手入门 多图![more cpp--9]

你说安装?楼主使用的是VCPKG,也是遇到不少问题,不过最后还是解决了。大家有需要我抽时间写一篇如何使用VCPKG和VS安装OPENCV出来 最近楼主在做视觉识别方面的工作,这个就当笔记了吧(一年前做过这方面的工作&#xff0c…

AI写作(二)NLP:开启自然语言处理的奇妙之旅(2/10)

一、NLP 的基本概念与任务 (一)自然语言处理的研究对象 自然语言处理(NLP)处于计算机科学、人工智能和语言学的交叉领域。它所聚焦的人类社会语言信息是无比丰富和复杂的,包括口语、书面语等各种形式。这种语言信息在…

pgsql 版本升级和数据迁移(编译版)

最近给pgsql从16.0升级到16.4,有挺多细节 1.关闭pgsql 为了保证数据一致性和过渡平稳,还是需要暂停pgsql。 systemctl stop pgsql2.备份现有数据 需要切换到pgsql的用户,通常用root是不行的 pg_dumpall > /xxx/xxx/backup.sql3.重命名…

ArcGIS地理空间平台 manager 任意文件读取漏洞复现

0x01 产品描述: ‌ ArcGIS‌是一个综合的地理空间平台,由Esri开发,旨在为专业人士和组织提供全面的地理信息系统(GIS)功能。ArcGIS通过集成和连接地理环境中的数据,支持创建、管理、分析、映射和共享…