#PL引擎
PL引擎为用户提供了过程化语言编程的平台,基于SQL语言扩展过程化能力,包括条件分支、循环,并实现了自定义的过程、函数等,提供了强大的编程能力。
PL的主要优势有:
提升性能,当应用处理逻辑靠近数据后,能极大减少客户端和服务端的交互次数,显著降低执行的响应时间。
提升开发效率,应用开发时,可以把数据处理的逻辑封装成高内聚低耦合的存储过程或函数接口,共享给多个模块使用。
易于调优,随着数据量的增长,数据库的性能问题会逐步浮现甚至突然爆发,如果数据访问处理相关的逻辑都在存储过程中实现,DBA能较快识别问题并通过优化PL代码立即干预。
# 过程体
过程体是过程化语言的最主要载体,当前支持的过程体类型包括:
匿名块
匿名块是数据库里的一种特殊的PL对象,不会被持久化,创建后立即运行。它没有对象名字,不能直接按对象名调用。
存储过程
存储过程是PL语言按过程进行组织的数据库对象形式,类似Pascal(结构化编程语言)中的过程。
自定义函数
自定义函数是PL语言按函数进行组织的数据库对象形式,简称UDF,类似Pascal(结构化编程语言)中的函数。自定义函数包括PL语言的自定义函数、外置JAVA语言的自定义函数和外置C语言的自定义函数。
触发器
触发器(TRIGGER)是数据库里的一种PL对象。创建一个触发器即创建了一个可执行的过程体,但触发器过程体不可以被用户显式调用,只能由一个事件来启动运行,当某个事件发生时触发器会自动隐式运行。
自定义高级包
自定义高级包是数据库里的一种PL对象,简称UDP。自定义高级包是一组相关的过程、函数、变量、游标和类型等的集合。
自定义类型
自定义类型(UDT,User Defined Type),相对于数据库内置的类型而言,是由用户定义的数据类型,用于将现实世界的实体建模为数据库中的对象。UDT与面向对象的编程思想类似,UDT包含一组属性和方法,用户可以基于数据库内置的基本类型和其他UDT类型创建新的UDT。
定时任务
定时任务(JOB)是一个根据时间定时触发执行的后台任务。一个定时任务包含如下三个基本要素:JOB唯一标识、JOB需要执行的任务、JOB执行时间及频率。基于这三个要素,提供一系列PL语言的过程实现对一个JOB的直接操作管理。
# 编译与执行
PL的使用包括编译和执行两个阶段:
编译阶段:将客户端发送的PL文本进行词法分析、语法分析得到语义,然后进行基本的合法性校验以及一些必要的优化,此外PL中的SQL语句部分还需要调用SQL引擎的接口进行解析、校验和优化,最终得到可执行的PL对象,并缓存在PL池(匿名块例外,匿名块会缓存在SQL池)。
执行阶段:在执行阶段,如果在PL池命中发现可执行的PL对象,将直接执行该对象并返回结果。