#PL概述
PL语言是SQL语言在YashanDB数据库上的过程扩展语言,是一种可移植的高性能可编程语言,本文将介绍PL语言的优点及主要特性。
# PL的优势
PL相较于其他编程语言具有以下优点:
SQL集成
支持可编程
高性能
可移植性
# SQL集成
PL语言与结构化查询语言SQL的结合非常紧密,具体表现在以下方面:
- PL语言中允许静态SQL操作,即直接使用所有的DQL、DML数据操作,事务控制语句,以及所有内置函数、高级包函数、运算符和伪列。
- PL语言中允许通过动态SQL方式进行所有SQL操作。
- PL语言完全支持SQL中定义的所有数据类型。
- PL语言中支持游标变量,提供了灵活的游标OPEN、FETCH、CLOSE、赋值、入参、出参、返回给客户端等操作。
- PL语言中,可以为变量的数据类型指定数据库表的列或行的数据类型,而无需显式指定该数据类型。
- PL语言中,运行DQL查询时将会一次处理查询结果集的一行。
- PL语言可以定位自定义函数,该函数可以在DQL语句中直接使用。
- PL对SQL的操作产生异常时,均可以通过异常模块的编程进行捕获。
# 支持可编程
结构化查询语言SQL与数据库的结合非常紧密,主要用于描述如何访问和处理数据库,包括数据的增删改查操作。但SQL语言的可编程并不强,PL语言则是针对该弱点进行扩展的语言。
PL语言支持变量声明、赋值、缺省表达式,实参和形参等特点。
PL语言中的变量除了普通数据类型声明的标量形式,还可以支持普通数据类型或者用户自定义类型UDT定义的数组、OBJECT、NEST TABLE等向量形式。
PL语言中提供了循环、条件、跳转、空行等可编程语言逻辑。
PL语言提供了异常捕获模块。
PL语言提供了存储过程、自定义函数、触发器、匿名块等多种数据库对象形态,提供不同的使用场景。
# 高性能
PL语言通过可编程逻辑和SQL集成,可以直接在数据库实现应用逻辑操作,从而显著的减少应用程序和数据库之间的结果集交互流量。
通过绑定变量的方式,在PL语言中使用DML/DQL操作,PL编译器会将SQL语句中出现的PL变量转换为绑定变量。
YashanDB数据库在每次运行相同的SQL语句时,将复用SQL语句的编译缓存,从而提高性能。
在PL语言中使用动态SQL时,不会自动创建绑定变量,但可以通过EXECUTE IMMEDIATE语句中的USING子句显式指定绑定参数。
PL的程序在首次调用将进行编译,编译完成进入PL POOL缓存池,后续复用,从而提高性能。
# 可移植性
PL语言是用于数据库开发的可移植标准语言,可以在运行数据库的任何操作系统和平台上使用PL语言。
# PL的主要特点
PL语言结合了SQL语言的数据操作能力和过程语言的处理能力,主要包括以下特点:
语句块
变量和常量
PL数据类型
丰富的语句形式
丰富的对象形态
异常捕获模块
# 语句块
PL语言的基本单元是语句块,它对相关的声明和语句进行分组。
语句块可由不同关键字划分为不同类别,具体含义如下:
- DECLARE:声明部分。
- BEGIN - END:可执行部分(必需)。
- EXCEPTION:异常处理部分。
YashanDB中语句块支持通过使用标签的方式来获取别名,从而使该语句块具有一次性使用的特性,同时语句块也支持嵌套。
# 变量和常量
PL语句块的声明部分允许声明变量和常量,然后在可以使用表达式的任何地方使用它们。
变量和常量的区别在于程序运行时,变量的值可以进行更改,而常量的值不能。
当多个语句块嵌套时,如果发生变量名冲突,缺省情况将以最近一层语句块声明的变量为准。
PL支持如下两种引用变量的使用:
- PL可通过%ROWTYPE类型将声明的变量视为一个RECORD,且该RECORD的成员来自于%ROWTYPE所引用对象的成员。
- PL可通过指定%TYPE类型使变量的数据类型与其他某个变量或列字段的数据类型相同。
# PL数据类型
PL支持使用所有SQL数据类型进行声明,可声明成普通标量,或者声明成数组、OBJECT、NEST TABLE等向量,还支持通过自定义类型,以及类型级联嵌套进行增强。
# 丰富的语句形式
PL语言的控制语句提供以下能力:条件选择语句,可针对不同的数据值运行不同的语句;循环语句,可使用一系列不同的数据值重复相同的语句;顺序控制语句,允许转到指定的、标记的语句。
PL语言的静态SQL、动态SQL,隐式游标属性能力。
PL语言的游标相关语句,以及游标属性能力。
PL支持表达式、运算符、内置函数、内置高级包、伪列等的直接调用能力。
PL的系统异常、自定义异常的声明和使用。
# 丰富的对象形态
将PL语句块单独执行即为匿名块。
支持定义PROCEDURE,并提供给PL语句块执行,不直接返回结果,可以提供出入参。
支持定义自定义函数,包括PL语言的自定义函数、外置JAVA语言的自定义函数和外置C语言的自定义函数。自定义函数可以提供给SQL语言直接调用执行,也可以提供给PL语句块执行,会直接返回结果。
支持定义TRIGGER,目前提供在DML语句执行前后进行语句级或者行级触发。
支持定义自定义高级包,这是一个模式对象,它对逻辑相关的PL类型、变量、常量、存储过程、自定义函数、游标和异常进行分组。包被存储在数据库中,可以被直接访问使用。数据库本身也提供了很多高级包,具体请查询内置高级包章节。
# 异常捕获模块
PL的异常捕获模块主要用于检测和处理错误。
当SQL操作发生错误时,同时会造成PL中出现异常,此时异常捕获模块会检测该错误。