Oracle SQL*Loader


-- Start
SQL*Loaderは、ファイル内のデータを1つ以上のテーブルにインポートするためのツールです.C:oraclexeapporacleproduct11.2.0\server\bin\sqlldr.exe
現在、データを転送するために最も一般的に使用されているファイルフォーマットは2種類あります.1つはセパレータファイル(CSVなど)で、もう1つは定長ファイルです.次に、この2つのファイルをインポートする場合の例を見てみましょう.
まず、次の表を作成します.
CREATE TABLE EMPLOYEES
(
    EMPLOYEE_ID         NUMBER(6,0)     NOT NULL,
    FIRST_NAME          VARCHAR2(20)    NOT NULL,
    LAST_NAME           VARCHAR2(25)    NOT NULL,
    EMAIL               VARCHAR2(50)    NULL,
    HIRE_DATE           DATE            NULL,
    SALARY              NUMBER(8,2)     NULL,
    UPDATE_DATE_TIME    TIMESTAMP       NULL
);

セパレータファイル例1
次のファイルがあるとします(C:logemployees.txt)
1,bo,shang,2015-01-01,8888.88,2015-02-19 22:15:00.000
2,san,zhang,2015-02-02,9999.99,2015-02-19 22:15:00.000

次のコマンドでEMPLOYESテーブルにファイルをインポートしてみましょう.
sqlldr 
USERID=DBuser/shangbo         --           ,  
ROWS=1000                     --   1000      
BAD=C:\log\employees.bad      --            ,           
DISCARD=C:\log\employees.dsc  --                   
LOG=C:\log\employees.log      --       
CONTROL=C:\log\employees.ctl  --     ,     SQL*Loader       

ああ、使いにくいですね.それはあなたがまだemployeesを持っていないからです.ctl制御ファイル、それがなければSQL*Loaderはどのようにデータをインポートするか分かりません.さあ、次の内容をemployeesに保存しましょう.ctlはもう一度やってみます.
--         
LOAD DATA INFILE 'C:\log\employees.txt'
-- APPEND           
-- REPLACE     DELETE     ,    
-- TRUNCATE     TRUNCATE     ,    
-- INSERT       ,        
APPEND INTO TABLE employees
FIELDS TERMINATED BY ',' --                
(
	EMPLOYEE_ID         CHAR, --                
	FIRST_NAME	        , --          ,    CHAR
	LAST_NAME	        , --   ,         SQL*Loader      ,          
	HIRE_DATE	        DATE "YYYY-MM-DD",  --    DATE      
	SALARY	            CHAR, -- SQL*Loader   CHAR                 
	UPDATE_DATE_TIME    TIMESTAMP "YYYY-MM-DD HH24:MI:SS.FF3"
)

上の制御ファイルでは、EMAIL列のインポート方法を指定していないので、NULLです.カラムをNULLにしたい場合は、カラムを指定しないでください.
セパレータファイル例2
セパレータファイルのフィールドの中には、二重引用符で囲まれているものもあれば、フィールドの前または後ろにスペースがあるものもありますが、このようなファイルをどのように処理しますか?
1,"bo","shang","2015-01-01",8888.88,"2015-02-19 20:15:00.000"
2,"san","zhang","2015-02-02",9999.99,"2015-02-18 21:15:00.000"
3    ,"si"    ,"li"    ,"2015-03-01"    ,6666.66    ,"2015-02-17 22:15:00.000"
4,    "wu",    "wang",    "2015-04-02",    7777.77,    "2015-02-16 23:15:00.000"

このようなファイルをインポートするには,制御ファイルにOPTIONALLY ENCLOSED BY句を入れるだけでよい.
LOAD DATA INFILE 'C:\log\employees.txt'
REPLACE INTO TABLE employees
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
	EMPLOYEE_ID         ,
	FIRST_NAME	        ,
	LAST_NAME	        ,
	HIRE_DATE	        DATE "YYYY-MM-DD",
	SALARY	            ,
	UPDATE_DATE_TIME    TIMESTAMP "YYYY-MM-DD HH24:MI:SS.FF3"
)

セパレータファイル例3
上の2つのファイルは比較的完璧で、実際の状況は非常に複雑な場合があります.例えば、次のファイルを次の表にインポートするように要求されています.要求1.最初の行と最後の行を無視します.EMPLOYEE_IDはデータベースによって自動的に生成する.NAMEはFIRST_からNAMEとLAST_NAMEは、SHANGBO 4のように大文字に変換されます.ENGLISHを無視NAME列5.もしHIRE_DATEが空の場合はNULL 6を挿入する.SALARYが空の場合は0 7を挿入する.ENTER_USER挿入デフォルト値'SYSTEM'8.ENTER_DATE_TIMEは現在のシステム時間9を挿入する.ACTIVEがnの行であることを無視
インポートするファイル
FIRST_NAME,LAST_NAME,ENGLISH_NAME,HIRE_DATE,SALARY,ACTIVE
bo,shang,scott,2015-01-01,8888.88,y
san,zhang,mike,,,y
si    ,li    ,darren    ,    ,    ,y
wu,    wang,    eric,    2015-04-02,    7777.77,    n
END OF FILE

インポートするテーブル
CREATE TABLE EMPLOYEES
(
	EMPLOYEE_ID	    NUMBER(6,0)       NOT NULL,
	NAME	        VARCHAR2(20 BYTE) NOT NULL,
	HIRE_DATE	    DATE              NULL,
	SALARY	        NUMBER(8,2)       DEFAULT 0 NOT NULL,
	ENTER_USER	    VARCHAR2(20 BYTE) NULL,
	ENTER_DATE_TIME	TIMESTAMP(6)      NULL
);

コントロールファイル
LOAD DATA INFILE 'C:\log\employees.txt'
REPLACE INTO TABLE employees
WHEN (ACTIVE!='n')
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
	EMPLOYEE_ID     SEQUENCE(1, 1),
	FIRST_NAME	BOUNDFILLER, -- BOUNDFILLER           ,         EXPRESSION     
	LAST_NAME	BOUNDFILLER,
	NAME            EXPRESSION "UPPER(RTRIM(:LAST_NAME) || RTRIM(:FIRST_NAME))", -- EXPRESSION        SQL   
	ENGLISH_NAME    FILLER, -- FILLER           ,   BOUNDFILLER          EXPRESSION     
	HIRE_DATE	DATE "YYYY-MM-DD" NULLIF HIRE_DATE=BLANKS, -- NULLIF         HIRE_DATE           ,    NULL    
	SALARY          "NVL(:SALARY, 0)", -- :SALARY          SALARY  
	ACTIVE          FILLER, --     
	ENTER_USER      CONSTANT 'SYSTEM', -- CONSTANT          
	ENTER_DATE_TIME  EXPRESSION "CURRENT_TIMESTAMP"
)

インポートコマンド
-- SKIP=1        
sqlldr USERID=DBuser/shangbo ROWS=1000 BAD=C:\log\employees.bad DISCARD=C:\log\employees.dsc LOG=C:\log\employees.log CONTROL=C:\log\employees.ctl SKIP=1

定長ファイルの例
次に、「区切り文字ファイル例3」のファイルを定長ファイルに変更し、定長ファイルをインポートする方法を見てみましょう.
インポートするファイル
FIRST_NAME LAST_NAME ENGLISH_NAME HIRE_DATE  SALARY   ACTIVE
bo         shang     scott        2015-01-01 8888.88  y     
san        zhang     mike                             y     
si         li        darren                           y     
wu         wang      eric         2015-04-02 7777.77  n     
END OF FILE                                                 

インポートするテーブル
CREATE TABLE EMPLOYEES
(
	EMPLOYEE_ID	    NUMBER(6,0)       NOT NULL,
	NAME	        VARCHAR2(20 BYTE) NOT NULL,
	HIRE_DATE	    DATE              NULL,
	SALARY	        NUMBER(8,2)       DEFAULT 0 NOT NULL,
	ENTER_USER	    VARCHAR2(20 BYTE) NULL,
	ENTER_DATE_TIME	TIMESTAMP(6)      NULL
);

コントロールファイル
-- fix           ,62       ,        
LOAD DATA INFILE 'C:\log\employees.txt' "fix 62"
REPLACE INTO TABLE employees
WHEN (ACTIVE='y')
(
	EMPLOYEE_ID    SEQUENCE(1, 1),
	FIRST_NAME	   BOUNDFILLER POSITION(1:11), --    1  
	LAST_NAME	   BOUNDFILLER POSITION(12-21), -- :   -     
	NAME           EXPRESSION "UPPER(:LAST_NAME || :FIRST_NAME)",
	ENGLISH_NAME   FILLER POSITION(*:34), -- *            
	HIRE_DATE	POSITION(*:45) DATE "YYYY-MM-DD"  NULLIF HIRE_DATE=BLANKS, 
	SALARY         POSITION(*:54) "NVL(:SALARY, 0)",
	ACTIVE         FILLER POSITION(*),
	ENTER_USER     CONSTANT 'SYSTEM',
	ENTER_DATE_TIME  EXPRESSION "CURRENT_TIMESTAMP"
)

ダイレクトパスインポート
上記の例のインポート方法は本質的にINSERT文を構築します.Oracleでは、インポートするファイルをデータベースファイルに直接フォーマットするため、より高速な直接パスインポート方法も提供されています.
ダイレクトパスを使用してインポートする前に、次のSQLを実行してデータベースを設定する必要があります.このSQLは一度だけ設定する必要があります.
@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catldr.sql

しかし、直接パスインポートを使用すると、データベースがプライマリ・キーを自動的に生成したり、CHECKや外部キー制約を実行したりすることができず、インデックスが使用できなくなりやすくなります.したがって、通常はインデックスを削除し、インポート後にインデックスを再構築することで、インポート効率を向上させることができます.では、ダイレクトパスインポートはどのように使用しますか?簡単なのでDIRECTパラメータをtrueに設定すれば良いのですが、さらに効率を上げるためにPARALLELパラメータをtrueに設定することもできます.
次のコマンドは、直接パスを使用して「区切り文字ファイル例1」のファイルをインポートします.
-- DIRECT=true         
-- PARALLEL=true       
sqlldr USERID=DBuser/shangbo DIRECT=true PARALLEL=true ROWS=10000 BAD=C:\log\employees.bad DISCARD=C:\log\employees.dsc LOG=C:\log\employees.log CONTROL=C:\log\employees.ctl

--詳細は、「Oracle Extreme」を参照してください.
--声明:転載は出典を明記してください
-- Last edited on 2015-02-21
-- Created by ShangBo on 2015-02-20
-- End