Oracle 23ai新特性:表值构造函数

embedded/2025/1/16 10:39:42/

随着 Oracle 数据库不断发展,新版本引入了许多增强功能和特性,以提高开发效率、简化 SQL 编写并优化性能。Oracle 23c 引入了表值构造器(Table Values Constructor),这一特性允许用户直接在 SQL 语句中定义和使用内联表数据,极大地增强了 SQL 的灵活性和表达能力。

本文将详细介绍 Oracle 23c 中的表值构造器特性,包括其语法、应用场景以及如何与现有 SQL 结构结合使用,旨在帮助数据库开发者更好地理解和利用这一强大的工具。

一、表构造器简介

表值构造器是一种 SQL 构造,它允许你在查询中创建一个临时的、匿名的表结构,并填充具体的数据行。这使得你可以像操作常规表一样对这些数据进行查询、连接和其他操作,而无需预先创建物理表或视图。

表值构造器特别适合用于以下场景:

  • 测试数据生成:快速创建小规模的数据集用于调试或演示。
  • 复杂查询构建:作为子查询的一部分,提供中间结果集。
  • 参数化输入:为存储过程或函数传递表格形式的参数。

二、基本语法

Oracle 23c 中,表值构造器的基本语法如下:

WITH table_name AS (VALUES (value1, value2, ...),(value3, value4, ...)
)
SELECT * FROM table_name;

或者更简洁地,在 SELECT 语句中直接使用:

SELECT *
FROM VALUES (value1, value2),(value3, value4);

每个 VALUES 子句可以包含多个逗号分隔的值列表,每个列表代表一行数据。如果需要指定列名,可以在 VALUES 后面添加 AS 关键字和列名列表:

SELECT *
FROM (VALUES (1, 'Alice'),(2, 'Bob')) AS t(id, name);

三、应用示例

运行本文中的示例需要下表。

drop table if exists t1;create table t1 (id number,code varchar2(6),description varchar(25),constraint t1_pk primary key (id)
);

3.1 INSERT

表值构造函数允许我们一步将多行插入到表中。

insert into t1
values (1, 'ONE', 'Description for ONE'),(2, 'TWO', 'Description for TWO'),(3, 'THREE', 'Description for THREE');commit;select * from t1;ID CODE   DESCRIPTION
---------- ------ -------------------------1 ONE    Description for ONE2 TWO    Description for TWO3 THREE  Description for THREESQL>

这是一个事务,无需将所有插入语句组合到 PL/SQL 块中。  如果任何值导致失败,则该语句的所有插入都会丢失。

在此示例中,我们再次插入 3 条记录,但确保中间值子句导致整个事务失败,尚未插入任何新行。

insert into t1
values (4, 'FOUR', 'Description for ONE'),(5, 'FIVE', 'This one will fail because it is too big'),(6, 'SIX', 'Description for THREE');insert into t1
*
ERROR at line 1:
ORA-12899: value too large for column "TESTUSER1"."T1"."DESCRIPTION" (actual: 40, maximum: 25)select * from t1;ID CODE   DESCRIPTION
---------- ------ -------------------------1 ONE    Description for ONE2 TWO    Description for TWO3 THREE  Description for THREESQL>

3.2 SELECT

相同类型的表值构造函数可以用在 SELECT 语句的 FROM 子句中。请注意,我们必须为列名称添加别名,以便正确显示它们。

select *
from   (values(4, 'FOUR', 'Description for FOUR'),(5, 'FIVE', 'Description for FIVE'),(6, 'SIX', 'Description for SIX')) a (id, code, description);ID CODE DESCRIPTION
---------- ---- --------------------4 FOUR Description for FOUR5 FIVE Description for FIVE6 SIX  Description for SIXSQL>

3.3 WITH语句

表值构造函数可以用作WITH 子句的一部分。

with a (id, code, description) AS (values (7, 'SEVEN', 'Description for SEVEN'),(8, 'EIGHT', 'Description for EIGHT'),(9, 'NINE', 'Description for NINE')
)
select * from a;ID CODE  DESCRIPTION
---------- ----- ---------------------7 SEVEN Description for SEVEN8 EIGHT Description for EIGHT9 NINE  Description for NINESQL>

3.4 MERGE

表值构造函数可以用作 MER​​GE 语句的源数据。

merge into t1 ausing (values(4, 'FOUR', 'Description for FOUR'),(5, 'FIVE', 'Description for FIVE'),(6, 'SIX', 'Description for SIX')) b (id, code, description)on (a.id = b.id)when matched thenupdate set a.code        = b.code,a.description = b.descriptionwhen not matched theninsert (a.id, a.code, a.description)values (b.id, b.code, b.description);3 rows merged.SQL>select * from t1;ID CODE   DESCRIPTION
---------- ------ -------------------------1 ONE    Description for ONE2 TWO    Description for TWO3 THREE  Description for THREE4 FOUR   Description for FOUR5 FIVE   Description for FIVE6 SIX    Description for SIX6 rows selected.SQL>

3.5 PROCEDURE

在 PL/SQL 中,表值构造器还可以用作存储过程或函数的输入参数,实现更加灵活的数据传递方式:

CREATE OR REPLACE PROCEDURE process_employee_data(p_employees SYS.ODCIVARCHAR2LIST
) IS
BEGINFOR i IN 1..p_employees.COUNT LOOPINSERT INTO employees (name, department, salary)VALUES (p_employees(i).name,p_employees(i).department,p_employees(i).salary);END LOOP;
END;
/

在这个例子中,SYS.ODCIVARCHAR2LIST 是一种集合类型,它可以用来接收来自表值构造器的数据。

四. 性能优势

表值构造器不仅简化了 SQL 编写的复杂度,还带来了显著的性能提升。由于数据是在内存中即时创建和处理的,因此避免了磁盘 I/O 操作,减少了系统开销。此外,对于一次性使用的临时数据,这种方法比创建临时表更加高效,因为不需要额外的清理工作。

五. 注意事项

尽管表值构造器提供了极大的便利性,但在使用时也需要注意以下几点:

  • 数据量限制:虽然理论上可以插入任意数量的行,但实际上受制于内存大小和 SQL 解析器的限制,过大的数据集可能会导致性能问题或错误。
  • 安全性考虑:确保敏感数据不会通过这种方式暴露给不必要的用户或应用程序。
  • 兼容性问题:确认你的 Oracle 版本支持表值构造器特性,并且所有相关组件都已正确配置。

六. 总结

Oracle 23c 引入的表值构造器特性为 SQL 开发者提供了一种强大而灵活的新工具,能够显著简化数据操作和查询构建。通过直接在 SQL 语句中定义和使用内联表数据,不仅可以提高开发效率,还能带来更好的性能表现。


http://www.ppmy.cn/embedded/154373.html

相关文章

如何使用策略模式并让spring管理

1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…

zookeeper 基本原理-单机模式、集群模式

单机模式 单机安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个目录如:C:\zookeeper-3.4.5\下,Zookeeper 的启动脚本在 bin 目录下,Windows 下的启动脚本是 zkServer.cmd。 在你执行启动脚本之前,还有几个基本…

自动生成数据:SQLark 让数据测试更高效

在新版本的业务系统开发过程中,需要生成大量的测试数据来模拟真实的业务场景,测试系统的稳定性和性能。今天分享一下我使用SQLark生成测试数据的经验,它能够提供8大类47个子类的数据规则,快速构建仿真测试数据环境,还支…

SQL 快速参考

SQL 快速参考 介绍 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库管理系统的标准编程语言。它用于执行各种操作,如查询、更新、插入和删除数据库中的数据。本快速参考指南提供了SQL的基本语法和常用命…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO(El Nio-Southern Oscillation)是全球气候系统中最显著的年际变率现象之一,对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来,深度学习技术在气象领域…

react中hooks之useEffect 用法总结

1. 什么是函数的副作用(Side Effects) 副作用是指在组件渲染过程中,除了返回 JSX 之外的其他操作,例如: 数据获取(API 调用)订阅数据源手动修改 DOM设置定时器存储数据日志记录 纯函数是特定的…

深入理解循环神经网络(RNN):原理、应用与挑战

引言 在深度学习的众多模型中,循环神经网络(RNN)因其对序列数据处理的特性而备受关注。无论是自然语言处理、时间序列预测,还是语音识别,RNN都展现出了强大的能力。然而,RNN的内部机制及其在实际应用中的优…

康谋产品 | 深度自然匿名化:隐私保护与视觉完整性并存的未来!

在科技迅速发展的时代,保护个人隐私的需求日益增长,有效匿名化技术的重要性不容忽视。无论是针对敏感的图像、视频,还是数据,在隐私保护与保持视觉完整性之间取得平衡至关重要。虽然模糊化一直是匿名化的常用选择,但一…