Oracle 18C新特性:内联外部表

介绍

  Oracle 数据库18c 允许您使用 SELECT 语句中定义的内联外部表访问平面文件中的数据。

  什么是内联外部表?

  内联外部表将外部表的定义直接放在SQL语句中,不需要额外在数据字典中创建外部表对象。当使用内联外部表的时候,与创建外部表(CREATE TABLE)相同的语法可以用在一个select语句上。可以在一个字句的 from 关键字后面指定内联外部表。含有内联外部表的查询也可以包含常规的表的关联(joins),聚合(aggregation)等等。

  这比 Oracle 数据库12c 版本2(12.2)中引入的查询中重写外部表参数的能力更进一步。

实践证明

1、生成测试数据

为了演示内联外部表,我们需要一些平面文件中的数据。 下面的代码生成4个 CSV 文件,每个文件有1000行。

[[email protected]:/home/oracle]$more test.sql  <<=============创建脚本,生成数据
ALTER SESSION SET CONTAINER = pdb1;
set echo off
set heading off
set term off
SET MARKUP CSV ON QUOTE ON
SET TRIMSPOOL ON LINESIZE 1000 FEEDBACK OFF PAGESIZE 0
SPOOL /tmp/gbr1.txt
SELECT ‘GBR‘,
       object_id,
       owner,
       object_name
FROM   dba_objects
WHERE  object_id <= 2000
AND    rownum <= 1000;
SPOOL OFF

SPOOL /tmp/gbr2.txt
SELECT ‘GBR‘,
       object_id,
       owner,
       object_name
FROM   dba_objects
WHERE  object_id BETWEEN 2000 AND 3999
AND    rownum <= 1000;
SPOOL OFF

SPOOL /tmp/ire1.txt
SELECT ‘IRE‘,
       object_id,
       owner,
       object_name
FROM   dba_objects
WHERE  object_id <= 2000
AND    rownum <= 1000;
SPOOL OFF

SPOOL /tmp/ire2.txt
SELECT ‘IRE‘,
       object_id,
       owner,
       object_name
FROM   dba_objects
WHERE  object_id BETWEEN 2000 AND 3999
AND    rownum <= 1000;
SPOOL OFF
SET MARKUP CSV OFF
SET TRIMSPOOL ON LINESIZE 1000 FEEDBACK OFF PAGESIZE 14

[[email protected]:/home/oracle]$ss

SQL> @test                                       <=============执行脚本

Session altered.

[[email protected]:/home/oracle]$ll /tmp/*.txt      <=============查看生成的数据
-rw-r--r-- 1 oracle oinstall 33529 3月   5 11:40 /tmp/gbr1.txt
-rw-r--r-- 1 oracle oinstall 38554 3月   5 11:40 /tmp/gbr2.txt
-rw-r--r-- 1 oracle oinstall 33529 3月   5 11:40 /tmp/ire1.txt
-rw-r--r-- 1 oracle oinstall 38554 3月   5 11:40 /tmp/ire2.txt

创建两个目录对象来访问这些文件。 在这种情况下,两者都指向同一个目录。

[[email protected]:/home/oracle]$ss

SQL> ALTER SESSION SET CONTAINER = pdb1;

Session altered.

SQL> CREATE OR REPLACE DIRECTORY tmp_dir1 AS ‘/tmp/‘;

Directory created.

SQL> GRANT READ, WRITE ON DIRECTORY tmp_dir1 TO test;

Grant succeeded.

CREATE OR REPLACE DIRECTORY tmp_dir2 AS ‘/tmp/‘;

Directory created.

SQL> GRANT READ, WRITE ON DIRECTORY tmp_dir2 TO test;

Grant succeeded.

2、内联外部表

内联外部表允许使用 EXTERNAL 子句将外部表定义放在 SQL 语句的 FROM 子句中,因此不需要显式创建外部表。

SELECT country_code, COUNT(*) AS amount
FROM   EXTERNAL (
         (
           country_code  VARCHAR2(3),
           object_id     NUMBER,
           owner         VARCHAR2(128),
           object_name   VARCHAR2(128)
         )
         TYPE oracle_loader
         DEFAULT DIRECTORY tmp_dir2
         ACCESS PARAMETERS (
           RECORDS DELIMITED BY NEWLINE
           BADFILE tmp_dir2
           LOGFILE tmp_dir2:‘inline_ext_tab_%a_%p.log‘
           DISCARDFILE tmp_dir2
           FIELDS CSV WITH EMBEDDED TERMINATED BY ‘,‘ OPTIONALLY ENCLOSED BY ‘"‘
           MISSING FIELD VALUES ARE NULL (
             country_code,
             object_id,
             owner,
             object_name
           )
        )
        LOCATION (‘gbr1.txt‘, ‘gbr2.txt‘)
        REJECT LIMIT UNLIMITED
      ) inline_ext_tab
GROUP BY country_code
ORDER BY 1;
COUNTRY_C     AMOUNT
--------- ----------
GBR             2000
IRE             2000
SQL> 

在下面的示例中,我们使用不同的目录对象,并在 LOCATION 子句中指定不同的文件列表。 毫不奇怪,这给了我们一个不同的结果。

SELECT country_code, COUNT(*) AS amount
FROM   EXTERNAL (
         (
           country_code  VARCHAR2(3),
           object_id     NUMBER,
           owner         VARCHAR2(128),
           object_name   VARCHAR2(128)
         )
         TYPE oracle_loader
         DEFAULT DIRECTORY tmp_dir2
         ACCESS PARAMETERS (
           RECORDS DELIMITED BY NEWLINE
           BADFILE tmp_dir2
           LOGFILE tmp_dir2:‘inline_ext_tab_%a_%p.log‘
           DISCARDFILE tmp_dir2
           FIELDS CSV WITH EMBEDDED TERMINATED BY ‘,‘ OPTIONALLY ENCLOSED BY ‘"‘
           MISSING FIELD VALUES ARE NULL (
             country_code,
             object_id,
             owner,
             object_name
           )
        )
        LOCATION (‘gbr1.txt‘, ‘gbr2.txt‘)
        REJECT LIMIT UNLIMITED
      ) inline_ext_tab
GROUP BY country_code
ORDER BY 1;

COUNTRY_C     AMOUNT
--------- ----------
GBR             2000

内联外部表定义有点难看,因此,如果计划将其连接到其他表,可能更喜欢将其放入 WITH 子句中。

WITH inline_ext_tab AS (
  SELECT *
  FROM   EXTERNAL (
           (
             country_code  VARCHAR2(3),
             object_id     NUMBER,
             owner         VARCHAR2(128),
             object_name   VARCHAR2(128)
           )
           TYPE oracle_loader
           DEFAULT DIRECTORY tmp_dir2
           ACCESS PARAMETERS (
             RECORDS DELIMITED BY NEWLINE
             BADFILE tmp_dir2
             LOGFILE tmp_dir2:‘inline_ext_tab_%a_%p.log‘
             DISCARDFILE tmp_dir2
             FIELDS CSV WITH EMBEDDED TERMINATED BY ‘,‘ OPTIONALLY ENCLOSED BY ‘"‘
             MISSING FIELD VALUES ARE NULL (
               country_code,
               object_id,
               owner,
               object_name
             )
          )
          LOCATION (‘gbr1.txt‘, ‘gbr2.txt‘)
          REJECT LIMIT UNLIMITED
        )
)
SELECT country_code, COUNT(*) AS amount
FROM   inline_ext_tab
GROUP BY country_code
ORDER BY 1;

COUNTRY_C     AMOUNT
--------- ----------
GBR             2000

3、对安全的影响

  无论是否使用外部表,对目录对象的访问都应该受到严格控制。

  4、其他

  1) 正如文档中指出的,这个功能不支持分区的外部表,但是这是不相关的,因为您可以完全控制所访问的文件,所以不需要考虑分区

  2)它导致了非常难看的 SQL

  3)在没有特权创建元数据对象(例如只读数据库)的情况下,它可能很有用

  4)如上所述,需要考虑与此功能相关的安全因素

  

原文地址:https://www.cnblogs.com/bicewow/p/12419359.html

时间: 2024-08-03 06:13:27

Oracle 18C新特性:内联外部表的相关文章

Oracle 18C新特性介绍

Oracle 18c 是在 2018-02-16 发布出来的,还是秉承着 Oracle 的 Cloud first 理念,18c 现在 Cloud 和 Engineered Systems 上推出.Oracle 18c号称是一款自治性的数据库,可以减少很多DBA的工作,很多从事DBA工作的人员是不是要担心自己的工作受到影响?其实Oracle 18c上并未体现的特别明显,不过这是未来的一个趋势和信号! 查看了官方的一些文档资料,就新增的一些新的特点和大家分享一下,18C继续着12C的云数据库的特点

Oracle 18C新特性:ALTER SYSTEM CANCEL SQL

介绍 18c官方文档<Database Administrator’s Guide>中有介绍,关于取消会话的sql事务有新增特性,可以使用ALTER SYSTEM CANCEL SQL..对事务取消,具体使用方法如下: 实践证明 ##session 1 SQL> select sid, serial# from v$session where sid = userenv('SID'); SID SERIAL# ---------- ---------- 25 29476 SQL>

[转]Oracle 11g 新特性 -- SQL Plan Management 说明

一 概述 二 SQL 计划基线Plan BaseLine体系结构三 加载SQL 计划基线四 演化SQL 计划基线五 重要的基线SQL 计划属性六 SQL 计划选择七 可能的SQL 计划可管理性方案八 SQL 性能分析器和SQL 计划基准方案九 自动加载SQL 计划基线方案十 清除SQL 管理库策略 一.概述 SQL 语句的SQL 执行计划发生更改时,可能存在性能风险. SQL 计划发生更改的原因有很多,如优化程序版本.优化程序统计信息.优化程序参数.方案定义.系统设计和SQL 概要文件创建等.

Oracle 11g新特性之--Server Result Cache

Oracle 11g新特性之--Server  Result Cache 一.Server Result Cache说明 Oracle官网的说明,参考: 7.6 Managing the Server and Client  Result Caches http://docs.oracle.com/cd/E11882_01/server.112/e16638/memory.htm#BGBCABED 1.1 概述 SQL 查询结果高速缓存可在数据库内存中对查询结果集和查询碎片启用显式高速缓存.存储

Oracle 11g新特性之--虚拟列(Virtual Column)

Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL] 1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用

Oracle 11g新特性invisible index(不可见的索引)

如果一张表上有十几个索引,你有什么感受?显然会拖慢增.删.改的速度,不要指望开发人员能建好索引.我的处理方法是先监控很长的一段时间,看哪些索引没有用到,然后删除.但删除以后,如果发现某一天有用,那又要重新建,如果是大表,那就有些麻烦.现在11g提供一个新特性,不可见索引,可以建索引设置为不可见索引,CBO在评估执行计划的时候会忽略它,如果需要的时候,设置回来即可. 还有一种用途,你在调试一条SQL语句,要建一个索引测试,而你不想影响其他的会话,用不可见索引正是时候. SQL> drop tabl

[转]Oracle 11g 新特性 -- SQL Plan Management 示例

目录 一 SPM 说明 相关名词说明 SPM的特点 与profile和outline相比更加灵活的控制手段 SPM使计划真正的稳定 SPM的控制方式 SPM如何捕捉加载执行计划 自动捕捉 批量导入 执行计划的选择过程 执行计划的演化evolution 修改已有的Baseline 相关MOS 文档 二 SPM 示例 自动捕捉 手工捕获执行计划 演化SQL Plan Baselines 完整示例 修改 Plan Baselines 显示SQL Plan Baselines 设置SQL Managem

Oracle 12C 新特性之扩展数据类型(extended data type)

Oracle 12C 新特性-扩展数据类型,在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的大小会从4K以及2K字节扩展至32K字节.只要可能,扩展字符的大小会降低对LOB数据类型的使用.为了启用扩展字符大小,你必须将MAX_STRING_SIZE的初始数据库参数设置为EXTENDED. 实验流程:1.查看参数max_string_size默认值SQL> show parameter max_string_sizeNAME     TYPE VA

Oracle 11g 新特性 -- Oracle Restart 说明(转载)

转载:http://blog.csdn.net/tianlesoftware/article/details/8435670 一.  OHASD 说明 Oracle 的Restart 特性是Oracle 11g里的新特性,在讲这个特性之前先看一下Oracle 11g RAC的进程.之前的Blog 有说明. Oracle 11gR2RAC 进程说明 http://blog.csdn.net/tianlesoftware/article/details/6009962 Oracle 11gR2 中对