外部表怎么创建的
使用create table ... organazation external 语句创建,你需要制定下面几个属性
type:有oracle_loader和oracle_datapump两种类型,每种类型的外部表都被他们自己的访问驱动支持
oracle_loader是默认的方式,只能数据加载,数据必须来自text数据文件。
oracle_datapump能够加载和卸载数据,数据要来自二进制dump文件。
default directory 指定外部表的读写的位置。
access parameters描述外部数据源和外部表类型。
location指定外部数据的位置+名称,如果目录对象没有指定,默认目录对象就是文件的位置
SQL> CREATE TABLE emp_load 2 (employee_number CHAR(5), 3 employee_dob CHAR(20), 4 employee_last_name CHAR(20), 5 employee_first_name CHAR(15), 6 employee_middle_name CHAR(15), 7 employee_hire_date DATE) 8 ORGANIZATION EXTERNAL 9 (TYPE ORACLE_LOADER 10 DEFAULT DIRECTORY def_dir1 11 ACCESS PARAMETERS 12 (RECORDS DELIMITED BY NEWLINE 13 FIELDS (employee_number CHAR(2), 14 employee_dob CHAR(20), 15 employee_last_name CHAR(18), 16 employee_first_name CHAR(11), 17 employee_middle_name CHAR(11), 18 employee_hire_date CHAR(10) date_format DATE mask "mm/dd/yyyy" 19 ) 20 ) 21 LOCATION ('info.dat') 22 ); Table created
数据类型转换,如果一个表有long类型列,相应的外部表的列必须是clob,操作外部表的select子查询必须用to_lob来加载列
create table long_tab_xt(long_col clob) organization external ..select to_lob(long_col) from long_tab;
使用反斜线转移字符
In SQL*Loader, you can use the backslash (\) escape character to mark a single quotation mark as a single quotation mark, as follows:
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\''
In external tables, the use of the backslash escape character within a string will raise an error. The workaround is to use double quotation marks to mark the separation string, as follows:
TERMINATED BY ',' ENCLOSED BY "'"
oracle_loader访问驱动
access参数包含注释,记录格式化,和域格式化信息
数据源的数据描述与外部表的定义是分开的,也就是:
1源文件可以包含比外部表更多或更少的域
2源数据的类型可以与外部表的数据类型不一样。
注释一定要在其他参数前面。
record_format包含了记录的信息,如格式,字符集,排除在加载之外的规则。
field_definitions描述域,如果数据文件域与外部表列有相同的名称,那么数据域就和列相对应了。
columns_transforms描述怎么加载与数据文件列不直接对应的列。使用下面的转换完成,null,constant,concat和logfile
delimited by 用来指定一个记录的结束,如果delimited by newline指定了,那么在unix平台上,newline就是"\n",在winodws上newline就是"\r\n",如果delimited by string被指定了,string可以使文本或是一系列16进制数字。
load when用来定义什么记录能被传递到数据库。trim_spec指定在字符域上空格截取的方式。missing filed values are null 记录中不全域设置成null,reject rows with all null fileds指定所有的域是null的记录不能插入。
数据转换
当null指定的时候,每一个记录的所有域都被设置成null
constant转换使用指定的字符串作为记录的值,如果外部表中的列不是字符串类型,constant字符串将会转变成列的类型。
concat转换拼接在数据文件中的常量字符串形,只有字符数据类型和在fields中列出的域才能作为拼接的一部分。
The LOBFILE
transform is used to identify a file whose contents are to be used as the value for a column in the external table. All LOBFILEs are identified by an optional directory object and a filename in the form <directory object
>:<filename
>. The following rules apply to use of the LOBFILE
transform
你可以查询,join,或排序外部表数据,你可以为外部表创建视图或同义词,但是dml操作室不可以的,同时为外部表创建索引也是不可以的。dbms_stats包可以被用来收集外部表的统计信息,analyze是不能用于外部表的。
创建外部表,使用create tale ....organization external实际上并没有真实的创建表,也就是说并没有extent分配,只是在数据字典中有了一个外部表的定义。