其实也无所谓读书笔记,只是摘抄了些可能经常用到的一些个例子而已[@more@]
外部表:
11-1 外部表是只读的,不能对它进行任何的DML操作和索引的创建(因为它没有rowid),只能进行查询工作.它是作为对SQL*LOADER的一种补充.
11-3 为了最小化数据转化和处理的量,外部表访问驱动仅仅处理查询中引用到的列,如果这个列没有被引用,那么即使这个列的转化会出错,这个没有引用它的查询也不会返回错误
11-4 目录是谁创建的,谁有GRANT READ/WRITE ON DIRECTORY directory_name to user_name
location子句中,源文件/输出文件的命名格式directory:file,其中directory是可选的,如果没有的话,使用默认目录
源文件/输出文件必须是数据库服务器上的文件,且oracle用户需要对目录有读写的权限.
访问驱动是运行在数据库服务器内的,而不是像sql*loader之类的客户端程序.
CREATE TABLE zsj_test_ext_tab1(id NUMBER,NAME VARCHAR2(20))
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY external_table_dir
ACCESS parameters(fields terminated BY ',') 或者","
location ('ext_tab.txt')
);
RECORDS DELIMITED BY NEWLINE(默认)
badfile,discardfile是每次重写的,而logfile是追加的
12-6:newline在UNIX中是" ",在windows中是" "
12-10:假如说数据文件中任意一个记录都大于512KB,那么你必须指定一个更大的readsize(默认是524288,即512KB)
date_cache用于直接路径加载时date,timestamp要求类型转换的需要
12-16:空格 whitespace
12-28:hire_date CHAR(10) DATE_FORMAT DATE MASK "mm/dd/yyyy" 或者 hire_date DATE "mm/dd/yyyy"
CREATE TABLE zsj_test_ext_tab1
(
id NUMBER,
NAME VARCHAR2(15),
birth_day date
)
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY external_table_dir
ACCESS parameters
(records delimited BY newline fields terminated BY ',' lrtrim(id,NAME,birth_day CHAR(19) date_format DATE mask 'yyyy-mm-dd hh24:mi:ss'))
location ('ext_tab.txt')
);
CREATE TABLE zsj_test_ext_tab2
(
id NUMBER,
NAME VARCHAR2(20),
birth_day date
)
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY external_table_dir
ACCESS parameters
(
records delimited BY newline
fields terminated BY ','
lrtrim
missing field Values are NULL
(
id,NAME,birth_day DATE 'yyyy-mm-dd hh24:mi:ss'
)
)
location ('ext_tab.txt')
)
parallel
reject LIMIT UNLIMITED;
补一个通过外部表查看告警日志文件的例子:
CREATE table zsj_ora_alert
(text VARCHAR2(1000))
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY zsj_ora_alert_dir
ACCESS parameters
(
records delimited BY newline
fields (text position(1:1000))
)
location ('alert_zhao.log')
)
reject LIMIT unlimited;
相关的视图:dba_external_tables,dba_external_locations,
dba_directories
一般情况下,可以说外部表取代了sqlldr的数据加载的功能,除了以下两种情况外:
1.通过网络加载数据的情形,外部表加载数据时要求源文件必须是数据库服务器可访问的,如果你要加载的数据来自客户端的话,只能实用sqlldr
2.涉及到LOB的加载,只能使用SQL*LOADER
所以就简单的记一个SQL*LOADER加载LOB的例子:
CREATE TABLE load_lob(file_name VARCHAR2(30),created_date DATE,file_contents clob);
loader.ctl文件内容:
load data
infile 'D:zsjexternal_table_dirloader.dat' "str x'7C0D0A'"
badfile 'D:zsjexternal_table_dirloader.bad'
into table load_lob
truncate
fields terminated by ',' optionally enclosed by '"'
(
file_name "upper(:file_name)",
created_date date 'yyyy-mm-dd',
file_contents char(10000)
)
简单的源文件内容,loader.dat:
"读书笔记.txt",2007-08-20,"Oracle9i Database: Advanced Backup
and Recovery Using RMAN
Student Guide
D16507GC10
Production 1.0
March 2003
D37796
第一章:RMAN的概述
1-3:
它是一种用来备份,复原,恢复数据库文件的oracle实用工具.
它是一个pro*c应用程序(C/S应用程序),把命令行脚本转换为一系列的PL/SQL调用
它是独立于OS的
它存储它的操作信息于目标数据库的控制文件中,当然可选的是,它也可以把这些信息存储在恢复目录中
1-4,1-5:RMAN特色
新的数据文件的自动检测和包含
联机热备份期间,不生成额外的重做,也无需将表空间设置为热备份模式
1-6:RMAN的体系结构
连接到目标数据库的RMAN连接一直是SYSDBA的
"|
"my byword",2007-09-20,"生而知死,死而知耻,耻而知勇,勇而知后生!"|
"my byword also",2007-09-21,"上天给了人遐想的权力,也给了人现实的义务;
上天给了人现实的义务,也给了人遐想的权力.
其实全在于你怎样去运用罢了!"|
再简单的记一个sqlldr加载外联的LOB的例子:
CREATE TABLE zsj_lob (
file_name VARCHAR2(30) ,
file_contents BLOB );
load.ctl:
load data
infile 'D:zsjexternal_table_dirfile_dir.dat'
badfile 'D:zsjexternal_table_dirload.bad'
into table zsj_lob
truncate
(
file_name position(27:60) "upper(:file_name)",
file_path filler position(1:100),
file_contents LOBFILE(file_path) TERMINATED BY EOF
)
其中file_path filler作为中间变量,不加载的
file_dir.dat只是要加载的文件的路径
D:zsjexternal_table_dir小火车_4.gif
D:zsjexternal_table_dir静态.gif
D:zsjexternal_table_dirDatabase New Features.pdf
D:zsjexternal_table_dirscalingOracle8i.pdf
加载后的结果:
select file_name,dbms_lob.getlength(file_contents) file_length from zsj_lob;
FILE_NAME FILE_LENGTH
------------------------------ -----------
小火车_4.GIF 6833
静态.GIF 2945
DATABASE NEW FEATURES.PDF 1049953
SCALINGORACLE8I.PDF 2953233