网站安全维护公司,浙江建设职业技术学院迎新网站,wordpress增强编辑器,装潢设计是什么包的SPEC区可以定义下面三种类型#xff08;本篇只讨论SPEC区的情况#xff09;
变量类型#xff08;nested table等#xff09;#xff08;注意这是包内定义的类型#xff0c;与SQL创建的不通#xff09;游标
这三种类型在PG原生中#xff0c;是找不到相似的功能的本篇只讨论SPEC区的情况
变量类型nested table等注意这是包内定义的类型与SQL创建的不通游标
这三种类型在PG原生中是找不到相似的功能的
变量变量需要能够作用于所有PL代码中PG中没有全局变量的这种概念又因为PL的插件式设计和SQL层解耦PL变量就算给SQL使用一般也只能用回调PL的datums拼SQL的params。类型这里的类型特指嵌套表、动态数组、关联数组。PG的类型全部放在pg_types中不能在PL层创建。游标PG原生支持SQL层在事务内使用declare/fetch语法定义SQL层游标但必须在事务块内PG也支持在PL函数内定义游标但能再当前函数内使用不能跨函数。
三种类型有着不同的作用域
SQL层PL层变量用于函数默认值可当做全局变量随意使用类型无可当做基础类型随意使用游标无只能在定义包内使用可跨函数使用
三种类型在PG中的实现方法
变量 每个包应该有自己的符号表命名空间可以由namespace.pkgname唯一指定到某一个符号表进行搜索。 这里IvorySQL使用pg_variable系统表来保存变量、游标没实现集合类型但不会存值包变量本来就是session级的按理说不需落盘推测主要是用索引加速查找。OpenGauss的实现类似于内存中维护各个包的符号表使用时先搜索函数自己的符号表再去搜索包的符号表。全内存态没落盘确实没必要落盘。 实现时可根据pkgname先编译包并生成包的符号表SQL层可回调使用包变量PL层可直接使用包变量。在PL层使用时例如 a : pkg.g_var;在PL parse时对二段解析增加搜索包命名空间的逻辑即可不要发生deep copy将包的datums拷贝到自己的datums中这样的话会变得非常复杂执行完还要拷贝回包空间中。 类型分三类讨论 嵌套表、动态数组 20230410是现在内存中加一些旁路逻辑增加类型的搜索范围。20231008功能等价于数组从生命周期上来看包SPEC的类型和包的生命周期一致从作用域来看和pg_type中的类型范围有区别例如SPEC的类型不能用于表字段但能用于函数入参返回值BODY中定义的PRIV的类型只能用于当前包。实现时可与SQL层的CREATE NESTED TABLE统一逻辑做成标准类型记录在pg_type中在增加字段表示作用域可最大化复用PG原生逻辑。 关联数组功能等价与哈希表高斯实现了类似于指针数组的功能避免了PG多维数组的维度锁死的问题第一次使用定义维度后面无法修改实现较为合理《分析openGauss包内集合类型的实现方法》IvorySQL没实现。