CASE7

1. SQL脚本

case7包含两个SQL脚本,一个是删除脚本ulcase7e.sql,一个是创建脚本ulcase7s.sql

[oracle@node3 ulcase]$ cat ulcase7e.sql

set termout off
rem host write sys$output "Cleaning up Case 7 Trigger and Package." DROP PACKAGE uldemo7;
DROP TRIGGER uldemo7_emp_insert; EXIT

[oracle@node3 ulcase]$ cat ulcase7s.sql

set termout off
rem host write sys$output "Building Package and Trigger for Case 7.Please wait" CREATE OR REPLACE PACKAGE uldemo7 AS
last_deptno NUMBER;
last_job CHAR(9);
last_mgr NUMBER;
END uldemo7;
/ CREATE OR REPLACE TRIGGER uldemo7_emp_insert
BEFORE INSERT ON emp
FOR EACH ROW BEGIN
IF :new.deptno IS NOT NULL THEN
uldemo7.last_deptno := :new.deptno; -- save value for later use
ELSE
:new.deptno := uldemo7.last_deptno; -- use last valid value
END IF; IF :new.job IS NOT NULL THEN
uldemo7.last_job := :new.job; -- save value for later use
ELSE
:new.job := uldemo7.last_job; -- use last valid value
END IF; IF :new.mgr IS NOT NULL THEN
uldemo7.last_mgr := :new.mgr; -- save value for later use
ELSE
:new.mgr := uldemo7.last_mgr; -- use last valid value
END IF; END;
/ EXIT

其实,两个脚本可以并在一起,即先删除,再创建

2. 控制文件

[oracle@node3 ulcase]$ cat ulcase7.ctl

-- Copyright (c) 1991, 2004 Oracle. All rights reserved.
-- NAME
-- ulcase7.ctl - Extracting Data From a Formatted Report
--
-- DESCRIPTION
-- This case study demonstrates the following:
-- Use of SQL*Loader with an INSERT trigger.
--
-- Use of the SQL string to manipulate data.
--
-- Use of different initial and trailing delimiters.
--
-- Use of SYSDATE.
--
-- Use of the TRAILING NULLCOLS clause.
--
-- Ambiguous field length warnings.
--
-- Use of a discard file.
--
-- TO RUN THIS CASE STUDY:
-- 1. Before executing this control file, log in to SQL*Plus as
-- scott/tiger. Enter @ulcase7s to execute the SQL script for
-- this case study. This creates a BEFORE INSERT trigger that
-- is required to fill in the department number, job name,
-- and manager's number when these fields are not present on
-- a data line. When values are present, they should be saved
-- in a global variable. When values are not present, the
-- global variables are used.
--
-- 2. At the system prompt, invoke the case study as follows:
-- sqlldr USERID=scott/tiger CONTROL=ulcase7.ctl LOG=ulcase7.log
--
-- 3. After you have run the case study and finished with it, you
-- must run the ulcase7e.sql script before you can successfully
-- run other case studies. This script drops the INSERT trigger
-- and the global variables package. Log in to SQL*Plus as
-- scott/tiger. Enter @ulcase7e.
--
-- NOTES ABOUT THIS CONTROL FILE
-- The WHEN (57) = '.' clause indicates that the decimal point
-- in column 57 (the salary field) identifies a line with data
-- on it. All other lines in the report are discarded.
--
-- The TRAILING NULLCOLS clause causes SQL*Loader to treat any fields
-- that are missing at the end of a record as null. Because the
-- commission field is not present for every record, this clause says
-- to load a null commission instead of rejecting the record when only
-- seven fields are found instead of the expected eight.
--
-- The hiredate is filled in using the current system date (SYSDATE).
--
-- The specification for deptno will generate a warning message in
-- the log file because the specified length does not agree with
-- the length determined by the field's position. The specified
-- length (3) is used. The length is in bytes with the default
-- byte-length semantics. If character-length semantics were used
-- instead, this length would be in characters.
--
-- The NULLIF clause says that because the report shows only department
-- number, job, and manager when the value changes, these fields may
-- be blank. This control file causes them to be loaded as null, and
-- an insert trigger fills in the last valid value.
--
-- For the job field, the SQL string changes the job name to
-- uppercase letters.
--
-- For the mgr field, it is necessary to specify starting position.
-- If the job field and the manager field were both blank, then the
-- job field's TERMINATED BY WHITESPACE clause would cause SQL*Loader
-- to scan forward to the employee name field. Without the POSITION
-- clause, the employee name field would be mistakenly interpreted
-- as the manager field.
--
-- For the sal field, the SQL string translates the field from a
-- formatted character string into a number. The numeric value takes
-- less space and can be printed with a variety of formatting options.
--
-- For the comm field, different initial and trailing delimiters pick the
-- numeric value out of a formatted field. The SQL string then converts
-- the value to its stored form.
--
LOAD DATA
INFILE 'ulcase7.dat'
DISCARDFILE 'ulcase7.dsc'
APPEND
INTO TABLE emp
WHEN (57)='.'
TRAILING NULLCOLS
(hiredate SYSDATE,
deptno POSITION(1:2) INTEGER EXTERNAL(2)
NULLIF deptno=BLANKS,
job POSITION(7:14) CHAR TERMINATED BY WHITESPACE
NULLIF job=BLANKS "UPPER(:job)",
mgr POSITION(28:31) INTEGER EXTERNAL TERMINATED BY WHITESPACE
NULLIF mgr=BLANKS,
ename POSITION (34:41) CHAR TERMINATED BY WHITESPACE
"UPPER(:ename)",
empno INTEGER EXTERNAL TERMINATED BY WHITESPACE,
sal POSITION(51) CHAR TERMINATED BY WHITESPACE
"TO_NUMBER(:sal,'$99,999.99')",
comm INTEGER EXTERNAL ENCLOSED BY '(' AND '%'
":comm * 100"
)

3. 数据文件

[oracle@node3 ulcase]$ cat ulcase7.dat

               Today's Newly Hired Employees

Dept  Job       Manager   MgrNo  Emp Name  EmpNo  Salary/Commission
---- -------- -------- ----- -------- ----- -----------------
20 Salesman Blake 7698 Shepard 8061 $1,600.00 (3%)
Falstaff 8066 $1,250.00 (5%)
Major 8064 $1,250.00 (14%) 30 Clerk Scott 7788 Conrad 8062 $1,100.00
Ford 7369 DeSilva 8063 $800.00
Manager King 7839 Provo 8065 $2,975.00

执行后结果:

[oracle@node3 ulcase]$ sqlplus scott/tiger @ulcase7e.sql

[oracle@node3 ulcase]$ sqlplus scott/tiger @ulcase7s.sql

[oracle@node3 ulcase]$ sqlldr userid=scott/tiger control=ulcase7.ctl

SQL> select * from emp;

EMPNO ENAME     JOB         MGR HIREDATE      SAL  COMM DEPTNO
----- ---------- --------- ----- --------- ------- ----- ------
8061 SHEPARD SALESMAN 7698 19-SEP-14 1600 300 20
8066 FALSTAFF SALESMAN 7698 19-SEP-14 1250 500 20
8064 MAJOR SALESMAN 7698 19-SEP-14 1250 1400 20
8062 CONRAD CLERK 7788 19-SEP-14 1100 30
8063 DESILVA CLERK 7369 19-SEP-14 800 30
8065 PROVO MANAGER 7839 19-SEP-14 2975 30 6 rows selected.

查看日志文件:

[oracle@node3 ulcase]$ cat ulcase7.log

SQL*Loader: Release 11.2.0.1.0 - Production on Fri Sep 19 03:20:19 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Control File:   ulcase7.ctl
Data File: ulcase7.dat
Bad File: ulcase7.bad
Discard File: ulcase7.dsc
(Allow all discards) Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array: 64 rows, maximum of 256000 bytes
Continuation: none specified
Path used: Conventional Table EMP, loaded when 57:57 = 0X2e(character '.')
Insert option in effect for this table: APPEND
TRAILING NULLCOLS option in effect Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
HIREDATE SYSDATE
DEPTNO 1:2 2 CHARACTER
NULL if DEPTNO = BLANKS
JOB 7:14 8 WHT CHARACTER
NULL if JOB = BLANKS
SQL string for column : "UPPER(:job)"
MGR 28:31 4 WHT CHARACTER
NULL if MGR = BLANKS
ENAME 34:41 8 WHT CHARACTER
SQL string for column : "UPPER(:ename)"
EMPNO NEXT * WHT CHARACTER
SAL 51 * WHT CHARACTER
SQL string for column : "TO_NUMBER(:sal,'$99,999.99')"
COMM NEXT * ( CHARACTER
%
SQL string for column : ":comm * 100" Record 1: Discarded - failed all WHEN clauses.
Record 2: Discarded - failed all WHEN clauses.
Record 3: Discarded - failed all WHEN clauses.
Record 4: Discarded - failed all WHEN clauses.
Record 5: Discarded - failed all WHEN clauses.
Record 6: Discarded - failed all WHEN clauses.
Record 10: Discarded - failed all WHEN clauses. Table EMP:
6 Rows successfully loaded.
0 Rows not loaded due to data errors.
7 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null. Space allocated for bind array: 51456 bytes(64 rows)
Read buffer bytes: 1048576 Total logical records skipped: 0
Total logical records read: 13
Total logical records rejected: 0
Total logical records discarded: 7 Run began on Fri Sep 19 03:20:19 2014
Run ended on Fri Sep 19 03:20:19 2014 Elapsed time was: 00:00:00.28
CPU time was: 00:00:00.17

查看Discard file:

[oracle@node3 ulcase]$ cat ulcase7.dsc

               Today's Newly Hired Employees

Dept  Job       Manager   MgrNo  Emp Name  EmpNo  Salary/Commission
---- -------- -------- ----- -------- ----- -----------------

总结:本例中

1> TRAILING NULLCOLS指的是在一条记录中,如果最后的一列或若干列没有提供数据,则将这些列的值置为NULL.

2> WHEN (57) = '.'指的是第57位如果是个点,则代表这行是数据,没有点的行将被抛弃。

3> UPPER(:job)和UPPER(:ename)将该列值该为大写。

SQL*Loader之CASE7的更多相关文章

  1. SQL*LOADER错误总结

    在使用SQL*LOADER装载数据时,由于平面文件的多样化和数据格式问题总会遇到形形色色的一些小问题,下面是工作中累积.整理记录的遇到的一些形形色色错误.希望能对大家有些用处.(今天突然看到自己以前整 ...

  2. Bulkcopy对应的实现是Oracle的SQL*LOADER,期间造成Index Unusable,并且last_ddl_time上是不体现的

    部分项目反馈系统整体突然变慢,经查询发现一个系统核心的大数据表的索引状态全部是Unusable. 导致索引失效的直接原因:当某些操作导致数据的rowid改变,索引就会完全失效. 那什么时候会导致row ...

  3. SQL*Loader之CASE11

    CASE11 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase11.sql set termout off rem host write sys$output &q ...

  4. SQL*Loader之CASE10

    CASE10 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase10.sql rem host write sys$output "Building dem ...

  5. SQL*Loader之CASE9

    CASE9 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase9.sql set termout off rem host write sys$output &quo ...

  6. SQL*Loader之CASE8

    CASE8 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase8.sql set termout off rem host write sys$output &quo ...

  7. SQL*Loader之CASE6

    CASE6 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase6.sql set termout off rem host write sys$output &quo ...

  8. SQL*Loader之CASE5

    CASE5 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase5.sql set termout off rem host write sys$output &quo ...

  9. SQL*Loader之CASE4

    CASE4 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase4.sql set termout off rem host write sys$output &quo ...

随机推荐

  1. Python学习之路--Socket

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  2. Python成长笔记 - 基础篇 (六)python模块

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  3. [XAF] How to represent an enumeration property via a drop-down box with check boxes

    https://www.devexpress.com/Support/Center/Example/Details/E689

  4. java中String的一些方法

    1.public String(char[] c,begin,length). 从字符数组c的下标begin处开始,将长度为length的字符数组转换为字符串. begin与length可以省略,即将 ...

  5. WP7系统托盘和应用程序栏

    (一)系统托盘和应用程序栏系统托盘(1)显示系统级别的状态信息(2)Apps能隐藏和显示系统托盘Micosoft.Phone.Shell.SystemTray.IsVisible=true;应用程序栏 ...

  6. Android消息队列和Looper

    1. 什么是消息队列 消息队列在android中对应MessageQueue这个类,顾名思义,消息队列中存放了大量的消息(Message) 2.什么是消息 消息(Message)代表一个行为(what ...

  7. Windows Server 2008 系统设置集合

    1.禁用IPV6 netsh interface teredo set state disabled netsh interface 6to4 set state disabled netsh int ...

  8. 微软connect教程系列—EntityFramework7(三)

      随着Asp.NET5的开源,以及跨平台,ORM框架EF7也与时俱进,支持asp.net core,也支持关系型数据库和非关系型数据库,以及在linux和mac上跨平台使用. 下面演示的即通过使用E ...

  9. Yii2中的环境配置

    默认的Debug配置 在入口文件中 defined ( 'YII_DEBUG' ) or define ( 'YII_DEBUG', true ); defined ( 'YII_ENV' ) or ...

  10. [C#进阶系列]专题二:你知道Dictionary查找速度为什么快吗?

    一.前言 在之前有一次面试中,被问到你了解Dictionary的内部实现机制吗?当时只是简单的了问答了:Dictionary的内部结构是哈希表,从而可以快速进行查找.但是对于更深一步了解就不清楚了.所 ...