首页 > 数据库 > 国内数据库 > Oracle"特色"——自定义带默认值的复合类型
本文为新专栏《那些让人感到"匪夷所思"或者说是让人摸不着头脑的Oracle"特色"设计》 第二篇文章,
旨在分享和吐槽,作为羲和(Halo)数据库内核研发在实现Oracle兼容的时候,碰见过的奇奇怪怪的Oracle"特色"。
今天的主题是《 Oracle"特色"——自定义带默认值的复合类型 》。
今天的这个主题就很显而易见了,这个我觉得怪怪的想要进行分享的原因是:
你甚至可以在Oracle数据库内部定义出带默认值的复合类型!!!主要其实也是我玩PG玩多了,没瞅见过自带默认值的复合类型。当然也有还是太年轻的缘故(笑)。
我们先来简单了解一下,在Oracle中如何创建复合类型。
第一种就是比较常见的 CREATE TYPE type_name AS OBJECT object_type_def;
如下示例:
CREATE TYPE demo_typ1 AS OBJECT (a1 NUMBER, a2 NUMBER);
运行结果:
但是这种方式不允许携带默认值,我们可以尝试附加一下默认值,测试一下
CREATE TYPE sample_type AS OBJECT ( field1 varchar2(20) := 'Hello', field2 varchar2(20) := 'World' );
运行结果:
那么那种方法支持创建带默认值的复合类型呢?
那就是第二种方式, TYPE record_name IS RECORD field_definition ;
语法图如下所示:
从 field_definition 中不难看出,它就是支持在定义的时候附加默认值,是可选项。
所以第一种方法能做到它也能,第一种方法做不到的它也能。
比如说定义复合类型并使用
比如说自定义带默认值的复合类型并使用
可能还有别的方式可以定义Oracle中的复合类型哈,各位感兴趣可以再研究研究。
至此,我们便看到了一个具有默认值的复合类型的存在,接下来我们在简单聊一聊像这种带默认值的复合类型的"生命周期"。
没错!像这种带默认值的复合类型其实是存在"生命周期"的。
而这个"生命周期"主要取决于是在哪种场景下使用。
如果是在函数/存储过程/匿名块中使用,那么此复合类型的生命周期大概就是整个函数体,出了函数体作用域就不再存在,就像一个临时的数据类型。
如果是在Package中使用,那么此复合类型便可以向系统类型一样,被广泛使用,而这个时候的生命周期就取决于Package何时被删除。
CREATE PACKAGE 声明一个带默认值的复合类型、同时声明一个名为protest存储过程
CREATE PACKAGE BODY实现protest存储过程,定义一个复合类型带默认值的变量,然后直接打印变量值
调用该存储过程
那么此Package定义的类型还能在别处被使用吗?
是,可以的!
比如说在匿名块中使用package定义的类型(函数存储过程同理)
当且仅当Package被删除之后,该类型生命周期结束。
这个其实在1.2小结就演示过了,此处用一下1.2小节的测试图片。该测试案例实在匿名块中所使用的,函数/存储过程同理。
当执行结束之后,该类型的生命周期便结束了,之后就不能再被使用,除非重新定义。
虽然测试案例非常简单,但是指不定有Oracle的"老玩家",把这个玩出花来,这也是我为什么选择最后输出" Hello World "的原因。
我不信哪位同学的第一版程序不是"Hello World",如果不是,那就叉出去!
讲了这么多,该秀的时候还是要秀一下的,不秀的话,那我岂不是白做了(加个表情)。
如下图所示:
比如说在匿名块中使用此package定义的类型(函数存储过程同理)
可以看到的是,羲和(Halo)数据库在这方面的表现和Oracle的完全吻合!
本文为此系列第二篇,如想看到对Oracle功能的吐槽,敬请期待。
若文中存在错误或不当之处,敬请指出,以便我进行修正和完善。希望这篇文章能够帮助到各位。
文章转载请联系,谢谢合作。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70036312/viewspace-3020566/ ,如需转载,请注明出处,否则将追究法律责任。