QianBase TP是一个轻量级快速部署、方便易用的集中式数据库,对Oracle语法具有极大的兼容能力,兼容Oracle数据类型、触发器、存储过程,提供异构数据库一键迁移工具,方便快速替换传统数据库。那么下面我们来介绍一下, Qian Base TP是如何做到更好地兼容 Oracle数据类。
1、文章内容预览
本文主要从以下五个方面进行介绍:
-
第一章:设计文章的组织架构及安排。
第二章:论述研发Package插件的背景及意义,以及文章整体的架构。
-
第三章:描述Package插件的作用以及详细的使用方式。
-
第四章:QianBase TP兼容Package插件的支持情况。
-
第五章:对Package插件做一个总结以及后续的一些展望。
2、研发背景
因国际环境的变化,国产化进程进一步加快,金融行业掀起了国产化替代的浪潮,但由于国内应用主要以国外数据库Oracle为主,特别是金融领域对其的一系列特性的应用较为广泛,而国产数据库在Oracle兼容方面还存在一定差距,因此核心系统的国产化推进较为缓慢。为了加快进度,以及满足大多数用户对QianBase TP可以兼容Oracle数据库的某些特性的希望,我们增加了一系列的兼容特性,本文档所介绍的Package插件便是我们兼容的成果之一。
3、插件相关内容
3.1Package插件介绍
包头(Package)部分是创建包的规范说明,创建者可以在包头里面声明存储过程、函数、数据类型、变量等元素,这一部分内容对用户来说相当于透明的接口,其中存储过程和函数只是进行声明,并未实现具体的功能,在包头里面我们只能了解到这个包具有哪些功能,若要进行调用则需要在包体内实现与之对应的功能后才可以,而数据类型、常量、变量、游标等元素则是在包头里声明后既可以进行调用,这些元素的作用域为整个会话。
包体(Package body)则是包头定义部分的具体实现,包体的主要内容就是实现在包头里面声明的存储过程和函数,在实现的过程中有两点特性需要指出:第一点是私有元素的声明,我们可以在包体内继续声明类似的元素,比如存储过程、函数、变量等,这些被称之为私有元素,它们的作用域仅限于在该包体内使用;第二点就是局部元素的声明:局部元素是在存储过程和函数中声明的元素,这种元素的作用域仅限于声明它的存储过程或者函数。
在创建Package时需要注意的是先创建包头,然后才能创建包体,若是顺序颠倒则会导致创建失败。
与包头对应的包体创建成功后则代表着这个Package已经存在于我们的数据库中,可以使用该Package进行相应的操作,完成一些工作,使用Package将一组存储过程和函数进行封装,便于管理且不容易出错,目前在QianBase TP中存在的Package有DBMS_JOB、DBMS_SQL、UTL_FILE等会在后续文章中进行介绍。
下面会演示Package的使用方式,从创建Package、调用Package、删除Package、权限控制四个方面着手进行。
3.2Package插件使用方式
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。
3.2.1调用Package
由于Package中的元素以作用域的范围可分为三类:公共元素、私有元素、局部元素,因此在调用package的演示上便以这三个点进行。
3.2.1.1调用Package中的公共元素
在下面的例子中,在包体中实现包头中声明的存储过程ins_table时,调用了包头中声明的数据类型TableRec。
3.2.1.2 调用package中的私有元素
在下面的例子中,在包体中实现包头中声明的存储过程print_info时,调用了包体中声明的私有变量:test1。
3.2.1.3 调用package中的局部元素
在下面的例子中,在包体中实现包头中声明的存储过程print_info时,调用了存储过程中声明的局部变量:c。
3.2.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.2.3删除Package
权限控制体现在数据库的安全方面,在未经授权的用户会话上无法操作除用户本身拥有的Package。
具体例子如下所示:
4. Package插件的支持情况
QianBase TP中Package插件的兼容程度达到了80%以上,覆盖了Package的基本功能点及大部分较复杂点,可以很好的满足客户需求,同时也具有一些自身独有特性,比如可以同时删除多个Package。
5. 总结与展望
总体来说, Packag e 插件兼容是成功的,目前的状态可以满足客户的需求,未来会根据用户需求,进一步提升 Packag e 插件的兼容性。