本文主要从以下五个方面进行介绍:
第一章:设计文章的组织架构及安排。
第二章:论述研发DBMS_SQL插件的背景及意义。
第三章:描述DBMS_SQL插件的作用以及使用方式。
第四章:QianBase TP兼容DBMS_SQL插件的支持情况。
第五章:对DBMS_SQL插件做一个总结以及后续的一些展望。
因国际环境的变化,国产化进程进一步加快,金融行业掀起了国产化替代的浪潮,但由于国内应用主要以国外数据库Oracle为主,特别是金融领域对其的一系列特性的应用较为广泛,而国产数据库在Oracle兼容方面还存在一定差距,因此核心系统的国产化推进较为缓慢。为了加快进度,以及满足大多数用户对QianBase TP可以兼容oracle数据库的某些特性的希望,我们增加了一系列的兼容特性,本文档所介绍的DBMS_SQL插件便是我们兼容的成果之一。
在介绍DBMS_SQL之前需要先理解一下什么是静态SQL和动态SQL以及它们之间的区别。
简单来说,静态 SQL 是指在编写代码时已经明确了 SQL 查询语句的全部内容,包括表名、列名、查询条件等。静态 SQL 通常是硬编码在程序中的,无法在运行时进行修改的;而动态 SQL 是指在运行时动态生成 SQL 查询语句。动态 SQL 可以根据不同的条件和参数生成不同的 SQL 查询语句,从而实现更加灵活和动态的数据操作。动态 SQL 通常使用字符串拼接、EXECUTE 语句、存储过程等方式来实现。
它们两者的区别主要为:
静态 SQL 通常比较容易阅读和理解,因为查询语句的全部内容已经明确。由于查询语句是硬编码在程序中的,因此也比较容易维护和修改的;静态 SQL 通常比较固定和静态,因为查询语句的内容是在编写代码时已经明确了。这种方式比较适合一些固定和静态的数据操作。
动态 SQL 通常因为在编译时不知道 SQL 语句的全文或其输入和输出变量的个数以及数据类型,以及一些随机查询业务时,就不得不动态生成,因此动态SQL就有助于能够创建更通用的过程。由于查询语句是动态生成的,因此也比较难以维护和修改;动态 SQL 通常比较灵活和动态,因为查询语句的内容可以根据不同的条件和参数进行动态生成。这种方式可以实现更加灵活和动态的数据操作。
PL/SQL提供了两种实现动态SQL的方式,其一就是本章的主角:DBMS_SQL,从本质上来说DBMS_SQL是一个PL/SQL包,主要用于执行动态SQL和PL/SQL块的API集合。因此依赖于PL/QBSQL的基本环境,该环境已被内置到QianBase TP数据库中,因此用户无需考虑。
在DBMS_SQL包中封装了执行动态SQL需要的函数、存储过程、数据类型等数据元素,这些数据元素组合在一起形成一个有组织的代码集合,可以对一系列的动态SQL问题进行处理。
前提条件:安装之前请确保QianBase TP中已经部署了PL/QBSQL过程语言,执行如下命令查看。

在QianBase TP数据库中可以通过创建扩展的SQL语句来安装DBMS_SQL插件,值得注意的是,目前QianBase TP是一个多模库,即用户可以根据需要创建不同兼容模式的数据库,而DBMS_SQL插件只能在Oracle兼容模式库中使用,因此先创建Oracle兼容模式数据库,然后再创建DBMS_SQL扩展,具体SQL语句如下所示:

成功安装插件后便到了使用环节,下面会使用一些案例来展示如何使用DBMS_SQL包来执行动态SQL语句。
执行流程:
1)通过调用EXECUTE函数来运行INSERT、UPDATE或DELETE语句。
2)调用bind_array或者bind_variable过程来执行批量或单个操作。
3)输出数据并关闭游标。
Example-1:INSERT操作。下面的例子描述的是将数据批量插入到表test中。

上述例子中使用了bind_array过程来执行批量插入操作,以call dbms_sql.bind_array(c, 'a', a,0,4)SQL为例,具体含义是将数组变量a的前5个数据插入到test表中的a列上,后续的操作也是同样的流程。
Example-2:UPDATE操作。下面的例子描述的是对test表中的数据进行更新。

上述例子中使用了bind_variable过程来执行更新操作,以call dbms_sql.bind_variable(c, 'a', a)SQL为例,具体含义是将变量a的值传递到SQL语句中的占位符’a’上,使得SQL语句可以正常执行,后续的操作也是同样的流程。
QianBase TP中DBMS_SQL插件的兼容程度达到了70%,覆盖了DBMS_SQL的基本功能点以及大部分较复杂的点,可以很好的满足客户的需求,同时也具有一些自己的特性,比如
BIND_VARIABLE_F、COLUMN_VALUE_F、DESCRIBE_COLUMNS_F、DEBUG_CURSOR这些独属于自己的函数和过程,目前针对DBMS_SQL插件的兼容还有30%未完成,但这些并不影响具体的使用,主要未兼容的点为:数据类型和一小部分子程序。
总的来说,DBMS_SQL插件的兼容是成功的,目前的状态可以满足客户的需求,至于未兼容的部分后续会根据客户需要再进行考虑。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70026636/viewspace-2959637/ ,如需转载,请注明出处,否则将追究法律责任。