数据库管理-第六十六期 SQL Domain(20230413)

news2024/11/16 17:37:20

数据库管理 2023-04-13

  • 第六十六期 SQL Domain
    • 1 基本介绍
    • 2 Domain的表达式和条件
    • 3 语法
    • 4 语义
    • 5 示例
    • 总结

第六十六期 SQL Domain

上一期一笔带过了部分Oracle 23c的新特性,这一期重点讲一下SQL Domain新特性。
【https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html】

1 基本介绍

SQL Domain是一个属于SCHEMA的高级字典对象,包含一组可选的属性和约束。可以将表中的列与Domain进行关联,从而显示的将Domain包含的可选属性和约束应用到这些列中。一个Domain至少必须指定一个Oracle内建的数据类型。Domain的数据类型必须是单个的Oracle数据库类型。对于字符数据类型,必须指定一个最大长度,即是VARCHAR2(L [CHAR|BYTE]), NVARCHAR2(L), CHAR(L [CHAR|BYTE]), or NCHAR(L)中的一个。

2 Domain的表达式和条件

Domain的表达式可以简单的、日期时间、时间间隔,CASE、复合或者domain列表表达式之一:

  • 简单的domain表达式可以是字符串、数字、 sequence.CURRVAL、 sequence.NEXTVAL、NULL或者SCHEMA Domain。它类似于简单表达式,只不过使用domain名称而不是列名。它将域名引用为限定名称、Oracle内置的Domain名或者使用一个Domain的公有同义词。
  • 日期时间Domain表达式仅引用域表达式的日期时间表达式。
  • 时间间隔表达式仅仅被定义为正则区间表达式,只是它引用了domain表达式。例如, (SYSTIMESTAMP - DayOfWeek) DAY(9) TO SECOND 是一个时间间隔表达式。
  • 符合表达式是(expr), expr op expr with op +, -, *, /, ||, or expr排序collation_name,其中expr是一个domain表达式。
'email: ' || EmailAddress
DayOfWeek + INTERVAL '1' DAY
TO_CHAR(LastFour(SSN))
  • CASE domain表达式与正则case表达式类似,只是它仅引用domain表达式。
CASE WHEN TO_UPPER(DOMAIN_DISPLAY(DayOfWeek)) != 'SAT' 
    AND TO_UPER(DOMAIN_DISPLAY(DayOfWeek)) != 'SUN' 
    THEN 'week day' ELSE 'weekend' END 
  • 与SQL Domain表达式的定义类似,Domain条件就像正则SQL条件一样,只是它只引用Domain表达式。您可以在Domain表达式中使用关键字值,而不是使用Domain名称。
CREATE DOMAIN DayOfWeek AS CHAR(3 CHAR)
CONSTRAINT
CHECK DayOfWeek_C (UPPER(Substr(VALUE, 1, 3)) IN ('MON', 'WED', 'FRI', 'SAT', 'SUN') or
                                          UPPER(Substr(VALUE, 1, 2)) IN ('TU', 'TH')) 
DEFERRRABLE INITIALLY DEFERRED
COLLATE BINARY_CI
DISPLAY SUBSTR(VALUE, 1, 3);

3 语法

create_domain::=
在这里插入图片描述
create_single_column_domain::=
在这里插入图片描述
column_properties_clause::=
在这里插入图片描述
create_multi_column_domain::=
在这里插入图片描述
create_flexible_domain::=
在这里插入图片描述
result_expr::=
在这里插入图片描述
default_clause::=
在这里插入图片描述
constraint_clause::=
在这里插入图片描述
annotations_clause::=
在这里插入图片描述

4 语义

  • IF NOT EXISTS

    • 如果domain不存在则创建新的domain
    • 如果domain存在则不会创建新的domain

    如果使用IF EXISTS则会报错:Incorrect IF NOT EXISTS clause for CREATE statement。

  • domain_name
    domain_name遵循与任何类型名称相同的限制,并且不能与domain schema中的任何对象的名称、任何Oracle提供的数据类型以及任何Oracle提供的domain名称发生冲突。
    这些限制适用于CDB环境中的PDB级别。
    请注意,域是schema的catalog对象,因此受schema级别对象的限制。

  • datatype
    datatype必须是Oracle内建的数据类型:

    • CHAR(L [CHAR|BYTE]), NCHAR(L), VARCHAR(L [CHAR|BYTE]), VARCHAR2(L [CHAR|BYTE]), NVARCHAR2(L), LONG
    • NUMBER[p, [s]], FLOAT, BINARY_FLOAT, BINARY_DOUBLE
    • RAW, LONG RAW (extended included)
    • DATE, TIMESTAMP (WITH (LOCAL) TIME ZONE), INTERVAL
    • BFILE, BLOB, CLOB, NCLOB
    • JSON native datatype
    • BOOLEAN
  • default_expression
    default_expression必须是一个域表达式,并且必须符合给定数据类型的默认列表达式的所有限制:

    • default_expression不能包含返回域引用或嵌套函数调用的SQL函数,它不能是子查询表达式。
    • default_expression的数据类型必须于domain指定的数据类型匹配。
    • 作为domain的表达式,default_expression不能引用任何表或列以及任何其他domain名。
    • default_expression可以指一个序列的NEXTVAL和CURRVAL。不能引用PL/SQL函数。
  • constraint_clause
    请注意,domain约束可以有可选的名称。它们NOT NULL、NULL或CHECK约束。可以在列级别和domain级别上同时指定多个这样的约束子句。
    CHECK条件以及ALTER DOMAIN中的检查条件和表达式只能引用domain的列。如果domain有单个列,则列名是domain名或关键字VALUE,但相同的表达式不能同时包含domain名和VALUE作为列名。
    constraint_name是可选。当指定时,它不能与schema中的任何其他约束的名称发生冲突(如果在CDB环境中,则在给定的PDB中)。当未指定时,将使用系统生成的名称。domain约束遵循与表级约束和列级约束相同的规则:一个已命名的表或列级约束不能与同一schema中的任何其他约束的名称相一致。即使是在相同的schema中,domain约束可以与表名相同。它们可以与列名相同,并且约束可以与它在上面定义的表或列使用相同的名称。
    CHECK条件必须是一个domain的逻辑条件,同时必须符合对转换为domain表达式的检查约束的所有限制:

    • 它只能引用domain名,就像列上的检查约束只能引用列一样。它不能引用任何表或视图中的任何列,甚至在domain schema中也不能。
    • 不能使用子查询或标量查询表达式。
    • 条件不能引用非确定性函数(如CURRENT_DATE),或用户定义的PL/SQL函数。
    • 允许CHECK IS JSON(STRICT)约束。
    • CHECK约束条件一次应用于一个值,如果值替换为domain_name的CHECK条件计算结果为TRUE或UNKNOWN,则满足该条件。

    Domain约束可以按任意顺序强制执行。
    NULL约束意味着允许domain的值为NULL,并且是默认值。
    如果未指定constraint_state,则约束为NOT DEFERABLE INITIALLY IMMEDIATE。

  • COLLATE
    当指定排序规则时,它符合列级别或SCHEMA级别排序规则的所有限制。如果指定了排序规则,数据类型必须是字符数据类型。
    当创建一个表,其中的列标记为一个排序规则不同于该列的排序规则的domain时,将引发错误。
    将列更改为具有与列domain的排序规则不同的排序规则时,将引发错误。
    这应该确保具有指定排序规则的域的所有列具有与其域相同的排序规则的不变性。如果未指定排序规则且数据类型是可排序的,则将使用列的排序规则(如果已指定),否则将使用域模式中的基础默认数据类型排序规则。
    如果未指定排序规则且数据类型是可排序的,则将使用列的排序规则(如果已指定)。

  • display_expression
    使用 display_expression 根据domain规范格式化数据。它可以是任何允许作为domain数据类型的数据类型。 display_expression 必须是不包含表或视图列、子查询、非确定性函数或 PL/SQL 函数的域表达式。它可以引用 domain_name。如果您没有为表达式指定排序规则,则 display_expression 将使用domain的排序规则(如果已指定)。

  • order_expression
    使用 order_expression 对domain规范的值进行排序和比较。
    order_expression 必须符合与 display_expressions 相同的限制,并且还必须是字节或字符可比较数据类型。如果为表达式的domain指定了order_expression,则返回的有domain_nameorder_expression而不是表达式,否则返回表达式。

  • annotations_clause
    annotation_name是一个最多可以包含4000个字符的标识符。如果注释名称是保留字,则必须用双引号提供。当使用双引号标识符时,该标识符还可以包含空白字符。但是,不接受仅包含空白字符的标识符。
    有关annotations_clause的示例,请参见末尾的示例。
    有关annotations子句的完整语义,请参阅CREATE TABLE的annotations_clause。

  • FROM Clause of Create Flexible Domain
    expr和comparison_expr引用了domain_disperiment_column列表中的domain判别列。
    灵活东面的FROM子句是DECODE或CASE表达式,它只引用搜索表达式中的判别式列名(在CHOOSE DOMIAN USING后面的列表中),并且在结果表达式中只有domain名后面跟着列列表。结果表达式中的列必须仅为东面列列表中的列(在CREATE FLEXILE DOMAIN之后)。

5 示例

从CREATE TABLE章节中找到了建表是SQL DOMAIN的使用方法。

CREATE TABLE [owner.]name 
 (   colname [DOMAIN][domain_owner.]domain_name [<column_def_clause>] 
  [, colname [DOMAIN] [domain_owner.]domain_name [<column_def_clause>]])

CREATE TABLE [owner.]name (column_list_def_clause 
    [, DOMAIN  [domain_owner.]domain_name (column_name_list)])

首先在尝试创建domain时,报了个错:

ORA-43929: Collation cannot be specified if parameter MAX_STRING_SIZE=STANDARD is set

需要MAX_STRING_SIZE=EXTENDED,详情建四十七期。

  • 示例1
    在这里插入图片描述在这里插入图片描述
    这里domain dn1是数字类型;domain dn2两个值均为数字类型,第一个不能为空,第二个默认为1;domain dm1包含四个值:两个值均为数字类型,第一个不能为空,第二个不能为空切必须大于0,第三个为默认值为abc的长度为10的varhar2类型,第四个值也为数字仅为空值时插入默认0,同时要求前两个值相加小于等于100,同时第三个值长度大于第二个数值。
    对应的tm1表,c1-c4满足domain dm1,c5-c6满足domain dn2,c7满足domain dn1。
    下面我们来尝试插入数据:
    在这里插入图片描述
    这里c4因为插入为NULL所以值为10,c6获取默认值1。
    在这里插入图片描述
    这里插入的c2为20,而c3默认值abc长度为3,不满足大于c2的条件,因此插入失败。
    在这里插入图片描述
    将上一条语句c3改为2即可成功插入。
    在这里插入图片描述
    这里又因为c1+c2>100,不满足domain dm1。
    在这里插入图片描述
    这里c1插入的不是数字类型(domain dm1)。
    在这里插入图片描述
    这里c5不能为空(domain tm1)。
  • 示例2
    在这里插入图片描述
    在这里插入图片描述
    创建表tm2,遵循domain email限制,插入空值时拼接序列t_seq.NEXTVAL和字符串‘gmail’,插入内容必须包含@和. 且@不在首位。
    在这里插入图片描述
    插入空值时,自动填充。
    在这里插入图片描述正确格式的邮箱地址能正确插入。
    在这里插入图片描述
    错误格式的邮箱地址就无法插入。
    在这里插入图片描述
    使用domain_display还可以通过domain email对数据显示进行脱敏。

总结

SQL Domain还有很多功能,继续探索中。
老规矩,知道写了些啥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【提升效率神器】Python简单批量生成PDF文档(详细做法)

文章目录前言一、准备二、基本使用三、批量生成PDF总结前言 日常办公中&#xff0c;经常会使用PDF文档&#xff0c;难免需要对PDF文档进行编辑&#xff0c;有时候PDF文档中的大部分内容都是一样的&#xff0c;只是发送对象不同。 这种模板套用的场景下&#xff0c;使用Python…

BI 知识大全,值得收藏的干货

01、什么是商业智能BI&#xff1f; 商业智能BI可以实现业务流程和业务数据的规范化、流程化、标准化&#xff0c;打通ERP、OA、CRM等不同业务信息系统&#xff0c;整合归纳企业数据&#xff0c;利用数据可视化满足企业不同人群对数据查询、分析和探索的需求&#xff0c;从而为…

OpenCV实例(三)答题卡识别

OpenCV实例&#xff08;三&#xff09;答题卡识别1.答题卡识别概述2.单道题目的识别2.1基本流程及原理2.2代码实例&#xff1a;作者&#xff1a;Xiou 1.答题卡识别概述 随着信息化的发展&#xff0c;计算机阅卷已经成为一种常规操作。在大型考试中&#xff0c;客观题基本不再…

重整网站。。。。。。。。。

重整网站 写好回复的人 “ xxxxxxxx”通知栏&#xff0c;并且快速跳转到需要的页面。个人页面&#xff0c;记录自己发送的消息与回复的信息。以css 上传的图片防止被拉伸拉坏。 下拉的选择下拉的分页的好处。 评论功能的那一栏中的一个小的评论&#xff0c;如果手机端的话&a…

RabbitMQ 保证消息不丢失的几种手段

文章目录1.RabbitMQ消息丢失的三种情况2.RabbitMQ消息丢失解决方案2.1 针对生产者2.1.1 方案1 &#xff1a;开启RabbitMQ事务2.1.2 方案2&#xff1a;使用confirm机制2.2 Exchange路由到队列失败2.3 RabbitMq自身问题导致的消息丢失问题解决方案2.3.1 消息持久化2.3.2 设置集群…

无废话硬核分享:Linux 基础知识点总结很详细,全的很,吐血奉献

Linux 的学习对于一个程序员的重要性是不言而喻的。前端开发相比后端开发&#xff0c;接触 Linux 机会相对较少&#xff0c;因此往往容易忽视它。但是学好它却是程序员必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS&#xff0c;是软件的一部分&#x…

【0基础学爬虫】爬虫基础之数据存储

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

物联网时代的网络安全

近年来&#xff0c;物联网 (IoT) 彻底改变了我们的生活和工作方式。从智能家居到自动驾驶汽车&#xff0c;物联网设备在我们的日常生活中变得越来越普遍。 根据 Statista 的一份报告&#xff0c;到 2025 年将有超过 750 亿个物联网 (IoT) 设备投入使用。 然而&#xff0c;这…

c++之STl容器-string

目录 容器的分类 string string的概念 string的初始化 string的遍历 string的一些基本操作 char*类型和string类型互转 字符串的连接 字符串的查找和替换 string的截断和删除 容器的分类 在实际的开发过程中&#xff0c;数据结构本身的重要性不会逊于操作于数据结构的算…

SpringMVC03-文件上传、异常处理、拦截器

SpringMVC03 SpringMVC的文件上传 一 、文件上传的前端必要前提 form 表单的 entcype取值必须是&#xff1a;multipart/form-data。默认值&#xff1a;application/x-www-form-urlencoded&#xff0c;是表单请求正文的类型method 属性取值必须是 post提供一个文件选择域 二…

利用ChatGPT,一分钟制作思维导图

大家好&#xff0c;我是易安&#xff01; 今天我来教你如何使用ChatGPT&#xff0c;一分钟制作出一份思维导图 大纲选题 想到一个课题&#xff0c;然后人工梳理出内容大纲&#xff0c;是个挺费精力的事情。但利用ChatGPT来做这件事. 5秒就可以搞定啦&#xff01; 例如&#xf…

Python安全攻防之第二章Python语言基础

2.3 Python模块的安装与使用python模块的安装pip3 install 模块名称py -3 -m pip install 模块名称python模块的导入与使用&#xff08;1&#xff09;Import模块名称采用“Import模块名称”方式时&#xff0c;需要在对象前面加上模块名称作为前缀&#xff0c;具体形式为“模块名…

Nextcloud去掉URL中的index.php以及强制https(Win10子系统WSL)

一、Nextcloud去掉URL中的index.php 1、启用相关模块 cd /var/www/nextcloud #进入程序目录sudo chmod -R 777 .htaccess #设置.htaccess文件权限可读写sudo a2enmod envaudo a2enmod rewrite #启用rewrite模块2、修改nextcloud配置文件 vim /var/www/nextcloud/config/…

Redis数据备份与恢复

Redis数据备份与恢复 文章目录Redis数据备份与恢复1. Redis备份的方式2. RDB持久化2.1 什么是RDB&#xff1f;2.2 Fork操作2.3 save VS bgsave2.4 关于RDB备份的一些配置项2.5 RDB的备份与恢复2.6 RDB的自动触发2.7 RDB的优势与劣势3. AOF持久化3.1 什么是AOF&#xff1f;3.2 A…

hypothesis testing假设检验

假设检验是什么 比如一家巧克力工厂生产的巧克力每个1g&#xff0c;一个工人说&#xff0c;机器在维修之后生产的巧克力不是1g&#xff0c;为了验证工人说的是否正确&#xff0c;需进行假设检验。 随机挑选50个巧克力&#xff0c;计算平均重量。 H0&#xff1a;每个巧克力1g H…

Seatunnel-2.3.0源码解析

一、概述 SeaTunnel是一个简单易用的数据集成框架&#xff0c;在企业中&#xff0c;由于开发时间或开发部门不通用&#xff0c;往往有多个异构的、运行在不同的软硬件平台上的信息系统同时运行。数据集成是把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中&#x…

Spring学习笔记(二)【CGLIB浅拷贝BeanCopier的使用和详解】

CGLIB浅拷贝BeanCopier的使用和详解 一、bean拷贝工具 bean拷贝工具类比较 常用的bean拷贝工具类当中&#xff0c;主要有Apache提供的beanUtils、Spring提供的beanUtils、Cglib提供的beanCopier&#xff0c;性能上分析如下表所示&#xff08;该表来自网上的数据&#xff09; …

探索Apache Hudi核心概念 (3) - Compaction

Compaction是MOR表的一项核心机制&#xff0c;Hudi利用Compaction将MOR表产生的Log File合并到新的Base File中。本文我们会通过Notebook介绍并演示Compaction的运行机制&#xff0c;帮助您理解其工作原理和相关配置。 1. 运行 Notebook 本文使用的Notebook是&#xff1a;《A…

此战成硕,我成功上岸西南交通大学了~~~

友友们&#xff0c;好久不见&#xff0c;很长时间没有更一个正式点的文章了&#xff01; 是因为我在去年年底忙着准备初试&#xff0c;今年年初在准备复试&#xff0c;直到3月底拟录取后&#xff0c;终于可以写下这篇上岸贴&#xff0c;和大家分享一下考研至上岸的一个过程 文章…

springboot+thymeleaf实现发Html邮件自由

2019年&#xff0c;我刚接触测试架构和测试开发类的工作时&#xff0c;经常会有自动化发邮件的功能&#xff0c;大都是从各个平台自动化统计一些数据出来&#xff0c;每周定时发一封邮件给领导交差&#xff0c;回过头来再看看我发的邮件&#xff0c;不美观&#xff0c;不专业。…