KingbaseES用户可通过设置相关的数据库兼容参数,部分或全部启用Oracle兼容特性。

常用的兼容性参数有以下这些:

参数名称 参数说明
ora_forbid_func_polymorphism 是否是否禁用函数多态。 on 表示开启禁用多态,同模式下不能创建同名的函数或存储过程。 off(默认), 则表示启用多态。
ora_input_emptystr_isnull 输入空字符串时的处理措施。 on 表示将输入的空字符串作为null 值处理。 off 表示不处理。
ora_numop_style 是否将 integers 操作符当做 numeric 操作符。
ora_statement_level_rollback 是否启用语句级回滚。
ora_style_nls_date_format 这个变量设置为on 时,日期时间的隐式输入与输出字符串格式才会使用参数nls_date_format、 nls_timestamp_format和nls_timestamp_tz_format 的配置。
ignore_zero_number 当打开时,number 类型输出时末尾忽略“0”。默认为off。
enable_func_colname 启用或禁用函数别名作为列名功能。默认此功能禁用。
enable_upper_colname 开关打开,查询结果的列名将转换为大写。 只在oracle模式,并且大小敏感(enable_ci=off)的时有效

下面通过一些实验来说明这些参数的具体用途。

1.ora_forbid_func_polymorphism

函数多态是指在同一个用户模式下,一组具有相同名字,但是参数个数不同或者参数个数相同但参数类型不同的函数。

最常见的多态函数就是to_char函数。

参数只影响设置后

我们用创建加密扩展(kbcrypto)来验证ora_forbid_func_polymorphism 参数的影响

test=# show ora_forbid_func_polymorphism ;
ora_forbid_func_polymorphism
------------------------------
off
(1 行记录) test=# create extension kbcrypto;
CREATE EXTENSION
test=# drop extension kbcrypto;
DROP EXTENSION
test=# set ora_forbid_func_polymorphism=on;
SET
test=# create extension kbcrypto;
错误: function or procedure "digest" already exists

在禁用函数多态的情况下,扩展创建失败。 查看创建扩展需要执行的脚本,可以看到脚本会创建2个digest函数(参数类型不同)

[root@singlekbdb extension]# grep digest kbcrypto--1.3.sql
CREATE FUNCTION digest(text, text)
AS 'MODULE_PATHNAME', 'sys_digest'
CREATE FUNCTION digest(bytea, text)
AS 'MODULE_PATHNAME', 'sys_digest'

2.ora_input_emptystr_isnull

将参数设置不同的值,分别往表中插入空字符串'' (两个连续的单引号)和null

test=# create table tnull(c1 int,c2 varchar);
CREATE TABLE
test=# show ora_input_emptystr_isnull;
ora_input_emptystr_isnull
---------------------------
on
(1 行记录) test=# insert into tnull values (1,'');
INSERT 0 1
test=# insert into tnull values (2,null);
INSERT 0 1
test=# set ora_input_emptystr_isnull=off;
SET
test=# insert into tnull values (3,'');
INSERT 0 1
test=# insert into tnull values (4,null);
INSERT 0 1

测试在ora_input_emptystr_isnull不同情况下的查询结果

test=# show ora_input_emptystr_isnull;
ora_input_emptystr_isnull
---------------------------
on
(1 行记录) test=# select * from tnull where c2 is null;
c1 | c2
----+----
1 |
2 |
4 |
(3 行记录) test=# select * from tnull where c2='';
c1 | c2
----+----
(0 行记录) test=# set ora_input_emptystr_isnull=off;
SET
test=# select * from tnull where c2 is null;
c1 | c2
----+----
1 |
2 |
4 |
(3 行记录) test=# select * from tnull where c2='';
c1 | c2
----+----
3 |
(1 行记录)

结果可以看到对于在ora_input_emptystr_isnull=on时插入的数据(1,2两行),不管参数值设置为什么,查询结果都是一致的。

对于ora_input_emptystr_isnull=off时插入的数据(3,4两行),参数值设置的不同对于空字符串('')的查询结果是不同的。

在参数关闭的情况下,数据库存储的空字符串和null值是不一致,通过length函数可以观察到这一结果

test=# select c1,length(c2) from tnull;
c1 | length
----+--------
1 |
2 |
3 | 0
4 |
(4 行记录)

所以在使用时,尽量不修改ora_input_emptystr_isnull参数,可能会影响后续的select访问结果。

再来看一组空字符串插入/转换不同类型的测试结果

test=# show ora_input_emptystr_isnull;
ora_input_emptystr_isnull
---------------------------
on
(1 行记录) test=# insert into tnull (c1) values ('');
INSERT 0 1
test=# set ora_input_emptystr_isnull=off;
SET
test=# insert into tnull (c1) values ('');
错误: 无效的类型 integer 输入语法: ""
第1行insert into tnull (c1) values ('');
^
test=# select ''::integer;
错误: 无效的类型 integer 输入语法: ""
第1行select ''::integer;
^
test=# select ''::date;
错误: 无效的类型 timestamp 输入语法: ""
第1行select ''::date;
^
test=# reset ora_input_emptystr_isnull;
RESET
test=# select ''::integer;
int4
------ (1 行记录)

当ora_input_emptystr_isnull=off时,''属于字符串类型,无法转换成其他数据类型。

当ora_input_emptystr_isnull=on时,''被转成null,而null没有类型约束,所以可以转换为任意类型。

3.ora_numop_style

test=# create table t1(name varchar,money varchar);
CREATE TABLE
test=# insert into t1 values ('zs','1000');
INSERT 0 1
test=# insert into t1 values ('ls','156.9');
INSERT 0 1
test=# insert into t1 values ('ww','9999999999999999');
INSERT 0 1
test=# show ora_numop_style;
ora_numop_style
-----------------
off
(1 行记录)
test=# select money * 10 from t1 where name = 'zs';
?column?
----------
10000
(1 行记录) test=# select money * 10 from t1 where name = 'ls';
错误: 无效的类型 integer 输入语法: "156.9"
test=# select money * 10 from t1 where name = 'ww';
错误: 值 "9999999999999999" 超出类型 integer 的范围 test=# set ora_numop_style=on;
SET
test=# select money * 10 from t1
test-# ;
?column?
-------------------
10000
1569.0
99999999999999990
(3 行记录)

以字符串类型存储的数值,sql在计算时会根据常量的数据类型将字段类型会和常量值的类型做统一,再做计算。

如果常量类型是整型,可能会导致一些异常。

在计算过程当中如果有多个常量,则根据计算规则,与优先参与计算的常量数据类型做统一。

test=#  select money * 10 * 10.1 from t1;
错误: 值 "9999999999999999" 超出类型 integer 的范围
test=# select money * 10.1 * 10 from t1;
?column?
-----------------------
101000.0
1009999999999999899.0
15846.90
(3 行记录) test=# select 10 * money * 10.1 from t1;
错误: 值 "9999999999999999" 超出类型 integer 的范围
test=# select 10.1 * money * 10 from t1;
?column?
-----------------------
101000.0
1009999999999999899.0
15846.90
(3 行记录)

4.ora_statement_level_rollback

参数指定了plsql中是否启用语句级回滚。

test=# create table t1 (id int);
CREATE TABLE
test=# create table t2 (id int);
CREATE TABLE
test=# insert into t1 values (1);
INSERT 0 1
test=# insert into t2 values (2);
INSERT 0 1
test=# \set SQLTERM /
test=# CREATE OR REPLACE PROCEDURE p1()
test-# AS
test-# DECLARE
test-# v_id int ;
test-# BEGIN
test-# SELECT id INTO v_id FROM t1 WHERE id = 1;
test-# UPDATE t1 SET id = 3 WHERE id = v_id;
test-# call p2();
test-# COMMIT;
test-# END;
test-# /
CREATE PROCEDURE
test=# CREATE OR REPLACE PROCEDURE p2()
test-# AS
test-# DECLARE
test-# v_id int ;
test-# BEGIN
test-# SELECT id INTO v_id FROM t2 WHERE id = 5;
test-# UPDATE t2 SET id = 1 WHERE id = v_id;
test-# EXCEPTION
test-# WHEN no_data_found THEN
test-# RAISE NOTICE 'no_data_found';
test-# END;
test-# /
CREATE PROCEDURE

准备表和存储过程,其中p1更新t1表,并且调用p2。 p2执行中会因为无法查询到数据报错。

test=# show  ora_statement_level_rollback;
ora_statement_level_rollback
------------------------------
off
(1 行记录) test=# call p1();
注意: no_data_found
CALL
test=# select * from t1;
id
----
1
(1 行记录) test=# set ora_statement_level_rollback = on;
SET
test=# call p1();
注意: no_data_found
CALL
test=# select * from t1;
id
----
3
(1 行记录)

在ora_statement_level_rollback=off的情况下,系统执行了全局回滚,所以t1表的记录并没有被更新为3.

在ora_statement_level_rollback=on的情况下,系统执行了语句级回滚,只回滚了p2的错误,所以t1表的记录被更新为3.

如果存储过程中的异常不做处理,即使ora_statement_level_rollback=on一样会进行全局回滚。

恢复t1表的数据
test=# update t1 set id = 1;
UPDATE 1
test=# select * from t1;
id
----
1
(1 行记录) 修改p2,去掉异常捕获部分
test=# \set SQLTERM /
test=# CREATE OR REPLACE PROCEDURE p2()
test-# AS
test-# DECLARE
test-# v_id int ;
test-# BEGIN
test-# SELECT id INTO v_id FROM t2 WHERE id = 5;
test-# UPDATE t2 SET id = 1 WHERE id = v_id;
test-# END;
test-# /
CREATE PROCEDURE test=# show ora_statement_level_rollback;
ora_statement_level_rollback
------------------------------
on
(1 行记录)
test=# call p1();
错误: 查询没有返回记录
背景: PL/SQL函数p2()的第5行的SQL语句
SQL 语句 "CALL p2()"
PL/SQL函数p1()的第7行的CALL
test=# select * from t1;
id
----
1
(1 行记录)

5.ora_style_nls_date_format

参数ora_style_nls_date_format是R6版本时间格式化参数的开关,打开后时间数据会根据nls_date_format、 nls_timestamp_format和nls_timestamp_tz_format等参数设置的格式进行格式化。

oracle的sqlldr可以通过控制文件设置需要导入的时间格式,kes可以通过这些格式化参数的设置来辅助copy和sys_bulkload命令工具导入特定的时间数据。

[kbc5@singlekbdb ~]$ cat t3.csv
20220814164714
test=# \d t3
数据表 "public.t3"
栏位 | 类型 | 校对规则 | 可空的 | 预设
------+-----------------------------+----------+--------+------
ct | timestamp without time zone | | | 直接使用copy会报错:
test=# COPY t3 FROM '/home/kbc5/t3.csv';
错误: 日期/时间值超出范围: "20220814164714"
提示: 也许你需要不同的 "datesytle" 设置.
背景: COPY t3, 行 1, 列 ct: "20220814164714" 需要将ORA_STYLE_NLS_DATE_FORMAT设置为on,按照数据情况和表的数据类型设置时间格式化参数NLS_TIMESTAMP_FORMAT 或者 NLS_DATE_FORMAT ,设置好后就可以导入数据了。
本例子数据到时分秒为止,并且表列的数据类型是timestamp,所以设置了set NLS_TIMESTAMP_FORMAT='YYYYMMDDHH24MISS';
test=# set ORA_STYLE_NLS_DATE_FORMAT=on;
SET
test=# set NLS_TIMESTAMP_FORMAT='YYYYMMDDHH24MISS';
SET
test=# COPY t3 FROM '/home/kbc5/t3.csv';
COPY 1

KingbaseES 的oracle兼容性参数的更多相关文章

  1. KingbaseES 与 Oracle 用户口令管理与资源管理

    一.概述 KingbaseES可以对用户口令与用户占用资源进行必要的管理.其管理方式,在这里与Oracle数据库进行参考比较. KingbaseES 使用扩展插件建立的系统参数,这组参数可以对数据库资 ...

  2. Linux 下 Oracle 内核参数优化

    数据库的性能优化涉及到整个数据库运行环境的方方面面,诸如操作系统,Oracle自身,存储,网络等等几个大块.而操作系统则是Oracle稳定运行与最大化性能的基石.本文主要描述基于Linux系统下 Or ...

  3. Linux 内核参数 和 Oracle相关参数调整

    Linux 内核参数 和 Oracle相关参数调整 分类: Oracle Basic Knowledge2009-10-14 12:23 9648人阅读 评论(0) 收藏 举报 oraclelinux ...

  4. ORACLE初始化参数文件概述

    ORACLE初始化参数文件概述 在9i之前,参数文件只有一种,它是文本格式的,称为pfile,在9i及以后的版本中,新增了服务器参数文件,称为spfile,它是二进制格式的.这两种参数文件都是用来存储 ...

  5. oracle监控参数

    Sar –u 检查CPU的繁忙程度列说明Usr用户模式下cpu运行所占的百分比Sys系统模式下cpu运行所占的百分比Wio因为有进程等待块I/O而使cpu处于闲置状态所占百分比IdleCpu为闲置状态 ...

  6. OceanBase 2.1 的ORACLE兼容性能力探秘

    概述 OceanBase是一款通用的分布式关系型数据库,目前内部业务使用比较多有两个版本:1.4和2.1.OceanBase每个版本变化总能带给人很多惊喜,其中2.1版本实现了ORACLE很多特性的兼 ...

  7. 一文详解TDSQL PG版Oracle兼容性实践

    TDSQL PG版分布式关系型数据库,是一款同时面向在线事务交易和MPP实时数据分析的高性能HTAP数据库系统.面对应用业务产生的不定性数据爆炸需求,不管是高并发交易还是海量实时数据分析,TDSQL ...

  8. KingbaseES 与Oracle 函数稳定性对于性能影响差异比较

    一.函数的属性 KingbaseES 函数在定义时有三种稳定性级别:volatile.stable 和 immutable.默认情况下,创建函数的稳定性为volatile.以下是这三种函数的区别: V ...

  9. ORACLE推导参数Derived Parameter介绍

    Oracle的推导参数(Derived Parameters)其实是初始化参数的一种.推导参数值通常来自于其它参数的运算,依赖其它参数计算得出.官方文档关于推导参数(Derived Parameter ...

  10. Oracle的参数文件

    参数文件的作用: 它们是在数据库实例启动时候加载的,决定了数据库的物理结构.内存.数据库的限制及系统大量的默认值.数据库的各种物理属性.指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重 ...

随机推荐

  1. Springboot中如何使用日志框架logback和log4j2?

    说明 在这个简短的教程中,我们将探索 Spring Boot 中可用的主要日志记录选项:logback和log4j2 初始设置 使用 starters 时,默认使用 Logback 进行日志记录. 让 ...

  2. 如何获取oracle dbid

    1.查询v$database获得 由于DBID在控制文件和数据文件中都存在记录,所以如果能够mount数据库就可以查询v$database视图获得.  SQL> alter database m ...

  3. Java集合框架学习(十) LinkedHashMap详解

    LinkedHashMap介绍 1.Key和Value都允许null: 2.维护key的插入顺序: 3.非线程安全: 4.Key重复会覆盖.Value允许重复. 类定义 public class Li ...

  4. 全栈式测试平台RunnerGo核心功能模块-接口管理

    ​全栈式测试平台RunnerGo相对于市面上其他性能测试产品来说更简单,它不用其他相关配件,天然支持分布式,有单独的机器做分布式的负载均衡,自有一套智能算法算压力机的配置从而平均分配,并从场景链路的流 ...

  5. 问题:django中对datetime类型数据在pycharm中sqlite3进行修改时,修改后datetime日期数据变成了时间戳类型

    这是正在修改的 提交完之后 问题原因 问题原因是sqlite数据库对日期类型不敏感,Pycharm直接插入会变成图中这样的时间戳,用POST请求添加数据或Django自带的后台管理插入不会有这样的问题 ...

  6. React实现导航栏点击高亮

    在jquery中实现导航栏的切换只需要一行代码找到同级其他元素removeClass以及添加点击元素addClass就可以实现了,但是React没法直接找到同级元素,这个时候需要一点js中的思维,根据 ...

  7. 使用JMeter的JSON提取器:通过递归下降查找,从接口响应中提取特定字段

    在接口测试中,我们经常需要从返回的JSON数据中提取特定字段以便后续使用.JMeter提供了JSON提取器,可以帮助我们实现这一目标.本文将介绍如何使用JMeter的JSON提取器通过递归下降查找的方 ...

  8. Metasploitable3 渗透测试

    1.信息手机阶段 信息收集经常使用的软件 功能也比较强大的Nmap Nmap nmap -p- -sS -sV -n -v --reason --open -oX demon.xml 192.168. ...

  9. 深入理解与应用CSS clip-path 属性

    clip-path clip-path是什么 clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐藏.通过定义这个剪切路径(clipping p ...

  10. [MAUI] 混合开发概念

    ​ 混合开发的概念是相对与原生开发来说的:App不直接运行原生程序,而是在原生程序中运行一个Web程序,原生程序中包含Web运行时,用于承载Web页面.暂且将原生应用称之为Web容器,Web容器应该能 ...