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

server/2025/1/14 22:17:58/

随着 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/server/158390.html

相关文章

[文献精汇]使用 LSTM Networks 的均值回归交易策略

Backtrader 策略实例 [Backtrader]实例:均线策略[Backtrader] 实例:MACD策略[Backtrader] 实例:KDJ 策略[Backtrader] 实例:RSI 与 EMA 结合[Backtrader] 实例:SMA自定义数据源[Backtrader] 实例:海龟策略[Backtrader] 实例:网格交易[Backtrader] 实例: 配对交[Backtrader] 机…

C 语言的待解之题与前行之路:探寻那些显而易见的改进方向

在编程语言的历史长河中,C 语言一直占据着重要的地位,历经多次标准更新,如今已发展到 C23 版本。然而,令人困惑的是,一些明显的问题却始终未得到妥善解决。与此同时,D 语言社区在其编译器中嵌入了 C 编译器…

uniapp小程序分包路由跳转+二级页面详情跳转保留当前页方法教程

uniapp小程序分包路由跳转二级页面详情跳转保留当前页,进入二级页面,可以返回上一级页面。也就是保留当前页,这里用的是vue3uniappuv-ui组件库 步骤一: 新建文件夹目录。 代码: "subPackages": [{// 动态详…

HarmonyOS应用开发者初级认证最新版– 2025/1/13号题库新版

1.欢迎各位读者,本文档来自鸿蒙开发学员亲测,最新版。(考试时直接Ctrlf进行搜索,一定要认真比对答案,有的答案相似度很高)!!!!!! 欢迎…

nexus搭建maven私服

说到maven私服每个公司都有,比如我上一篇文章介绍的自定义日志starter,就可以上传到maven私服供大家使用,每次更新只需deploy一下就行,以下就是本人搭建私服的步骤 使用docker安装nexus #拉取镜像 docker pull sonatype/nexus3:…

HarmonyOS鸿蒙-@State@Prop装饰器限制条件

一、组件Components级别的状态管理: State组件内状态限制条件 1.State装饰的变量必须初始化,否则编译期会报错。 // 错误写法,编译报错 State count: number;// 正确写法 State count: number 10; 2.嵌套属性的赋值观察不到。 // 嵌套的…

vue3之router路由

路由 1、对路由的理解 2、基本使用 安装路由器扩展包 npm i vue-router 创建组件&#xff1a; Home.vue <template><div class"home"><img src"https://oss.fmy90.cn/fmy/public/4db8dec4d2eb31b8b0456cb42a907941.png" alt""…

python milvus 如何检查有多少个collection 以及多少个index,多少个database

在 Milvus 中,可以通过 Python 客户端(`pymilvus`)来检查当前有多少个集合(Collection)、索引(Index)和数据库(Database)。以下是具体的方法: --- ### 1. 检查有多少个集合(Collection) 使用 `list_collections()` 方法可以列出当前连接的所有集合。 ```python…