目錄
- 一. 什么是外部表
- 二. 創建外部表所在的文件夾對象
- 三. 授予訪問外部表文件夾的權限
- 3.1 DBA用戶授予普通用戶訪問外部表文件夾的權限
- 3.2 授予Win10上的Oracle用戶訪問桌面文件夾的權限
- 四. 普通用戶創建外部表
- 五. 查詢
- 六. 刪除
一. 什么是外部表
- 在 Oracle 數據庫中,
外部表(External Table)
是一種特殊類型的表,它允許數據庫直接訪問外部文件
(如 CSV 文件、文本文件等),并將這些文件的內容視為表數據
進行查詢。 - 外部表本質上是一個
邏輯表
,它不會在數據庫中存儲實際的數據,而是通過指定的文件位置直接訪問數據文件。
?外部表的特點:
無需存儲數據
:外部表的數據存儲在外部文件系統中,而不是數據庫表空間內。這意味著外部表只是一個映射,使得數據庫可以通過 SQL 查詢來訪問存儲在文件中的數據。直接訪問外部數據
:外部表允許您通過 SQL 查詢直接訪問外部文件中的數據,而無需將數據導入數據庫。這對于處理大量的文件數據特別有用。支持大數據量處理
:外部表非常適合處理大量外部數據文件,您可以像查詢數據庫表一樣查詢這些文件內容。支持多種文件格式
:外部表支持多種不同的文件格式,如 CSV、固定寬度文本文件、分隔符分隔的文件等。
二. 創建外部表所在的文件夾對象
?在Oracle安裝的Win10上準備好外部表所用到csv數據庫文件。
"1","Name_1","41","user1@example.com","2024/05/20 13:05:39"
"2","Name_2","57","user2@example.com","2024/07/29 13:05:39"
"3","Name_3","44","user3@example.com","2024/10/11 13:05:39"
"4","Name_4","24","user4@example.com","2024/04/24 13:05:39"
"5","Name_5","42","user5@example.com","2024/02/21 13:05:39"
"6","Name_6","56","user6@example.com","2024/02/18 13:05:39"
?創建外部表所在的文件夾對象
- 需要使用DBA用戶
- DBA用戶所在的容器應該是
PDB
,而不是CDB
- 因為我們的Oracle數據庫安裝在Win10上,所以文件夾路徑需要Win10上的路徑
# DBA用戶切換容器為PDB
SQL> ALTER SESSION SET CONTAINER = XEPDB1;Session altered.# 確認當前容器
SQL> SHOW CON_NAME;CON_NAME
------------------------------
XEPDB1
SQL>
SQL> CREATE OR REPLACE DIRECTORY PERSON_TABLE_EXT AS 'C:/Users/FengYeHong/Desktop';Directory created.# 確認文件夾對象已經創建完畢
SQL> SELECT directory_name, directory_path FROM all_directories WHERE directory_name = 'PERSON_TABLE_EXT';DIRECTORY_NAME DIRECTORY_PATH
---------------- ---------------------------
PERSON_TABLE_EXT C:/Users/FengYeHong/Desktop
三. 授予訪問外部表文件夾的權限
3.1 DBA用戶授予普通用戶訪問外部表文件夾的權限
SQL> GRANT READ, WRITE ON DIRECTORY PERSON_TABLE_EXT TO "DB_USER";Grant succeeded.
3.2 授予Win10上的Oracle用戶訪問桌面文件夾的權限
?通過services.msc
打開服務,然后找到OracleServiceXE
服務
?打開OracleServiceXE
服務的屬性,然后在登錄
選項卡中找到當前oracle服務的用戶名
四. 普通用戶創建外部表
- 創建一個外部表,名稱叫做
PERSON_TABLE_TEST
CREATED_DATE DATE "yyyy/mm/dd hh24:mi:ss"
:指定日期的格式LOCATION ('person_data.csv')
,指定加載外部表所在文件夾中的person_data.csv
文件。
CREATE TABLE PERSON_TABLE_TEST ("ID" NUMBER, "NAME" VARCHAR2(50), "AGE" NUMBER, "EMAIL" VARCHAR2(100), "CREATED_DATE" DATE
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADERDEFAULT DIRECTORY PERSON_TABLE_EXTACCESS PARAMETERS(RECORDS DELIMITED BY NEWLINEFIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'(ID, NAME, AGE, EMAIL, CREATED_DATE DATE "yyyy/mm/dd hh24:mi:ss"))LOCATION ('person_data.csv')
)
REJECT LIMIT UNLIMITED;
五. 查詢
?查詢外部表是否真的創建成功
SQL> SELECT TABLE_NAME FROM USER_EXTERNAL_TABLES WHERE TABLE_NAME = 'PERSON_TABLE_TEST';TABLE_NAME
--------------------------------------------------------------------------------
PERSON_TABLE_TEST
?查詢外部表中的數據
- 就像查詢普通表一樣
- 外部表還可以和數據庫中的表進行關聯查詢
六. 刪除
?普通用戶刪除外部表,和刪除普通表相同
DROP TABLE PERSON_TABLE_TEST;
?DBA用戶刪除外部表所在的目錄
-- PERSON_TABLE_EXT 是目錄的別名
DROP DIRECTORY PERSON_TABLE_EXT;