当前位置: 首页 > news >正文

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

数据库管理 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') orUPPER(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还有很多功能,继续探索中。
老规矩,知道写了些啥。

相关文章:

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

数据库管理 2023-04-13第六十六期 SQL Domain1 基本介绍2 Domain的表达式和条件3 语法4 语义5 示例总结第六十六期 SQL Domain 上一期一笔带过了部分Oracle 23c的新特性&#xff0c;这一期重点讲一下SQL Domain新特性。 【https://docs.oracle.com/en/database/oracle/oracle-…...

《Vue3实战》 第一章 nods/npm安装、配置

1、nods.js安装&#xff08;Windows&#xff09; 1.1、下载并安装node https://nodejs.org/en/ , 安装到d盘nodejs目录 1.2、配置环境变量 path配置 1.3、配置全局包存放目录和缓存目录 在根目录下创建node_global&#xff08;全局包存放目录&#xff09;和node_cache&…...

JAVA练习104-四数相加 II

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-四数相加 II 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 4月10日练…...

【C++基础】引用(引用的概念;引用的特性;常引用;使用场景:做输出型参数、大对象传参、做输出型返回值、返回大对象的引用);引用和指针的区别)

六、引用 6.1 引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。&#xff08;语法上&#xff09; 格式&#xff1a;类型& 引用变量名(对象名) …...

Redis只用来做缓存?来认识一下它其他强大的能力吧。

当今互联网应用中&#xff0c;随着业务的发展&#xff0c;数据量越来越大&#xff0c;查询效率越来越高&#xff0c;对于时序数据的存储、查询和分析需求也越来越强烈&#xff0c;这时候 Redis 就成为了首选的方案之一。 Redis 提供了多种数据结构&#xff0c;如字符串、哈希表…...

【ES】数据同步集群

【ES】数据同步&集群3.数据同步3.1.思路分析3.1.1.同步调用3.1.2.异步通知3.1.3.监听binlog3.1.4.选择3.2.实现数据同步3.2.1.思路3.2.2.导入demo3.2.3.声明交换机、队列1&#xff09;引入依赖2&#xff09;声明队列交换机名称3&#xff09;声明队列交换机3.2.4.发送MQ消息…...

37岁男子不愿熬夜,回乡养鸡每天准时下班,青山绿水中养鸡,直播间里卖鸡蛋...

37岁男子不愿熬夜&#xff0c;回乡养鸡每天准时下班&#xff0c;青山绿水中养鸡&#xff0c;直播间里卖鸡蛋。今天和大家分享一个创业案例&#xff0c;他叫胡铭浩&#xff0c;来自安徽省旌德县&#xff0c;今年37岁&#xff0c;曾做过车床操作工&#xff0c;开过婚纱摄影店&…...

深度学习和人工智能之间是什么样的关系?

深度学习与人工智能概念的潜在联系&#xff0c;我们依然借助维恩图来说明&#xff0c;如图4.1所示。 1、人工智能 “人工智能”这个概念新鲜时髦但又含混模糊&#xff0c;同时包罗万象。尽管如此,我们仍尝试对 人工智能进行定义:用一台机器处理来自其周围环境的信息,然后将这些…...

实战打靶集锦-016-lampiao

提示&#xff1a;本文记录了博主打靶过程中一次曲折的提权经历 文章1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 80端口探查4.2 1898端口探查4.3 EXP搜索4.3.1 exploit/unix/webapp/drupal_coder_exec4.3.2 exploit/unix/webapp/drupal_drupalgeddon25. 提权5.1 系统信息…...

《Web前端应用开发》考试试卷(模拟题)

一、产品搜索页面 打开“考试文件夹”中的input.html&#xff0c;完成以下步骤&#xff1a; 注意&#xff1a;本题仅能在input.html的&#xff08;1&#xff09;为产品名称所在的div添加样式属性&#xff0c;使得产品名称保持在文本框的左边&#xff1b; &#xff08;2&#xf…...

【react全家桶学习】react简介

react是什么&#xff1f; react是用于构建用户界面的JS库&#xff0c;是一个将数据渲染为HTML视图的开源JS库 谁开发的&#xff1f; 由Facebook开发&#xff0c;且开源 为什么要学&#xff1f; 原生JavaScript操作DOM繁琐、效率低 ( DOM-API操作 UI)使用JavaScript直接操作…...

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

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

光耦继电器工作原理及优点概述

光耦继电器是一种电子元器件&#xff0c;也是固态继电器的一种&#xff0c;其主要作用是隔离输入与输出电路&#xff0c;用于保护或者控制电路的正常工作。 光耦继电器工作原理是利用光电转换器将外界信号转化为光信号&#xff0c;通过光纤传输到另一端&#xff0c;再由另一端的…...

【Mysql】mysql8.0.26解压包部署方式

版本背景&#xff1a; 操作系统&#xff1a;centos7.3 mysql版本&#xff1a;mysql-8.0.26-linux-glibc2.12-x86_64.tar 一、前期准备 1、检测操作系统自带安装的mysql和mariadb服务&#xff0c;如存在&#xff0c;需卸载 rpm -qa | grep mysql rpm -qa | grep mariadb 卸载…...

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展&#xff0c;如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性&#xff0c;避免过程中出现不必要的错误和漏洞&#xff0c;从而帮助企业更加稳健地自我发展。那么&#xff0c;一…...

图片怎么转换成pdf格式?这几个方法帮你一键转换

现今电子书籍越来越受到欢迎&#xff0c;其中PDF格式也成为了一种常用的电子书籍格式。无论是工作还是学习&#xff0c;我们都可能会遇到需要将图片转换成PDF格式的情况&#xff0c;例如保存一些资料证明、公文公告、学习资料等。在这篇文章中&#xff0c;我们将为大家介绍三种…...

数据结构exp1_2学生成绩排序

目录 数据结构exp1_2学生成绩排序 程序设计 程序分析 数据结构exp1_2学生成绩排序 【问题描述】 对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输…...

在DongshanPI-D1开箱使用分享与折腾记录实现MPU6050数据读取

前言 上一篇文章使用RT-Smart的IIC驱动OLED屏幕&#xff0c;进行基本的字符串显示,在使用过程中对RT-Smart有了一定熟悉&#xff0c;准备使用SPI驱动ST7789&#xff0c;但SPI接口没有引出&#xff0c;本次使用手上已有的传感器MPU6050进行使用。 过程 本次直接开始添加离线包…...

Nature子刊 定制饮食去除半胱氨酸和蛋氨酸可诱导细胞自毁进而治疗脑瘤?

恶性胶质瘤是成人最常见的脑部肿瘤。恶性胶质瘤的致死率为100%&#xff0c;无法治愈&#xff0c;是一种极度的恶性肿瘤。如此糟糕的预后促使研究者及神经外科医生不断学习研究肿瘤生物学&#xff0c;期望创造更好的疗法。神经外科助理教授Dominique Higgins博士从事肿瘤生物学的…...

抛弃 TCP 和 QUIC 的 HTTP

下班路上发了一则朋友圈&#xff1a; 周四听了斯坦福老教授 John Ousterhout 关于 Homa 的分享&#xff0c;基本重复了此前那篇 It’s Time To Rep… 的格调&#xff0c;花了一多半时间喷 TCP… Ousterhout 关于 Homa 和 TCP 之间的论争和论证&#xff0c;诸多反复回执&…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...