分类: Oracle
2012-05-08 23:11:17
D:\temp>sqlldr userid=test/test123control=test_main_c.ctl data=test_main_c.dat external_table=generate_only SQL*Loader: Release 10.2.0.1.0- Production on 星期日 3月 13 16:25:27 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved.
external_table=generate_only 意味着 SQLLDR 不加载任何数据,只是会生成所执行的 SQL 语句,保存在日志文件中。 程序执行完毕以后,打开当前目录下的 test_main_c.log 文件
SQL*Loader: Release 10.2.0.1.0- Production on 星期日 3月 13 16:25:27 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved.
控制文件: test_main_c.ctl 数据文件: test_main_c.dat 错误文件: test_main_c.bad 废弃文件: 未作指定 (可废弃所有记录) 要加载的数: ALL 要跳过的数: 0 允许的错误: 50 继续: 未作指定 所用路径: 外部表
表 TEST_MAIN,已加载从每个逻辑记录 插入选项对此表 INSERT生效 列名 位置 长度 中止包装数据类型 ------------------------------ --------------- ---- ---- --------------------- ID FIRST * WHT CHARACTER VALUE NEXT * WHT CHARACTER
文件需要 CREATE DIRECTORY 语句 ------------------------------------------------------------------------ CREATE DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000 AS 'D:\temp'
用于外部表的 CREATE TABLE 语句: ------------------------------------------------------------------------ CREATE TABLE "SYS_SQLLDR_X_EXT_TEST_MAIN" ( "ID"NUMBER(38), "VALUE"VARCHAR2(10) ) ORGANIZATION external ( TYPE oracle_loader DEFAULT DIRECTORYSYS_SQLLDR_XT_TMPDIR_00000 ACCESS PARAMETERS ( RECORDS DELIMITEDBY NEWLINE CHARACTERSET ZHS16GBK BADFILE'SYS_SQLLDR_XT_TMPDIR_00000':'test_main_c.bad' LOGFILE'test_main_c.log_xt' READSIZE 1048576 FIELDS TERMINATEDBY WHITESPACE LDRTRIM REJECT ROWS WITHALL NULL FIELDS ( "ID"CHAR(255) TERMINATED BYWHITESPACE, "VALUE"CHAR(255) TERMINATED BYWHITESPACE ) ) location ( 'test_main_c.dat' ) )REJECT LIMIT UNLIMITED;
用于加载内部表的INSERT 语句: ------------------------------------------------------------------------ INSERT /*+ append */ INTO TEST_MAIN ( ID, VALUE ) SELECT "ID", "VALUE" FROM "SYS_SQLLDR_X_EXT_TEST_MAIN"
用于清除由以前的语句创建的对象的语句: ------------------------------------------------------------------------ DROP TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN" DROP DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
从星期日 3月 13 16:25:27 2011 开始运行 在星期日 3月 13 16:25:27 2011 处运行结束
经过时间为: 00: 00:00.26 CPU 时间为: 00: 00: 00.08
在 SQL Plus 中,执行上面的红色的语句后,外部表就被创建了。
SQL> SELECT 2 "ID", 3 "VALUE" 4 FROM"SYS_SQLLDR_X_EXT_TEST_MAIN";
ID VALUE ---------- ---------- 1 ONE 2 TWO
SQL> select * from test_main; ID VALUE ---------- ---------- 2 ONE 3 TWO
可以使用 MERGE 来实现,如果有,就更新,如果没有,就插入。
SQL> MERGE INTO test_main 2 USINGSYS_SQLLDR_X_EXT_TEST_MAIN 3 ON ( test_main.id =SYS_SQLLDR_X_EXT_TEST_MAIN.id ) -- 条件是 id 相同 4 WHEN MATCHED THEN UPDATE SET 5 test_main.value =SYS_SQLLDR_X_EXT_TEST_MAIN.value -- 匹配的时候,更新 6 WHEN NOT MATCHED THEN INSERTVALUES( 7 SYS_SQLLDR_X_EXT_TEST_MAIN.id, SYS_SQLLDR_X_EXT_TEST_MAIN.value) -- 源表有,目标表没有,插入 8 ;
2 行已合并。
SQL> select * from test_main;
ID VALUE ---------- ---------- 1 ONE 2 TWO 3 TWO
假如需要换个数据文件 例如test_main_c2.dat SQL> ALTER TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN" 2 LOCATION( 'test_main_c2.dat');
表已更改。
SQL> SELECT 2 "ID", 3 "VALUE" 4 FROM"SYS_SQLLDR_X_EXT_TEST_MAIN" 5 ;
ID VALUE ---------- ---------- 8 Eight 10 Ten
如果需要一次处理多个文件 例如test_main_c.dat与test_main_c2.dat SQL> ALTER TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN" 2 LOCATION( 'test_main_c.dat', 'test_main_c2.dat');
表已更改。
SQL> SELECT 2 "ID", 3 "VALUE" 4 FROM"SYS_SQLLDR_X_EXT_TEST_MAIN" 5 ;
ID VALUE ---------- ---------- 1 ONE 2 TWO 8 Eight 10 Ten 测试完毕后,清理现场 DROP TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN"; DROP DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000; |