技术开发 频道

达梦数据库7.0版新特性之PL_SQL介绍

  【IT168 技术】在前几篇文章中,我们为大家介绍了达梦7.0数据库的几个新特性:水平分区、动态性能监视和批量处理技术。本篇文章我们将为大家介绍达梦7.0之PL/SQL。

  相关文章:

  • 达梦7.0新版本即将发布 新特性抢先看
  • 达梦数据库7.0版新特性之动态性能监视
  • 达梦数据库7.0版新特性之批量处理技术

  1. PL/SQL概述

  PL/SQL是达梦数据库对标准SQL语言的扩展,达梦数据库公司已经将PL/SQL整合到达梦数据库服务器中,PL/SQL是达梦数据库的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。

  在DM7中,对PL/SQL功能做了很大的改进,同时加入了很多新的功能,使得PL/SQL的使用、执行都有很大的改善,主要体现在下面四个方面:

  (1)PL/SQL增加了对DM7中新增的类类型的支持。

  (2)从DM7开始,PL/SQL支持全部C语言语法,这样在对自定义的PL/SQL语法不熟悉的情况下也可以对数据库进行各种操作,这样可以使对数据库的操作更加灵活,也更加容易,这是在各数据库系统中很少有的。

  (3)DM7也支持PL/SQL语句块的执行计划重用的功能,这样可以避开对大量语句的重复分析,从而可以很有效的提高系统的执行效率。

  (4)DM7中对SQL的执行是类似JAVA虚拟机的模式,这种运行机制可以有效提升PL/SQL的执行效率。

  2. C语法的PL/SQL

  在我们印象中,PL/SQL是很复杂的,因为它有自己的语法规则,并且通常都不会去记那么多并且复杂的语法,只是在用的时候查看程序员手册,所以写一个可以执行并且正确的PL/SQL语句是比较困难的。

  在达梦数据库中,第一次实现了用C语言语法作为PL/SQL的一个可选语法,这就为那些了解C语言的人提供了很大的方便性,而无需去查看程序员手册就可以很自如的完成一个语句块,这对SQL程序员而言,这个功能无疑是他们梦寐以求的。

  在C语法PL/SQL的应用方面,定义一个语句块不需要用BEGIN及END把语句包含起来,而是直接用大括号括住即可。下面举一个C语法的PL/SQL的例子来更具体的说明。

{
    string    
str=' Hello World';
    
int        count = 0;
    
for(count = 0; count < 10; count++)
    {
        
if(power(count, 2) % 2 == 0)
            
print concat(power(count, 2), str);
    }
}
输出:
0 Hello World
4 Hello World
16 Hello World
36 Hello World
64 Hello World
0 rows affected
time used:
42.978(ms) clock tick:111735871.

   从上面例子可以看出,用C语法的PL/SQL时,程序可以变得非常简单易懂,可以很自由的调用一些系统内部函数(如上面例子中的concat()、power())、存储函数、过程等等。可以定义象C#中的一些数据类型,如上面例子所示STRING类型,还可以定义C语言中的基本数据类型,如上面例子中的int,另外还支持全部的SQL类型,达梦数据库内部定义的类类型、数组类型、游标类型等。

  3. PL/SQL的执行原理

  DM7的SQL语句执行是仿照JAVA虚拟机(VM)模式实现的。这种运行机制可以有效提升PL/SQL的执行效率。

  方法(METHOD):执行计划的实际执行体称为方法。方法中包含3个主要元素:变量、指令以及操作符。

  变量(VARIABLE):方法的变量分为参数、局部变量以及返回值。无论哪种变量,都通过VM的堆栈进行读写访问。不同类型的变量,占用堆栈的字空间也是不同的。除了变长的串类型,每个类型变量对应的字空间都是确定的。但不论哪种类型的变量,其在VM堆栈中都是字对其存放的。VM堆栈的字宽度也是可变的。在32位系统下,一个字长为4字节,而64为系统下,则为8字节。

  指令(DIRECTIVE):DM7执行器借助指令进行变量读写、各类运算、跳转循环以及异常处理。DM7执行器提供了100多个指令,每个指令仅执行最基本的操作,如LOAD、STOR、JMP等。但将不同的指令组合起来,就可以实现任意复杂的处理逻辑。指令是流式组织并顺序执行的(除了特殊的跳转指令)。每个方法都包含一个指令流来完成主体执行流程。在涉及计算的SQL操作符中,也包含各自的指令流。

  操作符(OPERATOR):DM7执行器的SQL操作符简称操作符。操作符是SQL语句物理计划的组成元素,它们负责对表中数据进行访问和处理。每个单独的增、删、改或查询语句都对应有一棵由操作符构成的二叉树物理计划。

  DM7计划执行流程如下:

  1、构造虚拟机VM,生成堆栈,压入语句参数。

  2、对应方法信息构造执行栈帧(STACK FRAME)。栈帧是VM运行机制中的重要元素,它可以看作是方法的实例化对象。用以记录方法运行时的环境。

  3、加载METHOD的指令流,开始执行。

  4、NSQL是一个特殊的指令,这个指令负责执行一个SQL物理计划。它找到对应的操作符树,对应生成运行环境树,然后将VM的运行指针IP转移到操作符树根,开始执行该物理计划。计划执行完成后,IP被置向NSQL的下一条指令继续执行。

  5、在SQL物理计划执行过程中,如果当前执行操作符需要进行数据计算,则又会加载执行其计算指令流,待计算完成后继续转回操作符执行。

  6、过程/函数调用指令INV找到该函数执行计划的METHOD,为其构造新的栈帧,并转入其执行环境中执行。

  7、返回指令RTN将当前栈帧销毁,向堆栈填入返回值(如果有),并返回上层栈帧执行。图3.1表示的是虚拟机的执行过程:

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.1 虚拟机执行示意图

  图3.2表示的是对表在PL/SQL中存在的SQL语句的执行过程,先根据NSQL的左孩子节点构造运行环境树,然后在每个树节点中都构造子VM通过VM的状态转移来控制执行步骤,递归执行完以NSQL为根节点的指令后一条SQL语句就相应执行完成。

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.2 NSQL指令执行示意图

  图3.3表示的是函数/过程指令的执行过程,系统首先会从INV中找到对应的方法,然后构造新的栈桢,并将IP设置为新栈桢的开始位置,然后执行对应的指令流,执行完成后删除其栈桢并且还原IP,这样一个过程/函数的指令就执行完成。

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.3 过程/函数指令执行示意图

  图3.4表示的是一个完成的VM执行从开始到结束的示意图,可以看出对于简单的常规指令,执行是比较简单的,只是做很小的操作即可完成,对于过程/函数这样的指令,系统还需要找到对应的既定义函数来执行,执行完成后再返回到虚拟机执行中;对于NSQL指令的执行可以看出,它会在执行时构造一棵环境树,执行时会递归执行内部的每个节点,每个子节点执行完成会返回到其父节点中,当所有节点都完成后会再回到NSQL指令,这样就可以返回到虚拟机的指令流中继续执行下一个指令了。

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.4 虚拟机执行示意图

  DM7面向堆栈的虚拟机执行器,可以在指令与操作符间平滑地切换执行,也能够轻松地实现过程/函数的调用。借助简单高效的指令系统,以及直观快速的堆栈数据传输机制,可以有效提升SQL脚本或过程/函数的执行效率。

  DM7中分析PL/SQL时都是将语句块中的每条语句都分解成一个个的原子操作,象一个编译器一样将语句块分解为很多的指令流。对于语句块中嵌入的SQL语句,会生成一个NSQL指令,这样就会转去执行相应的操作符。对于语句块中嵌入的内部函数、存储过程或者函数都生成一个INV的指令,然后再转去执行真正的被调用体。而对于简单的运算操作,因为VM的执行是通过栈模型来操作的,所以执行是原子性的将操作数入栈,再根据具体的操作符来完成运算,再将结果压入栈中。

  从上面的虚拟机执行过程可以看出,PL/SQL的执行是非常高效的,完全可以把它理解为JAVA语言运行在JAVA虚拟机上。

0
相关文章