暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

再探金仓数据库 KingbaseES(SQL Server 兼容版)

原创 严少安 2025-07-23
238

【金仓数据库产品体验官】再探 KingbaseES 数据库 SQL Server 兼容版

金仓数据库的每一次迭代,都是“数据库平替”进步的有力见证。

前情回顾

之前专门发文介绍过金仓数据库 KingbaseES 的 SQL Server 兼容模式:

近期金仓数据库文章:

本文将继续探讨 KES 新版本,以及如何使用 JDBC 连接到 SQL Server 兼容模式,并调用存储过程。

产品更新

2025-05-15,KingbaseES V009R004C012 版本发布。

该版本加入了更多针对各行业应用场景的定制化功能,助力企业实现平滑迁移和业务高效运行。该版本新增了对 SQLServer 若干系统视图和内置函数的支持,支持 ICU 库并对其进行了优化;支持更多的高级查询功能,包括FOR XML 子句、PIVOT 行列转换操作、GROUP BY 子句中基于不同数据类型进行分组、DINSTICT 子句与 ORDER BY 联合中列别名的使用等;新增 DML 操作触发更新统计信息功能,提升查询性能与增强系统的稳定性;新增临时表优化功能,提升了函数执行效率。在客户端编程接口方面,.Net 驱动中新增了对 SQL Server 中一些日期函数的支持,这些新功能可以支撑应用灵活处理各种日期运算场景。

安装部署

之前已经多次介绍金仓数据库的安装部署,这里不再赘述。大家也可以参考马老师写的文章:

安装完成后,查看版本号,发现相较之前,新版本的版本号更加简洁,可读性更好。

当前最新版:

kingbase=# select version();
         version
-------------------------
 KingbaseES V009R004C012
(1 row)

之前的版本:

kingbase=# select @@version;
                                                        @@version
--------------------------------------------------------------------------------------------------------------------------
 KingbaseES V008R006C008M041B0010 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
(1 row)

数据类型

这里介绍两个数据类型:ROWVERSIONUNIQUEIDENTIFIER

ROWVERSION 是一种在数据库中自动生成唯一二进制数字的数据类型。rowversion 通常用作对表行进行版本标记的机制。rowversion 数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用 datetime2 数据类型。

UNIQUEIDENTIFIER 是一个 16 字节的 GUID。

以下示例在 KES 的 SQL Server 兼容模式下,创建一张表,并进行数据写入和查询。

kingbase# \c master
You are now connected to database "master" as userName "system".
master#
master# create table t_sqlserver (
master(# col12 uniqueidentifier,
master(# col15 rowversion
master(# );
CREATE TABLE
master# \d t_sqlserver
                  Table "dbo.t_sqlserver"
 Column |       Type       | Collation | Nullable | Default
--------+------------------+-----------+----------+---------
 col12  | uniqueidentifier |           |          |
 col15  | rowversion       |           | not null |

master# select @@dbts as before;
       before
--------------------
 0x0000000000000001
(1 row)

master# insert into t_sqlserver (col12)
master-# values (newid());
INSERT 0 1
master# select @@dbts as after;
       after
--------------------
 0x0000000000000001
(1 row)

master# select col12, col15 from t_sqlserver;
                col12                 |       col15
--------------------------------------+--------------------
 53E78275-35DA-41D6-834D-1D2E1272A0B8 | 0x0000000000000001
(1 row)

master# insert into t_sqlserver (col12)^Jvalues (newid());
INSERT 0 1
master# select @@dbts as after;
       after
--------------------
 0x0000000000000002
(1 row)

master# select col12, col15 from t_sqlserver;
                col12                 |       col15
--------------------------------------+--------------------
 53E78275-35DA-41D6-834D-1D2E1272A0B8 | 0x0000000000000001
 AFA401CA-CB1B-4954-B2EF-2A7D284127D3 | 0x0000000000000002
(2 rows)

没有变化的更新 rowversion 也会随之增长。

master# select col12, col15 from t_sqlserver;
                col12                 |       col15
--------------------------------------+--------------------
 53E78275-35DA-41D6-834D-1D2E1272A0B8 | 0x0000000000000003
(1 row)

master# select @@dbts as before;
       before
--------------------
 0x0000000000000003
(1 row)

master# update t_sqlserver set col12 = '53E78275-35DA-41D6-834D-1D2E1272A0B8';
UPDATE 1
master# select @@dbts as after;
       after
--------------------
 0x0000000000000004
(1 row)

master# select col12, col15 from t_sqlserver;
                col12                 |       col15
--------------------------------------+--------------------
 53E78275-35DA-41D6-834D-1D2E1272A0B8 | 0x0000000000000004
(1 row)

SQL:ROWGUIDCOL

ROWGUIDCOLUMN 主要用于需要将多个卫星数据库表的内容合并到一个中心数据库中的复制场景(MERGE 复制)。向要复制的表添加 ROWGUIDCOLUMN 可确保复制引擎可以使用 ROWGUIDCOLUMN 字段来区分具有相同主键值的记录。可以在任何想要将不可变列与主键分开的情况下使用(例如,在主键值可以更改的情况下,但你仍然希望能够分辨出更改前后哪一行是哪一行)。

master# CREATE TABLE dbo.example
master-# (
master(#   name sysname PRIMARY KEY,
master(#   rowguid uniqueidentifier NOT NULL DEFAULT NEWID() ROWGUIDCOL
master(# );
CREATE TABLE
master#
master# \d dbo.example
                     Table "dbo.example"
 Column  |       Type       | Collation | Nullable | Default
---------+------------------+-----------+----------+---------
 name    | sysname          | ci_x_icu  | not null |
 rowguid | uniqueidentifier |           | not null | newid()
Indexes:
    "example_pkey" PRIMARY KEY, btree (name NULLS FIRST)

master# INSERT dbo.example(name) VALUES(N'bob'),(N'frank');
INSERT 0 2
master# SELECT * FROM dbo.example;
 name  |               rowguid
-------+--------------------------------------
 bob   | 88CDDD89-4859-44C0-8F34-004DC8D26BC4
 frank | BF8E7BEA-59FE-4F71-A00B-F4321749B61F
(2 rows)

master# UPDATE dbo.example SET name = N'pat' WHERE name = N'bob';
UPDATE 1
master# UPDATE dbo.example SET name = N'bob' WHERE name = N'frank';
UPDATE 1
master# SELECT * FROM dbo.example;
 name |               rowguid
------+--------------------------------------
 pat  | 88CDDD89-4859-44C0-8F34-004DC8D26BC4
 bob  | BF8E7BEA-59FE-4F71-A00B-F4321749B61F
(2 rows)

master#

通过 JDBC 调用存储过程

切换到 master 库,创建一个存储过程,使用 TOP 子句查询示例表中的 name 字段。

master# CREATE PROCEDURE GetNames
master-# AS
master-# BEGIN
master-#    SELECT TOP 10 name
master-#    FROM dbo.example
master-# END
master-# ;
CREATE PROCEDURE
master#
master# call dbo.GetNames();
 name
------
 pat
 bob
(2 rows)

CALL
master#

随意写一段 Java 代码,使用 JDBC 驱动 kingbase8-9.0.0.jar 连接到 KES 数据库。

String driver = "com.kingbase8.Driver";
String base_url = "jdbc:kingbase8://192.168.43.90:54321/master";

查看数据库驱动版本和数据库服务器版本。

DatabaseMetaData metaData = conn.getMetaData();
System.out.println("Driver: " + metaData.getDriverName() + " " + metaData.getDriverVersion());

确认连接无误后,调用存储过程,并输出查询结果。

ResultSet crs = stmt.executeQuery("{call dbo.GetNames}");
System.out.println("Calling GetNames...");
while (crs.next()) {
    System.out.println(crs.getString("name"));
}

编译并运行这段 Java 代码,输出结果如图所示。

20250723_171519.png

KES 文档中的示例以 Oracle 和 PG 兼容模式为主,建议补充其他兼容模式的示例,最好提供一份演示代码供大家下载学习。

#数据库平替用金仓
#金仓产品体验官

Have a nice day ~


🌻 往期精彩 ▼

– / END / –

👉 这里也可以找到我

  • ITPUB:https://blog.itpub.net/31492144/
  • OSCHINA:https://my.oschina.net/mysqloffice
  • TiDB 专栏:https://tidb.net/u/ShawnYan/post/all
  • PGFans:https://pgfans.cn/user/home?userId=1193
  • 墨天轮:https://www.modb.pro/u/3351
  • IF Club:https://ifclub.com.cn/userCenter/1897171302338498562

👉 这里有得聊

如果对国产基础软件(操作系统、数据库、中间件)感兴趣,可以加群一起聊聊。
关注微信公众号:少安事务所,后台回复[群],即可看到入口。

如果这篇文章为你带来了灵感或启发,请帮忙『三连』吧,感谢!ღ( ´・ᴗ・` )~

最后修改时间:2025-07-24 01:54:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论