Oracle Database 23c新特性之表值构造函数

Oracle 23c 增强了 VALUES 子句的功能,它可以作为表值构造函数创建一组数据行(临时表),用于 SELECT、INSERT 以及 MERGE 语句。

这个新功能可以方便即席查询时精简代码,提高可读性。

示例表

我们首先创建一个简单的示例表:

create table t (
  id integer not null primary key,
  name varchar2(10),
  amount integer
);

插入多行数据

我们可以在 INSERT 语句中使用表值构造函数一次插入多行数据,例如:

insert into t(id, name, amount)
values (1, 'Apple', 100),
       (2, 'Banana', 200),
       (3, 'Cherry', 300);

select * from t;

ID|NAME  |AMOUNT|
--+------+------+
 1|Apple |   100|
 2|Banana|   200|
 3|Cherry|   300|

批量插入数据可以减少网络消耗,提高数据插入的性能。

在 Oracle 21c 以及之前的版本中,我们需要编写多个 INSERT 语句,或者使用 UNION ALL 将多行数据组成一个查询结果。例如:

insert into t(id, name, amount)
select 1, 'Apple', 100 from dual
union all
select 2, 'Banana', 200 from dual
union all
select 3, 'Cherry', 300 from dual;

FROM 子句

SELECT 语句的 FROM 子句中也可以使用表值构造函数创建一个临时的结果集,此时我们需要为这个临时结果集指定表名和列名。例如:

select *
from (values
        (1, 'Apple', 100),
        (2, 'Banana', 200),
        (3, 'Cherry', 300)
     ) s(id, name, amount);

ID|NAME  |AMOUNT|
--+------+------+
 1|Apple |   100|
 2|Banana|   200|
 3|Cherry|   300|

WITH 子句

WITH 子句中同样可以使用表值构造函数创建一个临时表,例如:

with s(id, name, amount) as (
  values
    (1, 'Apple', 100),
    (2, 'Banana', 200),
    (3, 'Cherry', 300)
)
SELECT * FROM s;

ID|NAME  |AMOUNT|
--+------+------+
 1|Apple |   100|
 2|Banana|   200|
 3|Cherry|   300|

MERGE 语句

我们也可以使用表值构造函数为 MERGE 语句创建一个数据源表,例如:

merge into t
  using (values
          (1, 'Apple', 400),
          (2, 'Banana', 500),
          (3, 'Cheery', 600)
        ) s(id, name, amount)
  on (t.id = s.id)
  when matched then
    update set t.name = s.name,
               t.amount = s.amount
  when not matched then
    insert (t.id, t.name, t.amount)
    values (s.id, s.name, s.amount);

select * from t;

ID|NAME  |AMOUNT|
--+------+------+
 1|Apple |   400|
 2|Banana|   500|
 3|Cheery|   600|

猜你喜欢

转载自blog.csdn.net/horses/article/details/131076957