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

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

随着 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 ONE
         2 TWO    Description for TWO
         3 THREE  Description for THREE

SQL>

这是一个事务,无需将所有插入语句组合到 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 ONE
         2 TWO    Description for TWO
         3 THREE  Description for THREE

SQL>

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 FOUR
         5 FIVE Description for FIVE
         6 SIX  Description for SIX

SQL>

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 SEVEN
         8 EIGHT Description for EIGHT
         9 NINE  Description for NINE

SQL>

3.4 MERGE

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

merge into t1 a
  using (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 then
    update set a.code        = b.code,
               a.description = b.description
  when not matched then
    insert (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 ONE
         2 TWO    Description for TWO
         3 THREE  Description for THREE
         4 FOUR   Description for FOUR
         5 FIVE   Description for FIVE
         6 SIX    Description for SIX

6 rows selected.

SQL>

3.5 PROCEDURE

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

CREATE OR REPLACE PROCEDURE process_employee_data(
    p_employees SYS.ODCIVARCHAR2LIST
) IS
BEGIN
    FOR i IN 1..p_employees.COUNT LOOP
        INSERT 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.kler.cn/a/501380.html

相关文章:

  • 【大数据】机器学习 -----关于data.csv数据集分析案例
  • 从硬件设备看Linux
  • 互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
  • 提升租赁效率的租赁小程序全解析
  • 树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍
  • AWS简介
  • 《自动驾驶与机器人中的SLAM技术》ch7:基于 ESKF 的松耦合 LIO 系统
  • 全栈面试(一)Basic/微服务
  • 基于django车牌识别系统(源码+lw+部署文档+讲解),源码可白嫖!
  • C++实现设计模式---模板方法模式 (Template Method)
  • Git的master 分支和main分支的区别是什么?使用场景是什么?底层原理是什么?
  • nginx负载均衡-基于端口的负载均衡(一)
  • 提升 PHP 编码效率的 10 个实用函数
  • 基于改进粒子群优化的无人机最优能耗路径规划
  • 大数据环境搭建进度
  • C# 正则表达式完全指南
  • 2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学
  • 无人机电池技术引领低空经济新篇章!
  • 【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题
  • 【黑灰产】假钱包推广套路
  • SpringBoot项目实战(41)--Beetl网页使用自定义函数获取新闻列表
  • Linux随记(十四)
  • R语言的正则表达式
  • ssh+frp+公网IP 实现远程访问家里的电脑
  • 力扣-数组-219 存在重复元素Ⅱ
  • OceanBase环境搭建与熟悉全攻略:开启分布式数据库探索之旅