Oracle Database 23c 开发者新特性概览

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Database 23c 开发者新特性概览相关的知识,希望对你有一定的参考价值。

即将发布的 Oracle Database 23c 提供了 300+ 新特性和增强功能,本文给大家做一个简要的介绍,主要涉及开发者相关的功能。

BOOLEAN 数据类型

Oracle Database 23c 引入了新的 boolean 数据类型,可以用于字段定义和 SQL 语句。

true、false、‘t’、‘f’、‘true’、‘yes’ 等可以作为 boolean 类型的输入数据,任何非 0 的数字都会被转换为 true,数字 0 则会被转换为 false。

create table bool_test (val varchar2(10), flg boolean);
insert into bool_test values ('true'  , true );
insert into bool_test values ('false' , false);
insert into bool_test values ('null'  , null );
insert into bool_test values ('t'     ,'t'   );
insert into bool_test values ('yes'   ,'yes' );
insert into bool_test values ('true'  ,'true');
insert into bool_test values ('f'     ,'f'   );
insert into bool_test values ('0'     , 0    );

select val from bool_test where flg;
select val from bool_test where not flg;

与此同时,Oracle 还提供了一个新的函数 to_boolean()。

无表查询

很多数据库都支持没有 FROM 子句的查询,可以直接返回表达式或者函数的值。Oracle 则提供了虚拟的 DUAL 表。不过从 Oracle 23c 开始,也支持了这种无表查询语句。

select 'Oracle Database 23c' as db, sysdate as now, 1+1 as result;

javascript 存储过程

新版本的 Oracle 存储过程可以支持 JavaScript 语言:

create mle module test_js 
language javascript as
    export function f(p1, p2)  return p1+p2;create function f (p1 number, p2 number) 
return number as mle module test_js signature f(number, number);

select f(20, 22) ;

CREATE TABLE IF NOT EXIST

在之前的版本中,如果创建一个已经存在的表,将会返回 ORA-00955: name is already used by an existing object 错误;如果删除一个不存在的表,将会返回 ORA-00942: table or view does not exist 错误。

Oracle Database 23c 支持 CREATE TABLE IF NOT EXIST 以及 DROP TABLE IF EXIST 语句,可以避免这些问题:

create table IF NOT EXIST t1 (id INTEGER, txt varchar2(10));

drop table IF EXIST t2;

基于别名的 GROUP BY

Oracle Database 23c 可以基于表达式的别名或者它在 SELECT 列表中的位置指定 GROUP BY 和 HAVING 操作。

select extract(year from hire_date) yr, count(*) as total_emp
from employee
group by yr
having total_emp > 5;

在之前的版本中,以上语句将会返回 ORA-00904: invalid identifier 错误。

另外,如果想要使用基于表达式在 SELECT 列表中的位置进行分组,需要将初始化参数文件中的 group_by_position_enabled 设置为 true。

关联更新

关联更新可以直接基于其他的表更新某个表中的数据:

udpate dest d
set d.col1 = s.c1
from src s
where d.id = s.id;

JSON

支持使用 JSON 模式验证 JSON 文档的格式:

create table json_schema_test (
   obj json validate '
     
         "num": number,
         … 
     
   '
);

JSON 关系二元性(JSON Relational Duality)提供了应用程序使用的 JSON 文档和关系型数据库存储的数据行之间的映射。这种映射通过 JSON 关系二元性视图进行定义,数据转换通过 GraphQL 实现。

JSON 关系二元性视图支持一下访问方法:

  • SQL;
  • 传统 HTTP/REST 操作,例如 GET、PUT 以及 POST HTTP 请求;
  • Simple Oracle Document API(SODA)
  • Oracle Database API for MongoDB
  • ORDS

相比 ORM 而言,二元性视图的优势在于不依赖于编程语言,而且在数据库中进行了优化。

表值构造函数

表值构造函数可以构造一组行值表达式,用于 INSERT 语句时可以一次插入多条记录:

insert into t1 
values (1, 'first' ),
       (2, 'second'),
       (3, 'third' );

表值构造函数也可以用于查询语句:

select * from (
  values (1, 'first' ),
         (2, 'second'),
         (3, 'third' )
) tmp (id, val);

模式级别的特权

Oracle Database 23c 支持基于整个模式的特权管理:

grant select any table
on schema hr  
to user01;

SQL 域

SQL 域可以额外定义数据约束、显示格式以及排序规则。

create domain email_addr as varchar2(99);

create domain month_year
   constraint month_fmt check (regexp_like(year_month, '^\\d\\d-\\d\\d\\d\\d$')
   display 'Year: ' || substr(year_month, 4, 4) || ', Month: ' || substr(year_month, 1, 2)
   order substr(year_month, 4, 4) || substr(year_month, 1, 2);

create table financial_report
   …
   corrections_to email_addr
   rep_period     month_year,);

两个新的函数 domain_display 和 domain_order 分别可以用于获取域定义中的显示格式和排序函数。

开发者角色

为了方法开发人员的管理,新版本提供了一个专用的开发者角色。

begin
   dbms_developer_admin.grant_privs('user01');
end;
/
SQL> grant developer to user01 identified by xxxxxx;
grant succeeded.

SQL> connect user01/xxxxxx@ora23c;
connected.

SQL> select * from session_privs order by privilege;
PRIVILEGE
------------------------------
CREATE ANALYTIC VIEW
CREATE ATTRIBUTE DIMENSION
CREATE CUBE
CREATE CUBE BUILD PROCESS
CREATE CUBE DIMENSION
CREATE DIMENSION
CREATE DOMAIN
CREATE HIERARCHY
CREATE JOB
CREATE MATERIALIZED VIEW
CREATE MINING MODEL
CREATE MLE
CREATE PROCEDURE
CREATE SEQUENCE
CREATE SESSION
CREATE SYNONYM
CREATE TABLE
CREATE TRIGGER
CREATE TYPE
CREATE VIEW
DEBUG CONNECT SESSION
EXECUTE DYNAMIC MLE
FORCE TRANSACTION
ON COMMIT REFRESH

24 rows selected.

表的最大字段数量

从 Oracle Database 23c 开始,一个表最多可以拥有 4096 个字段,前提是 max_columns 设置为 extended。

模式和对象的注解

键值对形式的注解可以为表、视图、物化视图、字段、索引以及域等提供更加丰富的元数据。

create table test ()
annotations (
   expected_release '1.0',
   test_coverage    'yes'
);

其他

  • merge 和 update 语句的 returning 子句
  • interval 数据类型的聚合操作
  • 区块链表增强
  • SQL <-> PL/SQL 转译器
  • 1024 字节密码
  • Sagas 微服务
  • 无锁列值保留
  • 透明应用连续性
  • dbms_search 搜索包
  • 异步编程
  • SQL 属性图查询语言((ISO SQL/PQL 标准)
  • update 语句的 default on null
  • True Cache
  • 实时 SQL 计划管理
  • PDB 级别的只读备库
  • 内置 SQL 防火墙
  • OKafka
  • 自动维护的 Oracle 文本索引
  • 可传输的二进制 XML
  • OAuth 2.0 集成
  • 等等

以上是关于Oracle Database 23c 开发者新特性概览的主要内容,如果未能解决你的问题,请参考以下文章

快速尝鲜Oracle 23c免费开发者版,惊喜多多

Oracle 23c数据库的10个特性介绍

Oracle 23c数据库的10个特性介绍

iOS 11 Xcode9开发 新特性学习 (新方法篇)

Educational Codeforces Round 23C

CSS3 新特性学习