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

15天前 24.3k 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);

运行结果:

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

但是这种方式不允许携带默认值,我们可以尝试附加一下默认值,测试一下

CREATE TYPE sample_type AS OBJECT
(
field1 varchar2(20) := 'Hello',
field2 varchar2(20) := 'World'
);

运行结果:

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

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

1.2、TYPE record_name IS RECORD field_definition

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

语法图如下所示:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

调用该存储过程

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

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

是,可以的!

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

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

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

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

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

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

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

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

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

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

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

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

如下图所示:

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

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

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

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

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

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

五、声明

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

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

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

细心的朋友们可能注意到了,我的版本是羲和(Halo)16版本,其实我的是内部的开发版本,而真正的16版本其实还未推出,

不过我们预计这个月底、下个月初推出羲和(Halo)16(Technical Preview)版本,敬请期待。

如想体验本文中的功能,后续14版本或者也可以到时候16版本见。

欢迎大家加入羲和(Halo)产品吐槽群。

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

相关文章

最新发布!MySQL 9.0 的向量 (VECTOR) 类型文档更新
国产数据库中级认证HCIP-openGauss经验分享
保障数据完整性与稳定性:数据库一致性
OceanBase 里的 DDL 超时时间
OceanBase v3.1.x 将不再更新版本 | 社区月报2024.6
openGauss Developer Day 2024 | SIG组工作会议亮点回看!

发布评论