国产数据库适配-人大金仓(kingbase V8R3)

2023-12-14 11:28

本文主要是介绍国产数据库适配-人大金仓(kingbase V8R3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

金仓数据库是基于POSTGRE_SQL

参考资料

国产数据库人大金仓踩坑记录和函数适配_金仓数据库关系不存在-CSDN博客

Springboot工程 适配人大金仓 kingbase V8R3

引入驱动包和方言包

hibernate-5.2.17.Finaldialect.jar
kingbase8-8.2.0.jar

application.yml文件

driver-class-name: com.kingbase8.Driver
url: jdbc:kingbase8://10.7.215.249:54321/ta
username: root
password: e022f87539fd81f3
dialect: org.hibernate.dialect.Kingbase8Dialect

如果项目中使用了mybatis分页插件,需要加以下配置类,负责工程无法启动

@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {/*** 分页插件*/@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor pageHelper=new PaginationInterceptor();/***分页插件会根据配置的数据库连接地址获取对应的方言,但不支持kingbase,kingbase的需要设置成 MYSQL*/pageHelper.setDialectType(DbType.POSTGRE_SQL.getDb());return pageHelper;}}

遇到的问题:

1.KingbaseV8R6无法设置大小写敏感,查询时,表名或字段名不能用“`”符号,表字段名或别名需要用双引号括起来,否则全部会转为小写,sql语句中的出现的字符串需要用单引号标识。影响范围较大

故采用低版本的V8R3,查询使用别名时,最好遵循 字段 as 别名 这种写法。

2.mysql的group_concat函数需要替换成string_agg(字段名,分隔符),写法如下

  SELECTstring_agg(t.resource_id,',')FROMsim_group t

3. 使用group by时 查询的字段和order by的字段都必须出现在group by后面。解决方案:

在kingbase的安装目录下KingbaseV8R3/data找到kingbase.conf文件

加入下面一行配置,重启数据库

exclude_reserved_words='owner' // 屏蔽关键字 多个用逗号隔开
sql_mode='' // 兼容mysql group by命令

4. mysql中 一列拆成多行

SELECTsubstring_index(substring_index( a.rn,',',b.help_topic_id + 1    ),',' ,- 1) AS rn
FROM(select '1,2,3,4' as rn) a  
JOIN mysql.help_topic b ON b.help_topic_id <
(length(a.rn) - length( replace(a.rn, ',', '')  ) + 1)

kingbase中的写法:

select regexp_split_to_table('a,b,c,d,e,f',',') as rn;

5. timestampdiff函数需要自己创建, 其中第一个参数为text类型,函数创建语句如下

create or replace function timestampdiff(para1 text,para2 timestamp,para3 timestamp) return bigint
as
declarediff  interval day to second;diffs bigint;diffm bigint;diffh bigint;diffd bigint;nyy   bigint;  ny   bigint;nm    bigint;
begindiff:=para3-para2;diffs:=extract(second from diff);diffm:=extract(minute from diff);diffh:=extract(hour from diff);diffd:=extract(day from diff);ny:=extract(year from age(para3,para2));nm:=extract(month from age(para3,para2));nyy:=extract(year from para3)-extract(year from para2);if para1='second'  thenreturn ((diffd*24+diffh)*60+diffm)*60+diffs;elseif para1='minute' thenreturn (diffd*24+diffh)*60+diffm;elseif para1='hour' thenreturn diffd*24+diffh;elseif para1='day' then return diffd;elseif para1='month' thenreturn ny*12+nm;elseif para1='year' then return nyy;else raise warning 'para1 not support "%"!',para1;return null;end if;
end;

用法示例:

 SELECTip,safe_state safeState,update_state_date updateStateDateFROMasset_searchWHEREupdated = falseAND TimeStampDiff( 'hour', update_state_date, now()) > 24

6.获取当前时间的前7天

mysql中:

select date_add(SYSDATE(), interval -7 day)

kingbase中:

select sysdate-7

7. kingbase兼容date_formate函数

CREATE OR REPLACE FUNCTION date_format(indate anyelement, intext text)RETURNS textLANGUAGE plsql
AS 
BEGIN
IF upper(inText) = upper('%Y%m%d_%H%i') THEN
return to_char(inDate,'YYYYMMDD_HH24MI');
END IF;
IF upper(inText) = upper('%Y%m%d%H%i%s') THEN
return to_char(inDate,'YYYYMMDDHH24MISS');
END IF;
IF upper(inText) = upper('%Y-%m-%d %H') THEN
return to_char(inDate,'YYYY-MM-DD HH24');
END IF;
IF upper(inText) = upper('%Y-%m-%d') THEN
return to_char(inDate,'YYYY-MM-DD');
END IF;
IF upper(inText) = upper('%Y-%m') THEN
return to_char(inDate,'YYYY-MM');
end if;
IF upper(inText) = upper('%m%d') THEN
return to_char(inDate,'MMDD');
END IF;
return '';
END;

8.创建主键id自增的表,字段类型 SERIAL 表示自增,它会在库里创建一个序列

CREATE TABLE test (id SERIAL NOT NULL ,ip character varying(200 char),alarm_num integer,source_attack_num integer,get_attack_num integer,by_visit_num integer,create_date date,visit_num integer,event_amount integer,PRIMARY KEY ("id")
)

9.使用hibernate查询时,如果是以下写法,则会报错 Can't use query methods that take a query string on a PreparedStatement.

修改方式为:

PreparedStatement st = con.prepareStatement(sql);
ResultSet rs = st.executeQuery()

10.初始化数据时,如果表的主键是自增,则insert语句中不要对id列赋值,否则后续新增数据时,会报错主键冲突,原因是,手动给id赋值没有触发自增id的序列值更新。

解决方法:

把表对应的序列也初始化一下。

SELECT sys_catalog.setval('"PUBLIC"."clxt_compliance_config_id_SEQ"', 2, true);

关键字:

user、enable、label、type...

更多问题请参考金仓数据库知识库:金仓数据库知识库 - 金仓社区

这篇关于国产数据库适配-人大金仓(kingbase V8R3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/492346

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

SQL Server数据库迁移到MySQL的完整指南

《SQLServer数据库迁移到MySQL的完整指南》在企业应用开发中,数据库迁移是一个常见的需求,随着业务的发展,企业可能会从SQLServer转向MySQL,原因可能是成本、性能、跨平台兼容性等... 目录一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据二、迁移工具的选择2.1

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

查询Oracle数据库表是否被锁的实现方式

《查询Oracle数据库表是否被锁的实现方式》本文介绍了查询Oracle数据库表是否被锁的方法,包括查询锁表的会话、人员信息,根据object_id查询表名,以及根据会话ID查询和停止本地进程,同时,... 目录查询oracle数据库表是否被锁1、查询锁表的会话、人员等信息2、根据 object_id查询被