對外部表的理解及測試,,,,如有理解不正確請大家指正
語法:
create table 表名(
列名1,列名2,......
)
organization external ###說明創建外部表
(
type 訪問類型 ###一般是 ORACLE_LOADER ,ORACLE_DATAPUMP
default directory 路徑名 ####指定默認目錄對象
access parameter ( ###數據源文件與表中行之間的映射關系
records delimited by 設置分隔符 ###一般是newline
[badfile 路徑名:'文件名'] ##存放錯誤日志的目錄和文件名
[logfile 路徑名:'文件名'] ##日志的目錄和文件名
[discardfile 路徑名:'文件名'] ###廢棄文件存放的目錄和文件名
fields terminated by '分隔符' ###設置文件中字段的分隔符
[ missing field values are null] ##無值字段的處理
[reject rows with all null fields] ##無值行的處理
( 列名1, 列名2, .....)
)
location (路徑名:'數據文件名')
)
[reject limit(或unlimited) 數值 ] ###設置多少行轉換失敗時返回oracle錯誤,默認為0
[parallel]
例子:
1.在系統下創建三個目錄
/home/oracle/test_folder/data --數據文件目錄
touch test.dat --數據文件
錄入數據
1001,abc,2013/07/12,1000
1002,abcd,2014/01/31,1000
1003,bdc,2012/03/12,1020
/home/oracle/test_folder/log --日志文件目錄
touch test.log --日志文件
/home/oracle/test_folder/bad --錯誤文件目錄
touch test.bad --錯誤文件
2.創建目錄
登陸 conn / as sysdba 下
create or replace directory DATA_DIR AS '/home/oracle/test_folder/data' ; --數據文件目錄
create or replace directory LOG_DIR AS '/home/oracle/test_folder/log' ;--日志文件目錄
create or replace directory BAD_DIR AS '/home/oracle/test_folder/bad' ;--錯誤文件目錄
3.授權
grant write ,read on directory DATA_DIR to scott;
grant write ,read on directory LOG_DIR to scott;
grant write ,read on directory BAD_DIR to scott;
3.創建表
###在scott 用戶下
create table ext_emp
(
emp_no varchar2(10),
epm_name varchar2(20),
hirte_date date,
comm number
)
organization external
(
type ORACLE_LOADER
default directory DATA_DIR
access parameters
(
records delimited by newline
badfile BAD_DIR:'test.bad'
logfile LOG_DIR:'test.log'
fields terminated by ','
(
emp_no,
epm_name,
hirte_date char date_format date mask 'yyyy-mm-dd',
comm
)
)
location('test.dat')
)
parallel
reject limit unlimited;
注意: 如果在access parameters 中 注釋一些沒有用的代碼,系統認為這是不符合規則的語句,所以產生錯誤。
原因是我在測試的時候注釋一些內容,所以查詢的時候一直報錯。
然后在網上找了報錯的原因,一般都是說這是創建目錄和授權及目錄和文件訪問權限或文件數據問題或語法引起的問題,
然后一個一個排除是否是這些原因引起錯誤,后來發現都不是這些因素。
最后重新建表才發現是注釋引起的錯誤。。。。。(抓狂啊)
例如:
access parameters
(
records delimited by newline
badfile DATA_DIR:'zlc.bad'
logfile DATA_DIR:'zlc.log'
fields terminated by ','
-- missing field values are null 這兩句可選的,
-- reject rows with all null fields
(
emp_no,
epm_name,
hirte_date char date_format date mask 'yyyy-mm-dd',
comm
)
)
如圖:
然后查看 表結構發現 訪問參數里面有注釋 ,如圖
---把上面的注釋去掉問題就解決了。
select * from ext_emp