external file

外部表怎么创建的

使用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分配,只是在数据字典中有了一个外部表的定义。


你可能感兴趣的:(File,external)