#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语言的基本单元是语句块,它对相关的声明和语句进行分组。

语句块可由不同关键字划分为不同类别,具体含义如下:

  1. DECLARE:声明部分。
  2. BEGIN - END:可执行部分(必需)。
  3. 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中出现异常,此时异常捕获模块会检测该错误。