暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES PLSQL中块结构的介绍

数据猿 2023-12-06
428


关键字

KingbaseES、PLSQL、块结构、人大金仓、KingbaseES

PLSQL块结构概述

和其他大部分的结构化程序语言一样, KingbaseES的PLSQL中最小有意义的代码单元被称为块(block), 一个块就是一组代码,它是PLSQL程序的执行单元,同时也划分了变量声明和异常处理的边界。PLSQL中的块结构包含命名块和匿名块,一个块结构最多由以下4个部分构成:

头部: 仅存在于命名块中,头部用于定义此命名块的调用方式。

声明部分: 一般以关键字“DECLARE”开头,用于声明块内使用的变量、游标、异常、嵌套函数和用户自定义类型等PLSQL的内部对象。

执行部分:包含在“BEGIN…END”块之间,内部可以是赋值语句、条件语句、循环语句、返回语句、打印语句、游标操作、事务语句、批量处理、静态SQL、动态SQL和新的块结构等PLSQL语句。这些语句是程序运行时将要具体执行的部分。

异常处理部分:也包含在“BEGIN…END”块之间,在执行部分的后面,以关键字“EXCEPTION”开头, 对程序在运行时出现的异常情况进行处理。

其中,执行部分在块结构中是必须存在的,其他3部分都是可选的,可以省略掉。图1显示了一个完整块结构的组成部分。

图 1 PLSQL块结构的组成部分

命名块

具有头部的块结构被称为命名块,它为整个块结构起了名字,这样它就可以被其他的语句调用。命名块的头部一般以关键字”PROCEDURE”或者”FUNCTION”开始,分别表示具有“存储过程”或“函数”属性的命名块,但是不同于真正创建的存储过程或函数,命名块只能在匿名块、存储过程和函数的声明区出现,不能单独作为一段程序去执行。图2显示了命名块在存储过程中的使用案例。从案例中可以看出,命名块可以像函数或存储过程那样被其他的语句来调用。

匿名块

在武侠剧中经常看到有人想要隐姓埋名,被当作无名氏。同样,在PLSQL中也有匿名块,匿名块没有头部,直接以关键字“DECLARE”或“ BEGIN”开始。这样的话,因为它没有一个被引用的句柄,所以它不能被其他的语句所调用。但是,它可以作为一个代码块被

图 2 命名块在存储过程中的使用

单独执行。匿名块中的代码是临时的,它被执行过以后内部的变量和任何执行语句都会消亡,不像存储过程或函数一样可以被反复调用,不过我们可以在存储过程或函数中定义一个或多个匿名块。图3展示了匿名块被单独执行的简单案例。从图中的示例可以看出,匿名块可以省去块结构中的头部、声明部分和异常处理部分而只留执行部分。

图 3 只有执行部分的匿名块

嵌套块

在PLSQL中,块结构可以嵌套到其他的块中,并且KingbaseES支持块的多层嵌套。从严格意义上来说,嵌套块跟命名块和匿名块不属于同一个层级,它并不是逻辑上具有独立意义的块结构,可以将嵌套块看作块结构中执行部分包含的一条普通语句,从逻辑功能上来划分的话,嵌套块不是匿名块,就是命名块。图4展示了块结构嵌套了两层深度的使用案例。从图中可以看出,无论是命名块还是匿名块都可以像普通语句那样嵌套在其他的块中。匿名块可以有它自己的声明和异常处理部分,因此可以在一个大的程序中嵌套一些匿名块以提供一系列的标识符和异常处理。

图 4 嵌套块的使用

作用范围和可见性

PLSQL中的变量、异常和一些其他的结构都只属于声明它们的块内部,当块运行结束

图 5 标识符的作用范围示例

后,这些元素都无法被再次引用。在内部块中声明的变量对外部块是不可见的。而函数和存储过程可以在创建它们的整个模式中都可以被反复调用。也就是说,变量、异常和其他结构的生命周期要小于函数和存储过程的生命周期。通过图5的示例可以清晰地看出各个标识符的作用范围之间的差异。该示例中的标识符“actScope”可以在创建该存储过程的整个模式中被识别,用来调用对应的存储过程,如示例中的“CALL actScope(3)”,存储过程的参数“a”的作用范围是整个存储过程,每个嵌套块内的变量“a”的作用范围只在声明它的块内部。如果每个标识符“a”在其作用范围内定义的嵌套块里面有同名的变量,在使用这些变量时遵循“就近原则”:总是匹配最近的那个变量。因此调用该存储过程后,依次打印出“a”的值为1、2、3。

那么,在图5的示例中程序如果想要在嵌套块的内部调用它外部的同名变量a,是否可以实现呢?要回答这个问题,就会涉及到标识符的可见性,可见性是指我们是否可以仅通过名字引用一个变量,还是需要在名字前面加上一个前缀。在图5的示例中,我们可以在匿名块前面加上标签,然后以这个标签为前缀,就可以在嵌套块内引用外层的同名变量。从图6的示例中可以看出,可以使用标签作为前缀来引用该标签对应区域的变量。

图 6 使用标签引用嵌套块外层的同名变量

参考资料

《KingbaseES PLSQL过程语言参考手册》

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论