
QianBase TP是一个轻量级快速部署、方便易用的集中式数据库,对Oracle语法具有极大的兼容能力,兼容Oracle数据类型、触发器、存储过程,提供异构数据库一键迁移工具,方便快速替换传统数据库。那么下面我们来介绍一下,QianBase TP是如何做到更好地兼容Oracle数据类。
本文主要从以下五个方面进行介绍:
第一章:设计文章的组织架构及安排。
第二章:论述研发Package插件的背景及意义,以及文章整体的架构。
第三章:描述Package插件的作用以及详细的使用方式。
第四章:QianBase TP兼容Package插件的支持情况。
第五章:对Package插件做一个总结以及后续的一些展望。
因国际环境的变化,国产化进程进一步加快,金融行业掀起了国产化替代的浪潮,但由于国内应用主要以国外数据库Oracle为主,特别是金融领域对其的一系列特性的应用较为广泛,而国产数据库在Oracle兼容方面还存在一定差距,因此核心系统的国产化推进较为缓慢。为了加快进度,以及满足大多数用户对QianBase TP可以兼容Oracle数据库的某些特性的希望,我们增加了一系列的兼容特性,本文档所介绍的Package插件便是我们兼容的成果之一。
Package是由一组相关的存储过程(Procedure)、函数(Function)、数据类型、常量、变量、游标、异常等PL/SQL程序设计元素的组合,Package具有面向对象设计的概念,使用模块化的思想,用于分类管理数据库中的存储过程和函数等元素,类似于C、Java中类(class)的概念。
Package的组成:Package由两部分组成,分别是包头(Package)和包体(Package body)。
包头(Package)部分是创建包的规范说明,创建者可以在包头里面声明存储过程、函数、数据类型、变量等元素,这一部分内容对用户来说相当于透明的接口,其中存储过程和函数只是进行声明,并未实现具体的功能,在包头里面我们只能了解到这个包具有哪些功能,若要进行调用则需要在包体内实现与之对应的功能后才可以,而数据类型、常量、变量、游标等元素则是在包头里声明后既可以进行调用,这些元素的作用域为整个会话。
包体(Package body)则是包头定义部分的具体实现,包体的主要内容就是实现在包头里面声明的存储过程和函数,在实现的过程中有两点特性需要指出:第一点是私有元素的声明,我们可以在包体内继续声明类似的元素,比如存储过程、函数、变量等,这些被称之为私有元素,它们的作用域仅限于在该包体内使用;第二点就是局部元素的声明:局部元素是在存储过程和函数中声明的元素,这种元素的作用域仅限于声明它的存储过程或者函数。
在创建Package时需要注意的是先创建包头,然后才能创建包体,若是顺序颠倒则会导致创建失败。
与包头对应的包体创建成功后则代表着这个Package已经存在于我们的数据库中,可以使用该Package进行相应的操作,完成一些工作,使用Package将一组存储过程和函数进行封装,便于管理且不容易出错,目前在QianBase TP中存在的Package有DBMS_JOB、DBMS_SQL、UTL_FILE等会在后续文章中进行介绍。

下面会演示Package的使用方式,从创建Package、调用Package、删除Package、权限控制四个方面着手进行。
Package插件是在QianBase TP 15.0版本才兼容的,所以下面的演示部分是基于QianBase TP 15版本来进行的,具体版本信息如图2-1所示:


图3-1 数据库版本示意图
创建包头:
创建包头语法流程图:

plsql_package_source:

创建包头语法:

创建包头:在下述创建包头的代码中,分别声明了数据类型:TableRec、整型变量:x、变量:y、游标:FUN_RESULT、函数:tfun以及子程序存储过程:tpro。

创建包体:
创建包体语法流程图:

plsql_package_body_source:

创建包体语法:

创建包体:在下述的创建包体的代码中定义了游标c,以及实现了包头中声明的函数tfunc以及存储过程tpro。

1.调用Package
由于Package中的元素以作用域的范围可分为三类:公共元素、私有元素、局部元素,因此在调用package的演示上便以这三个点进行。
1.1调用Package中的公共元素:
在下面的例子中,在包体中实现包头中声明的存储过程ins_table时,调用了包头中声明的数据类型TableRec。

1.2调用Package中的私有元素
在下面的例子中,在包体中实现包头中声明的存储过程print_info时,调用了包体中声明的私有变量:test1。

1.3调用Package中的局部元素:
在下面的例子中,在包体中实现包头中声明的存储过程print_info时,调用了存储过程中声明的局部变量:c。

2.删除Package:
可以创建Package自然也可以删除Package,当某一个Package没有存在的必要时,可以对其进行删除,删除Package所用的关键字为DROP。
在删除Package时需要注意的是:当删除包头时,包体也会自动删除,但若是删除了包体,包头是仍然存在的,也就是说若想删除一个完整的Package有两种方式.
第一种方式为:
DROP PACKAGE PACKAGE_NAME;
第二种方式为:
DROP PACKAGE BODY PACKAGE_NAME;
DROP PACKAGE PACKAGE_NAME;
下面的例子中演示了正确的删除Package的流程。

需要注意的是在QianBase TP中拥有删除多个Package的功能,这一点是我们独有的,具体的语法为:

3.权限控制:
权限控制体现在数据库的安全方面,在未经授权的用户会话上无法操作除用户本身拥有的Package。
具体例子如下所示:

QianBase TP中Package插件的兼容程度达到了80%以上,覆盖了Package的基本功能点及大部分较复杂点,可以很好的满足客户需求,同时也具有一些自身独有特性,比如可以同时删除多个Package。
总体来说,Package插件兼容是成功的,目前的状态可以满足客户的需求,未来会根据用户需求,进一步提升Package插件的兼容性。
END
▼
往期精彩回顾
▼
易鲸捷简介
易鲸捷公司成立于2015年,专注于新一代融合型分布式数据库核心技术研发。公司核心团队源自天腾公司,曾创造过NonStopSQL等全球领先的数据库产品,核心技术完全自主可控。经过多年技术沉淀,易鲸捷已形成自主可控、国产可信、安全高效的三条完整分布式数据库产品线:QianBase xTP/QianBase TP/QianBase MPP,可面向不同行业应用提供完整的一站式解决方案,在金融、运营商、智能制造、5G等重点行业获得广泛应用。
网址:www.esgyn.cn

贵州易鲸捷信息技术有限公司 地址:贵阳市高新区长岭南路160号高科1号C座24楼 | |
北京易鲸捷信息技术有限公司 地址:北京市朝阳区大屯街道北苑路万科时代中心奥林A座10层 | |
上海易鲸捷信息技术有限公司 地址:上海市浦东新区金科路2889弄1号长泰广场A座6层03单元 | |
北京:010-84983409 | 上海:021-50822117 |
邮箱:info@esgyn.cn | 网址:www.esgyn.cn |





