ITPub博客

首页 > 数据库 > 国内数据库 > Oracle"特色"——自定义带默认值的复合类型

Oracle"特色"——自定义带默认值的复合类型

原创 国内数据库 作者:小满未满_ 时间:2024-06-28 15:19:26 0 删除 编辑

本文为新专栏《那些让人感到"匪夷所思"或者说是让人摸不着头脑的Oracle"特色"设计》 第二篇文章,

旨在分享和吐槽,作为羲和(Halo)数据库内核研发在实现Oracle兼容的时候,碰见过的奇奇怪怪的Oracle"特色"。

今天的主题是《 Oracle"特色"——自定义带默认值的复合类型 》。

今天的这个主题就很显而易见了,这个我觉得怪怪的想要进行分享的原因是:

你甚至可以在Oracle数据库内部定义出带默认值的复合类型!!!主要其实也是我玩PG玩多了,没瞅见过自带默认值的复合类型。当然也有还是太年轻的缘故(笑)。

我们先来简单了解一下,在Oracle中如何创建复合类型。


一、Oracle如何创建复合类型

1.1、 CREATE TYPE type_name  AS OBJECT  object_type_def

第一种就是比较常见的 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' );

运行结果:


那么那种方法支持创建带默认值的复合类型呢?


1.2、 TYPE record_name IS RECORD field_definition

那就是第二种方式, TYPE record_name IS RECORD  field_definition ; 

语法图如下所示:


从 field_definition 中不难看出,它就是支持在定义的时候附加默认值,是可选项。

所以第一种方法能做到它也能,第一种方法做不到的它也能。

比如说定义复合类型并使用


比如说自定义带默认值的复合类型并使用


可能还有别的方式可以定义Oracle中的复合类型哈,各位感兴趣可以再研究研究。

至此,我们便看到了一个具有默认值的复合类型的存在,接下来我们在简单聊一聊像这种带默认值的复合类型的"生命周期"。


二、带默认值的复合类型的"生命周期"

没错!像这种带默认值的复合类型其实是存在"生命周期"的。

而这个"生命周期"主要取决于是在哪种场景下使用。

如果是在函数/存储过程/匿名块中使用,那么此复合类型的生命周期大概就是整个函数体,出了函数体作用域就不再存在,就像一个临时的数据类型。

如果是在Package中使用,那么此复合类型便可以向系统类型一样,被广泛使用,而这个时候的生命周期就取决于Package何时被删除。

2.1、在Package中声明定义并使用

CREATE PACKAGE 声明一个带默认值的复合类型、同时声明一个名为protest存储过程


CREATE  PACKAGE  BODY实现protest存储过程,定义一个复合类型带默认值的变量,然后直接打印变量值


调用该存储过程


那么此Package定义的类型还能在别处被使用吗?

是,可以的!

比如说在匿名块中使用package定义的类型(函数存储过程同理)


当且仅当Package被删除之后,该类型生命周期结束。


2.2、在函数/存储过程/匿名块中声明定义并使用

这个其实在1.2小结就演示过了,此处用一下1.2小节的测试图片。该测试案例实在匿名块中所使用的,函数/存储过程同理。


当执行结束之后,该类型的生命周期便结束了,之后就不能再被使用,除非重新定义。

虽然测试案例非常简单,但是指不定有Oracle的"老玩家",把这个玩出花来,这也是我为什么选择最后输出" Hello World "的原因。

我不信哪位同学的第一版程序不是"Hello World",如果不是,那就叉出去!


三、羲和(Halo)数据库在这方面的表现

讲了这么多,该秀的时候还是要秀一下的,不秀的话,那我岂不是白做了(加个表情)。

3.1、在Package中被声明定义并使用

如下图所示:

    

比如说在匿名块中使用此package定义的类型(函数存储过程同理)


3.2、在函数/存储过程/匿名块中声明定义并使用


可以看到的是,羲和(Halo)数据库在这方面的表现和Oracle的完全吻合!


五、声明

本文为此系列第二篇,如想看到对Oracle功能的吐槽,敬请期待。

若文中存在错误或不当之处,敬请指出,以便我进行修正和完善。希望这篇文章能够帮助到各位。

文章转载请联系,谢谢合作。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70036312/viewspace-3020566/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
postgres爱好者、openHalo维护者、MonetDB_fdw作者、pg_duckdb、IvorySQL等等诸多开源项目贡献者,个人公众号「包里装着个卡比兽」。不忙的时候会写点文章分享在技术方面的见解。

注册时间:2024-01-02

  • 博文量
    22
  • 访问量
    18444