Sunteți pe pagina 1din 122

SQL*LOADER

CONCEPTE
SQL *LOADER incarca date din fisiere externe in tabele intr-o
baza de date Oracle.
SQL*LOADER accepta la intrare date intr-o varietate de
formate, poate efectua
filtrarea(incarcarea selectiva a
datelor bazata pe valoarea lor) si poate incarca date in mai
multe tabele ale bazei de date Oracle in aceeasi sesiune de
incarcare.
Fisiere de date de
intrare

Fisierul de
control

Fisierul
log

SQL*Loader

Fisiere bad

Fisiere
discard
(refuzate)

Baza de
date
Tabela
Tabela

SQL*LOADER primeste un fisier de control ca intrare care


descrie
incarcarea
cu
SQL*LOADER.
Fisierul
de
control
specifica si fisierele de intrare.
La executie SQL*LOADER genereaza un fisier log in care scrie
informatiile despre incarcare.
Daca inregistrarile sunt refuzate (rejectate) (din cauza
datelor incorecte genereaza un fisier bad care contine
inregistrarile refuzate.
Deasemenea
genereaza
un
fisier
discard
care
contine
inregistrarile care nu au respectat criteriul de selectie.
SQL*LOADER poate sa:
y incarce date din mai multe fisiere de intrare de mai multe
tipuri
y manipuleaza inregistrari de lungime fixa, variabila sau
delimitata
y manipuleaza cimpuri de date cu functii SQL inainte de a le
insera in coloanele tabelei
y suporta un mare rang de tipuri de date incluzind DATE,
BINARY, Zecimal impachetat
y incarca mai multe tabele la aceeasi executie incarcind
rindurile selectate in fiecare tabela

y combina mai multe inregistrari fizice intr-o singura


inregistrare logica
y manipuleaza o singura inregistrare fizica cu inregistrari
logice multiple
y genereaza chei unice si secventiale in coloanele specificate
y foloseste fisiere de sistem pentru a accesa fisierele de
date
y incarca date de pe disc, banda sau pipe
y prin erorile raportate se poate ajusta incarcarea tuturor
datelor
y realizeaza o inalta performanta incarcind datele direct in
tabelele bazei de date fara procesarea Oracle
Fisierul de control SQL*LOADER
Fisierul de control scrie in SQL*LOADER limbajul de definire a
datelor (DDL), specificind cum se interpreteaza datele, care
sunt tabelele si coloanele
in care se insereaza datele si
poate include fisiere de intrare cu informatii de gestiune.
Datele pentru ca SQL*LOADER sa le incarce in baza de date
Oracle trebuie sa fie accesibile (in fisiere de sistem, pe
banda, depinzind de platforma).
SQL*LOADER solicita informatia despre datele care vor fi
incarcate, care furnizeaza instructiuni pentru maparea datelor
de intrare in coloanele tabelelor.
Aceste instructiuni sunt scrise in DDL SQL*LOADER in mod
obisnuit de DBA folosind un editor de texte. Unele din
elementele specifice in fisierul de control:
y specificari pentru incarcarea logica a datelor in tabele
y specificarea conditiilor cimpurilor
y specificarea coloanelor si cimpurilor
y specificarea pozitiei cimpurilor de date
y specificarea tipurilor de date
y specificatii despre setarea coloanelor la null sau zero
y specificatii pentru incarcarea cimpurilor blank
y specificatii despre prezervarea spatiilor libere
y specificatii despre aplicarea operatorilor SQL la cimpuri
Continutul si memorarea fisierului de control
Anumite comenzi DDL sunt obligatorii. Acestea trebuie sa
defineasca cum se gasesc datele de intrare. Trebuie de
asemenea sa defineasca corespomdenta intre datele de intrare
si tabelele sau indecsii bazei de date.
Optiunile DDL sunt disponibile sa descrie si sa manipuleze
fisierul de date. De exemplu, instructiunile pot include cum
sa se formateze sau filtreze datele, sau cum se genereaza
identificatoare unice pe un rind.
Un fisier de control poate contine date insasi dupa comenzile
DDL.
Indicatii:
y Fisierul de control este scris intr-un format liber. Aceasta
inseamna ca comenzile pot continua de pe o linie pe alta, cu
noua linie incepind dupa orice cuvint.

y Majusculele si minusculele nu sunt semnificative cu exceptia


sirurilor specificate intre ghilimele sau apostroafe.
y Pot fi incluse comentarii, prefixate de (- -). Comentariul
poate apare oriunde in cadrul liniei dupa (- -), SQL*Loader
ignora toate caracterele care urmeaza dupa (- -) pina la
sfirsitul liniei.
y Nu recunoaste comentarii in fisierele de date sau in
portiunea de date a fisierului de control. Considera liniile
duble (- -) din acestea ca fiind date.
y Cuvintele rezolvate pot fi folosite pentru denumirea
obiectelor bazei de date daca sunt cuprinse intre ghilimele
sau apostroafe.
Memorarea
Modul cum se memoreaza fisierul de control depinde de
organizarea sistemului de operare.
Trebuie sa fie localizat acolo unde SQL*Loader il poate citi.
Limbajul de definire a datelor (DDL)
DDL este folosit sa specifice modul cum SQL*Loader trebuie sa
mapeze datele de intrare si sa le incarce in coloanele tabelei
din baza de date Oracle.
Comenzile DDL servesc citeva scopuri. Unele comenzi specifica
localizarea si formatul datelor de intrare. Altele stabilesc
tabelele
la
cimpurile
unei
inregistrari
de
intrare
(specificarea cimpurilor) si specificarea tipurilor de date.
O singura comanda DDL cuprinde unul sau mai multe cuvinte
cheie. Urmatorul exemplu dintr-un fisier de control contine
citeva comenzi care specifica cum SQL*Loader incarca date
dintr-un fisier de date intr-o tabela in baza de date Oracle.
Exemplul arata cuvintele cheie LOAD, DATA, INFILE, INTO TABLE
si POSITION.
LOAD DATA
INFILE exemplu.dat
INTO TABLE emp
(empno
POSITION(01:04) INTEGER EXTERNAL,
ename
POSITION(06:15) CHAR,
job
POSITION(17:25) CHAR,
mgr
POSITION(27:30) INTEGER EXTERNAL,
sal
POSITION(32:39) DECIMAL EXTERNAL,
comm
POSITION(41:48) DECIMAL EXTERNAL,
.
Datele de intrare si fisierele de date
Datele pe care SQL*Loader le incarca intr-o baza de date
Oracle trebuie sa fie accesibile, in mod normal in fisiere pe
disc sau banda.
Formatul datelor de intrare
SQL*Loader poate incarca dare care sunt memorate in cimpuri de
date
si
inregistrari
in
formate
variate.
Formatul

inregistrarilor poate fi specificat in fisierul de control ca


o optiune de procesare a fisierului.
SQL*Loader recunoaste trei formate de inregistrari:
y format stream (implicit)
y format inregistrare de lungime fixa
y format de inregistrare de lungime variabila
Formatul stream
Inregistrarile au lungime numai cit este necesar sa contina
datele.
Fiecare inregistrare fizica se termina cu un caracter
terminator.
Uzual,
terminatorul
de
inregistrare
este
caracterul linie noua (\ n) sau retur de car urmat de linie
noua (\r\n).
Terminatorul de inregistrare este dependent de platforma.
Inregistrarea de lungime fixa
In inregistrari de lungime fixa toate inregistrarile au
aceeasi lungime. Aceasta inseamna ca fiecare inregistrare are
aceeasi lungime fixa si cimpurile din fiecare inregistrare au
acelasi tip, lungime si pozitie.

Cimpul 1
CHAR

Cimpul 2
INTEGER

| A | l | f | r | e | d |
| S | c | o | t | t |
|
| T | o | m |
|
|
|

1 | 9 | 2 | 6 |
| 3 | 0 | 1 |
|
| 1 | 9 |

In figura, fiecare inregistrare are bytes de la 1 la 6


specificati ce contin date tip CHAR, bytes de la 7 la 10
specifica date INTEGER. Cimpurile au aceeasi dimensiune in
fiecare inregistrare, indiferent de marimea datelor; cimpurile
cu dimensiune fixa; dimensiunea inregistrarii este deasemenea
fixa la 10 bytes pentru fiecare inregistrare.
Inregistrarile de lungime fixa face ca fiecare inregistrare sa
aiba acelasi numar de byte lungime si fiecare cimp din
inregistrare sa aiba acelasi tip de date si aceeasi lungime.
Specificarea optiunii de procesare din fisierul de control
trebuie sa contina sirul fin n unde n este marimea
inregistrarii. De notat, ca daca se incarca date care sunt
continute in fisierul de control (folosind INFILE), nu se
poate face incarcarea folosind lungime fixa. Urmatorul exemplu
de fisier de control si datele care vor fi incarcate din
inregistrari au lungime fixa de 11 caractere (10 caractere +
linie noua pentru usurinta editarii cu un editor de texte).
Este important de notat ca SQL*Loader nu necesita un
terminator de inregistrare pentru inregistrarile de lungime
fixa, dar daca este prezent trebuie inclus in lungimea
inregistrarii.

Exemplu de fisier de control si date


Load data
Infile exempu.dat fix 11
Badfile exemplu.bad
Discardfile exemplu.dsc
Discardmax 999
Truncate
Into table exemplu
(rown position (1-5), cmnt position (6-10))
exemplu.dat
00001abcde
00002fghij
00003klmno
00004pqrst
00005uvxyz

Inregistrari de lungime variabila


Figura arata inregistrari de lungime variabila care contin un
cimp caracter de lungime variabila si un cimp de lungime
variabila INTEGER.
In acest format lungimea fiecarui cimp si inregistrare poate
varia. De exemplu, in fiecare inregistrare primul cimp poate
specifica un sir de caractere separate printr-un spatiu de
cimpul urmator care poate fi specificat ca intreg.
Daca este utilizat ca terminator de inregistrare caracterul
specific sistemului de operare, pentru usurinta editarii,
acesta trebuie inclus in lungimea inregistrarii.
Cimpul 1
CHAR

Cimpul 2
INTEGER

| A | l | f | r | e | d |

1 | 9 | 2 | 6 |

|S|c|o|t|t|3|0|1|
| T | o | m | 1 | 9 |

Exemplu de fisier de control si date de format variabil


Exemplul foloseste inregistrari de lungime variabila care au
lungime variabila si lungimea fiecarei inregistrari este
specificata in primele 5 caractere ale inregistrarii.
Optiunea de procesare a fisierului trebuie sa contina sirul
var.
Load data
Infile exempu.dat var
Badfile exemplu.bad
Discardfile exemplu.dsc
Discardmax 999
Truncate
Into table exemplu
Field terminated by , optional enclosed by

(rown,cmnt,len)
exemplu.dat
0001500001,a,00015,
0005000002,abcdefghij,00050,
005900003,abcdefghijklmn,000059,
00005200004,abcdef,000052,
Nota: Pentru formatul inregistrarilor de lungime fixa sau
variabila nu s-a facut nici o prezumptie asupra terminatorului
la sfirsitul fiecarei inregistrari fizice.
Inregistrari logice si fizice
O inregistrare sau linie in fisier (atit in format fix cit si
variabil) este considerata o inregistrare fizica.
O inregistrare logica cuprinde una sau mai multe inregistrari
fizice.
Deseori
inregistrarile
fizice
si
logice
sunt
echivalente. Acesta este cazul cind se incarca putine coloane
scurte. Totusi, anumite inregistrari fizice trebuie combinate
sa creeze o inregistrare logica. De exemplu, o inregistrare
logica contine 24 coloane de 10 caractere cuprinse in trei
inregistrari de 80 de caractere. Deci trei inregistrari fizice
constituie o inregistrare logica.
SQL*Loader permite compunerea inregistrarii logice din mai
multe inregistrari fizice folosind continuare de cimp.
Inregistrarile
fizice
sunt
combinate
intr-o
singura
inregistrare logica cind anumite conditii ale continuatorului
de rind sunt adecvate.
Se poate specifica faptul ca o inregistrare logica poate fi
compusa din mai multe inregistrari fizice in urmatoarele
moduri:
y Un numar fix de inregistrari fizice sunt concatenate sa
formeze o inregistrare logica (nu este folosit continuatorul
de rind).
y Inregistrarile fizice sunt adaugate daca continuatorul de
rind contine un sir specific.
y Inregistrarile fizice sunt adaugate daca contin un caracter
specific ca ultimul lor caracter care nu este blank.
Date binare si date caracter
Tipul de date binar este un tip nativ.
Tipurile native pot fi implementate diferit in sisteme de
operare diferite sau arhitecturii hardware.
Datele tip caracter pot fi incluse in oricare format.
SQL*Loader poate incarca date numerice in format binar sau
caracter. Formatul caracter este referit ca format numeric
extern.
Datele
binare
nu
pot
fi
incarcate
folosind
formatul
inregistrarilor stream (inregistrarea se termina in linie
noua) incit un fisier de intrare binar poate contine
caracterul
linie
noua
care
este
incorect
considerat
delimitator de inregistrare.
Cimpurile de date

Datele (binare sau caracter) din inregistrari sunt in cimpuri.


Fiecare cimp poate fi specificat precizind pozitia si
lungimea, sau pozitia si lungimea pot varia, separate de
delimitatori, ca in exemplul urmator virgula:
1,1,2,3,5,8,13
Cimpurile marginite sunt precedate si urmate de delimitatori
de inchidere, cum ar fi ghilimelele ca in exemplul
BUNKY
Conversia datelor si specificarea tipului
Figura arata stadiile in care fiecare cimp din fisierul de
date este convertit intr-o coloana in baza de date in timpul
incarcarii conventional path (direct path este conceptual
similar dar implementarea este diferita).
Partea de sus a diagramei arata o inregistrare de date care
contine unul sau mai multe cimpuri. Translatarea cimpurilor de
date de intrare la coloanele bazei de date
Fiser de date
Cimp de date

SQL*Loader

Rinduri inserate
Date de inserat

Cum se interpreteaza
cinpurile sa recunoasca
datele

Server
Cun se convertesc si
memoreaza datele

Fisier de control
Specificarea
i
il

Specificari ale tabelelor


bazie de date
Tipuri de date ale
coloanelor

Coloanele bazei de date


Date memorate

Partea inferioara arata destinatia coloanelor bazei de date.


Figura arata diviziunea muncii intre SQL*Loader si serverul
Oracle. Specificatiile cimpurilor arata cum SQL*Loader sa
interpreteze formatul fisierului de date. Serverul Oracle
converteste datele si le insereaza in coloanele bazei de date
folosind tipul coloanelor ca ghid.
Trebuie facuta distinctia intre cimp din fisierul de date si
coloana in baza de date. De asemenea tipul cimpului definit de
SQL*Loader in fisierul de control nu este acelasi cu tipul
coloanei.
SQL*Loader foloseste specificatia cimpurilor din fisierul de
control pentru a analiza datele de intrare si a popula
vectorul de legatura care corespunde cu o comanda de inserare

SQL folosind aceste date. Comanda de inserare este folosita de


serverul Oracle pentru a fi memorate in tabela.
Serverul Oracle foloseste tipul de data al coloanei pentru a
converti datele intr-o forma finala.
Sunt doi pasi pentru conversie:
1. SQL*Loader identifica un cimp in fisierul de date,
interpreteaza datele si le transmite la serverul Oracle
printr-un buffer de legatura.
2. Serverul Oracle accepta datele si le memoreaza in baza de
date.
In
figura
sunt
definite
doua
cimpuri
CHAR
pentru
o
inregistrare.
Specificarea
cimpurilor
este
continuta
in
fisierul de control. De notat ca in fisierul de control
specificatia CHAR nu este aceeasi cu cea din baza de date. Un
cimp de date definit ca si CHAR in fisierul de control numai
informeaza SQL*Loader cum sa creeze rindurile de inserat.
Datele vor fi inserate in coloana CHAR, VARCHAR 2, N VARCHAR
sau chiar NUMBER, serverul Oracle efectueaza oricare conversie
necesara.
Implicit, SQL*Loader elimina spatiile de la inceputul datei
CHAR inainte de a o transmite bazei de date. Deci in figura,
ambele cimpuri A si B sunt transmise bazei de date ca si
cimpuri celor trei coloane. Cind se insereaza datele in tabela
se face diferenta.
Coloana A este definita in baza de date ca si coloana CHAR de
lungime fixa 5. Astfel, data aaa este aliniata la stinga in
coloana care ramine de cinci caractere.
Exemplu de conversie a cimpurilor
Cimpul1
Cimpul 2

Fisier
de date

|a|a|a| | | | | | | | | |b|b|b| | |
CHAR(5) Specificare in fisierul de control CHAR(5)
SQL*Loader

Rind inserat

aaa

Baza de date
Coloana 1

bbb

Tabela

Aaa_ _
CHAR(5)

Coloana 2
bbb

Tipul de data al coloanei

VARCHAR(5)

Server

Spatiul de la dreapta este inlocuit cu blank-uri. Coloana B


este definita de lungime variabila de maxim cinci caractere.
Datele pentru aceasta coloana sunt aliniate la dreapta, dar
lungimea ramine de trei caractere.
Numele cimpului informeaza SQL*Loader care coloane sunt
inserate in date. Deoarece primul cimp a fost specificat cu
numele A in fisierul de control, SQL*Loader stie sa insereze
datele in coloana A din baza de date.
Important de stiut:
Numele cimpurilor corespund cu numele coloanelor tabelei in
care sunt incarcate datele.
Tipul de data al cimpului informeaza SQL*Loader cum sa
trateze datele din fisierul de date. Nu este acelasi cu
tipul coloanei. Tipurile de date de la intrarea SQL*Loader
sunt independente de tipul coloanei.
Datele sunt convertite de la tipul de data specificat, in
fisierul de control la tipul de data a; coloanei din baza de
date.
Nu face distinctie intre inregistrare logica si fizica.
Inregistrari respinse
Fiserul bad
Fisierul bad contine inregistrari
SQL*Loader cit si de catre Oracle.

respinse

atit

de

catre

Inregistrari respinse de SQL*Loader


Inregistrarile sunt resinse de SQL*Loader cind formatul de
intrare este invalid. De exemplu, daca lipseste a doua
inchidere, sau daca cimpul delimitat depaseste lungimea
maxima, SQL*Loader respinge inregistrarea. Inregistrarile
respinse sunt plasate in fisierul bad.

Filtrarea inregistrarilor
Inregistrare

Citita in
SQL*Loader
Procesarea
cimpului
Refuzat (reject)
Accepta
Fisier bad
Refuzat
(discard(

SQL*Loader
Evaluarea clauzei
WHEN
Selectat

Fisier de
refuz
(discard

Refuzat (reject)

RDBMS

Inserare

Baza de
date

Inregistrari respinse de Oracle


Dupa ce o inregistrare este acceptata de SQL*Loader pentru
procesare, rindul este trimis la Oracle pentru inserare. Daca
Oracle stabileste ca rindul este valid, acesta este inserat in
baza de date. Daca nu, inregistrarea este respinsa si
SQL*Loader o scrie in fisierul bad. Un rind poate fi respins
deoarece cheia nu este unica, un cimp solicitat este null sau
pentru ca un cimp contine date invalide pentru tipul de data
Oracle. Fisierul bad este in acelasi format ca fisierele de
date. Datele respinse pot fi incarcate cu fisierul de control
existent dupa ce sunt facute corectiile.
SQL*Loader poate crea un fisier numit fisier discard.
Acest fisier se creeaza numai cind este necesar si numai daca
se specifica ca un fisier discard poate fi activat. Fisierul
discard cere inregistrari care au fost eliminate la incarcare

deoarece nu indeplineau anumite criterii de selectare a


inregistrarilor specificate in fisierul de control.
Fisierul descard contine inregistrari care nu au fost inserate
in nici o tabela din baza de date. Se poate specificaun numar
maxim, de asemenea inregistrari pe care fisierul discard le
poate accepta. Datele scrise intr-una din tabelele bazei de
date nu sunt scrise in fisierul discard.
Fisierul discard este scris in acelasi format cu fisierul de
date. Datele respinse pot fi incarcate cu fisierul de control
existent dupa corectiile necesare.
Fisierul log si inregistrarea informatiilor
Cind incepe executtia SQL*Loader creeaza un fisier log. Daca
nu se poate crea
fisierul log se termina executia. Fisierul
log contine un sumar al incarcarii, incluzind si descrierea
oricarei erori care s-a intilnit pe timpul incarcarii.
Incarcarea conventionala
fata de incarcarea directa
SQL*Loader
furnizeaza
doua
metode
de
a
incarca
date:
conventional path care foloseste comanda SQL
INSERT cu un
vector de legatura si direct path care incarca datele direct
in baza de date. Tabelele trebuie sa existe in baza de date.
SQL*Loader nu creeaza tabela, incarca in tabele existente.
Tabelele pot sa contina date sau pot sa fie goale.
Privilegii cerute pentru incarcare:

privilegiul INSERT in tabela care se incarca

privilegiul DELETE in tabela care se incarca cind se


foloseste optiunea REPLACE sau TRUNCATE pentru a goli tabela
care se incarca de datele existente inainte de a incarca
noile date in locul lor
Incarcarea conventionala
Pe timpul incarcarii conventionale, inregistrarile de intrare
sunt analizate in concordanta cu specificarea cimpurilor si
fiecare cimp este copiat intr-un vector de legatura.
Cind vectorul de legatura este plin (sau cind nu mai sunt date
de citit) este executat o inserare.
Nu sunt cerinte speciale pentru tabelele care se incarca prin
conventional path.
SQL*Loader studiu de caz
Cazul 1: Incarcarea unui sir de inregistrari in care cimpurile
sunt delimitate de virgule si pot fi incluse intre ghilimele.
Datele sunt la sfirsitul fisierului de control.
Cazul 2: Incarcarea unui fisier de date cu cimpuri de lungime
fixa, toate inregistrarile au aceeasi lungime.
Cazul 3: Incarca date din inregistrari cu cimpuri delimitate
si numar de secventa. Datele sunt la sfirsitul fisierul de
control.
Cazul 4: Continua mai multe inregistrari fizice intr-o
inregistrare logica corespunzind la un rind al bazei de date.
Cazul 5: Incarca date in mai multe tabele la o rulare.
Cazul 6: Incarcarea datelor folosind metoda directa.

Cazul 7: Extragerea datelor dintr-un raport formatat.


Cazul 8: Incarcarea unui fisier de date folosind inregistrari
de lungime fixa si cimpurile definite explicit ca pozitie si
tip de date.

Cazul 1: Incarcarea datelor de lungime variabila


Fisierul de control identifica o tabela si trei coloane care
se incarca.
Datele care se incarca sunt incluse in fisierul de control.
Incarca datele dintr-un sir cu doua tipuri de delimitatori
specificati - terminat si inchis.
Fisierul de control

1.
2.
3.
4.
5.
6.

LOAD DATA
INFILE *
INTO TABLE dept
FIELDS TERMINATED BY ' ,' OPTIONALLY ENCLOSED BY ' " '
(deptno, dname, loc)
BEGINDATA
12, RESEARCH, "SARATOGA"
10, "ACCOUNTING", CLEVELAND
11, "ART", SALEM
13, FINANCE, "BOSTON"
21, "SALES" ,PHILA.
22, "SALES" ,ROCHESTER
42, "INT'L", "SAN FRAN"

Note:
1. Comanda LOAD DATA este ceruta la inceputul fisierului de
control.
2. INFILE* specifica ca datele sunt gasite in fisierul de
control si nu intr-un fiser extern.
3. Comanda INTO TABLE este ceruta sa identifice tabela care se
incarca (DEPT). Implicit SQL*Loader solicita ca tabela sa fie
goala inainte de inserarea articolelor.
4. FIELDS TERMINATED BY specifica ca datelele se termina prin
virgula, dar pot fi incluse si intre ghilimele. Tipul de data
pentru toate cimpurile este implicit CHAR
5. Numele coloanelor care se incarca sunt cuprinse intre
paranteze. Deoarece nu s-a specificat tipul, implicit este
caracter de lungime 256.
6. BEGINDATA specifica inceputul datelor.
Lansarea SQL*Loader
Sqlldr userid=scott/tiger control=ulcase1.ctl log=ulcase1.log
SQL*Loader incarca tabela DEPT si creeaza fisierul log.

Fisierul log
Control File:
ULCASE1.CTL
Data File :
ULCASE1.DAT
Bad File:
ULCASE1.BAD
Discard File:
none specified
(Allow all discards)
Number to load:
ALL
Number to skip:
0
Errors allowed:
50
Bind array:
64 rows, maximum of 65336 bytes
Continuation:
none specified
Pat used:
Conventional
Table DEPT, loaded from every logical record.
Insert option in effect for this table: INSERT
Column Name
-----------1.DEPTNO
DNAME
2.LOC

Position
-------FIRST
NEXT
NEXT

Len
--*
*
*

Term
----,
,
WHT

Encl
Datatype
-----------O (")
CHARACTER
O (")
CHARACTER
O (")
CHARACTER

Table DEPT:
7 Rows successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses werw failed.
0 Rows not loaded because all fields werw null.
Space allocated for bind array: 49920 bytes (64 rows)
Space allocated for memory besides bind array: 76000 bytes
Total logical recordsskipped:
0
Totallogocal records read:
7
Total logical records rejected:
0
Total logical records discarded: 0
Note:
1. Pozitia si lungimea fiecarui cimp este determinata pentru
fiecare inregistrare pe baza delimitatorilor in fisierul de
intrare.
2. WHT semnifica, ca cimpul LOC este terminat cu spatiu.
Notatia O() specifica inchiderea optionala intre ghilimele.
Cazul 2: Fisierul de control ULCASE2.CTL
1.
2.
3.
4.

LOAD DATA
INFILE 'ulcase2.dat'
INTO TABLE emp
(empno
POSITION (01:04)
ename
POSITION (06:15)
job
POSITION (17:25)
mgr
POSITION (27:30)
sal
POSITION (32:39)
comm
POSITION (41:48)
5. deptno
POSITION (50:51)
Note:
1. LOAD DATA este cerut la inceputul

INTEGER
CHAR,
CHAR,
INTEGER
DECIMAL
DECIMAL
INTEGER

EXTERNAL,
EXTERNAL,
EXTERNAL,
EXTERNAL,
EXTERNAL)

fisierului.

2. Numele fisierului care contine datele se gaseste dupa


cuvintul cheie INFILE.
3. INTO TABLE identifica tabela care se incarca.
4. Liniile 4 si 5 identifica numele coloanei si locatia datelor
in fisierul de date care se incarca.EMP NO, ENAME, JOB sunt
numele coloanelor din tabela EMP. Tipirile de date (INTEGER
EXTERNAL, CHAR, DECIMAL EXTERNAL) identifica tipul datelor in
fisierul de date nu in coloanele corespndente din tabela EMP.
5. Specificarea coloanelor este cuprinsa intre paranteze.
Fisierul de date
Liniile de date in fisierul ULCASE2.DAT. Cimpurile Blank sunt
setate automat la null.
782 CLARK
7839 KING
7934 MILLER
7566 JONES
7499 ALLEN
7654 MARTIN

MANAGER
PRESIDENT
CLERK
MANAGER
SALESMAN
SALESMAN

7839
7782
7839
7698
7698

2572.50
5500.00
920.00
3123.75
1600.00
1312.50

300.00
1400.00

10
10
10
20
30
30

Lansarea SQL*Loader
sqlldr userid=scott/tiger control=ulcase2.ctl log=ulcase.2 log
Inregistrarile incarcate in tabele EMP contine numarul
departamentului. In afara cazului cind tabela EMP este
incarcata
prima,
verificarea
referentiala
refuza
inregistrarile.
Fisierul log
Control File:
ULCASE2.CTL
Data File:
ULCASE2.DAT
Bad File:
ULCASE2.BAD
Discard File:
none specified
(Allow all discards)
Number to load:
ALL
Number to skip:
0
Errors allowed:
50
Bind array:
64 rows, maximum of 65336 bytes
Continuation:
none specified
Path used:
Conventional
Table EMP, loaded every logical record.
Insert option in effect for this table: INSERT
Column name
----------EMPNO
ENAME
JOB
MGR
SAL
COM
DEPTNO

Position
-------1:14
6:15
17:25
27:30
32:39
41:48
50:51

Len
--4
10
9
4
8
8
2

Term
----

Encl
----

Datatype
-------CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER

Table EMP:
7 Rows successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Space allocated for bind array
4352 bytes (64 rows)

Space
Total
Total
Total
Total

allocated for memory besides bind array:


logical records skipped:
0
logical records read:
7
logical records rejected:
0
logical records discarded:
0

37051 bytes

Cazul 3: Incarcarea unui fisier in format liber,


delimitat
Incarca datele inchise si terminate.
Incarca datele folosind tipul DATE.
Foloseste nemarul SEQUENCE pentru a genera chei unice pentru
incarcarea datelor.
Foloseste APPEND pentru a indica ca tabela nu trebuie sa fie
goala inainte de a insera inregistrarile noi.
Foloseste Comment in fisierul de control.
Suprascrie specificatiile generale in declaratii pentru
fiecare cimp individual.
Fisierul de control
Datele au un format diferit. Unele sunt inchise intre
ghilimele, altele prin virgula si variabile DEPTNO si PROJNO
sunt separate prin doua puncte.
1)----Variable-length, delimited and enclosed data format
LOAD DATA
2) INFILE *
3) APPEND
INTO TABLE emp
4) FIELDS TERMINTED BY "," OPTIONALLY ENCLOSED BY ' " '
( empno, ename, job, mgr,
5) DATE(20) "DD-Month-YYYY",
sal, comm, deptno CHAR TERMINATED BY ' : ',
projno,
6) loadseq SEQUNCE(MAX,1) )
7) BGINDATA
8) 7782, "Clark", "Manager", 7839, 09-June-1981, 2572.50, , 10:101
7839, "King", "President", , 17-November-1981,5500.00, , 10:102
7934, "Miller", "Clerk", 7782, 23-January-1982, 920.00, , 10:102
7566, "Jones", "Manager", 7839, 02-April-1981, 3123.75, , 20:101
7499, "Allen", "Salesman", 7698, 20-February-1981, 1600.00,
(aceeasi linie continua)
300.00, 30:103
7654, "Martin", "Salesman", 7698, 28-September-1981, 1312.50,
(aceeasi linie continua)
1400.00, 3:103
7658, "Chan", "Analyst", 7566, 03-May-1982, 3450, , 20:101

Note:
1. Comentariile pot apare oriunde in liniile de comanda ale
fisierului, dar nu trebuie sa apara in date.
Sunt precedate
de liniuta dubla care poate apare oriunde in linie.
2. INFILE* specifica ca datele sunt la sfirsitul fisierului de
control.
3. Se specifica ca datele se incarca chiar daca tabela contine
rinduri, asta insemnind ca tabela nu este necesar sa fie
goala.

4. Terminatorul implicit pentru rinduri este virgula, dar


anumite cimpuri pot fi delimitate de ghilimele.
5. Datele care se incarca in coloana HIREDATE apar in format
DD-Month-YYYY. Lungimea maxima a cimpului de date este maxim
20. Daca o lungime nu s-a specificat, lungimea depinde de
lungimea mastii.
6.Functia SEQUENCE genereaza o valoare unica in coloana
LOADSEQ.
Functia cauta valoarea maxima din coloana LOADSEQ si-i adauga
un
increment (1) pentru a obtine valoarea LOADSEQ pentru
fiecare rind inserat.
7.BEGINDATA specifica sfirsitul informatiilor de control si
inceputul datelor.
8.Cu toate ca fiecare inregistrare logica este egala cu o
inregistrare fizica, cimpurile variaza
in
dimensiune
astfel ca unele inregistrari sunt mai mari decit altele. Unele
rinduri au valoarea null pentru COMM.
Lansarea loader-ului
sqlldr userid=scott/tiger control=ulcase3.ctl log=ulcase3.log
Fisierul log
Control File:
ULCASE3.CTL
Data File:
ULCASE3.DAT
Bad File:
ULCASE3.BAD
Discard File:
none specified
(Allow all discards)
Number to load:
ALL
Number to skip:
0
Errors allowed:
50
Bind array:
64 rows, maximum of 65336 bytes
Continuation:
none specified
Path used:
Conventional
Table EMP, loaded from every logical record.
Insert option in effect for this table: APPEND
Column Name
----------EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
PROJNO
LOADSEQ

Position
Len
----------FIRST
*
NEXT
*
NEXT
*
NEXT
*
NEXT
20
NEXT
*
NEXT
*
NEXT
*
NEXT
*
SEQUNCE (MAX,1)

Term
---,
,
,
,
,
,
,
,
,

Encl
---O(")
O(")
O(")
O(")
O(")
O(")
O(")
O(")
O(")

Datatype
-------CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER

Table EMP:
7 Rows seccessfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Space allocated for bind array:
63810 bytes (30 rows)
Space allocated for memory besides bind array: 94391 bytes
Total logical records skipped:
0

Total logical records read:


Total logical records rejected:
Total logical records discarded:

7
0
0

Cazul 4:
Combina mai multe inregistrari fizice formind o inregistrare
logica cu CONTINUEIF.
Insereaza numere negative.
Indica cu REPLACE ca tabela trebuie golita inaintea
inserarii datelor noi.
Specifica un fisier de refuz (discard) folosind DISCARDFILE.
Specifica numarul maxim de rinduri refuzate folosind
DISCARDMAX.
Refuza rindurile care introduc valori duble intr-un index
unic sau sunt cu valori invalide.

Fisierul de control
LOAD DATA
INFILE 'ulcase4.dat'
1) DISCARDFILE 'ulcase4.dsc'
2) DISCARDMAX 999
3) REPLACE
4) CONTINUEIF THIS (1) = ' * '
INTO TABLE emp
(empno
POSITION(1:4)
INTEGER
ename
POSITION(6:15)
CHAR,
job
POSITION(17:25)
CHAR,
mgr
POSITION(27:30)
INTEGER
sal
POSITION(32:39)
DECIMAL
comm
POSITION(41:48)
DECIMAL
deptno
POSITION(50:51)
INTEGER
hiredate POSITION(52:60)
INTEGER

EXTERNAL,
EXTERNAL,
EXTERNAL,
EXTERNAL,
EXTERNAL,
EXTERNAL)

Note:
1. DISCARDFILE specifica un fisier de refuz numit ULCASE 4.DSC.
2. DISCARDMAX specifica maxim 999 rinduri refuzate permise
inainte de a se termina executia.
3. REPLACE specifica ca daca sunt date in tabelele care se
incarca , SQL*Loader trebuie sa sterga datele inainte de a
incarca datele noi.
4. CONTINUEIF THIS specifica ca daca un asterix este gasit in
coloana 1 a inregistrarii curente, atunci urmatoarea
inregistrare fizica dupa aceasta inregistrare este adaugata la
aceasta.De notat ca coloana 1 din fiecare inregistrare fizica
trebuie sa contina sau un asterix sau nici o valoare.
Fisierul de date
De notat: asterixul in prima pozitie si indicatorul de linie
noua este in pozitia 20.
De notat: comisionul lui CLARK este -10 si SQL*Loader incarca
valoarea, convertind la un numar negativ.

*7782 CLARK
MANAGER
7839
*7839 KING
PRESIDENT
*7934 MILLER
CLERK
7782
*7566 JONES
MANAGER
7839
*7499 ALLEN
SALESMAN 7698
*MARTIN
SALESMAN 7698
*7658 CHAN
ANALYST
7566
* CHEN
ANALYST
7566
* CHIN
ANALYST
7566

2572.50

-10

2512-NOV-85

5500.00

2505-APR-83

920.00

2508-MAY-80

3123.75

2517-JUL-85

1600.00

300.00

1312.50

1400.00

25-JUN-84
2521-DEC-85

3450.00

2516-FEB-84

3450.00

2516-FEB-84

3450.00

2516-FEB-84

Inregistrarile refuzate
Ultimele doua inregistrari se presupune ca au fost refuzate.
Daca este un index unic creat in coloana EMPNO, atunci
inregistrarea pentru CHIN este refuzata deoarece EMPNO este
identic cu a lui CHAN. Daca EMPNO este definita ca NOT NULL,
inregistrarea CHEN este refuzata deoarece nu are valoare in
EMPNO.
Lansarea SQL*Loader
sqlldr userid=scott/tiger control=ucase4.ctl log ucase4.log
Fisierul log
Control File:
Data File:
Bad File:
Discard File:
(Allow 999 discards)
Number to load:
Number to skip:
Errors allowed:
Bind array:
Continuation:

ULCASE4.CTL
ULCASE4.DAT
ULCASE4.BAD
ULCASE4.DSC

ALL
0
50
64 rows, maximum of 65336 bytes
1:1 = 0x2a (character ' * ' ),
in current physical record
Path used:
Conventional
Table EMP, loaded from every logical record.
Insert option in effect for this table: REPLACE

Column Name
-----------EMPNO
ENAME
JOB
MGR
SAL
COMM

Position
-------1:4
6:15
17:25
27:30
32:39
41:48

Len
--4
10
9
4
8
8

Term
----

Encl
----

Datatype
-------------CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER

DEPTNO
HIREDATE

50:51
52:60

2
9

CHARACTER
CHARACTER

RECORD 8: Rejected on table EMP, ---EMPNO null


ORA-01400: mandatory (NOT NULL) column is missing or NULL
during insert
Record 9: Rejected - Error on table EMP. ----EMPNO not unique
ORA-00001:unique constraint (SCOTT.EMPIX) violated
Table EMP:
7 Rows successfully loaded.
2 Rows not loaded due to data errors.
0 Row not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Space allocated for bind array: 5120 bytes (64 rows)
Space allocated for memory besides bind array: 40195 bytes
Total logical records skipped:
0
Total logical records read:
9
Total logical records rejected:
2
Total logical records discarded:
0
Fisierul bad
*
*

CHEN
7566
CHIN
7566

ANALYST
3450.00
ANALYST
3450.00

2516-FEB-84
2516-FEB-84

Cazul 5: Incarcarea in mai multe tabele


Incarca mai multe tabele.
Incarca datele in tabele normalizate - o inregistrare din
fisier poate genera mai multe rinduri in baza de date.
Din fiecare inregistrare fizica deriva mai multe
inregistrari logice.
Se foloseste clauza WHEN.
Se incarca acelasi cimp (EMPNO) in mai multe tabele.

Fisierul de control
----Loads EMP records from first 23 characters
----Creates and loads PROJ records for each PROJNO listed
----for each employee
LOAD DATA
INFILE 'ulcase5.dat'
BADFILE 'ulcase5.bad'
DISCARDFILE 'lcase5.dsc'
1) REPLACE
2) INTO TABLE emp
(empno
POSITION (1:4)
INTEGER EXTERNAL
ename
POSITION (6:15)
CHAR,
deptno
POSITION (17:18
CHAR,
mgr
POSITION (20:23
INTEGER EXTERNAL)
2) INTO TABLE proj
---PROJ has two columns, both not null: EMPNO and PROJNO
3) WHEN projno !='
'

(empno
POSITION(1:4)
3) projno
POSITION(25:27)
3) INTO TABLE proj
4) WHEN projno != '
'
(empno
POSITION(1:4)
4) projno
POSITION(29:31)
2) INTO TABLE proj
5) WHEN projno !='
'
(empno POSITION(1:4)
5) projno POSITION(33:35)

INTEGER EXTERNAL,
INTEGER EXTERNAL)---lst proj
INTEGER EXTERNAL,
INTEGER EXTERNAL)

---2nd proj

INTEGER EXTERNAL,
INTEGRAL EXTERNAL) ---3rd proj

Note:
1. REPLACE specifica ca daca exista date in tabelele care se
incarca (EMP si PROJ), SQL*Loader trebuie sa la stearga
inainte de a incarca datele noi.
2. Mai multe clauze INTO incarca doua tabele, EMP si PROJ.
Acelasi set de inregistrari este procesat de trei ori,
folosind diferite combinatii de coloane de fiecare data pentru
a incarca tabela PROJ.
3. WHEN incarca rindurile care au valori numele in numarul
proiectului. Cind PROJNO este definit in coloanele 25....27,
rindurile sunt inserate in PROJ numai daca acestea au valori
in aceste coloane.
4. Cind PROJNO este definit in coloanele 29...31, rindurile
sunt incarcate numai daca sunt valori in aceste coloane.
5. Cind PROJNO este definit in coloanele 33...35, rindurile
sunt inserate in PROJ numai daca sunt valori in aceste
coloane.
Fisierul de date
1234 BAKER
10 9999 101 102 103
1234 JOKER
10 9999 777 888 999
2664 YOUNG
20 2893 425 abc 102
5321 OTOOLE
10 9999 321
55
40
2134 FARMER
20 4555 236 456
2414 LITTLE
20 5634 236 456
40
6542 LEE
10 4532 102 321
14
2849 EDDS
xx 4555
294
40
4532 PERKINS
10 9999
40
1244 HUNT
11 3452 665 133 456
123
DOOLITTLE
12 9940
132
1453 MACDONALD
12 5532
200
Lansarea SQL*Loader
sqlldr userid=scott/tiger control=ulcase5.ctl log=ulcase5.log
Fisierul log
Control File:
Data File:
Bad File:
Discard File:
(Allow all discards)
Number to load:
Number to skip:

ULCASE5.CTL
ULCASE5.DAT
ULCASE5.BAD
ULCASE5.DSC
ALL
0

Errors allowed:
50
Bind array:
64 rows, maximum of 65336 bytes
Continuation:
none spcified
Path used:
Conventional
Table EMP, loaded from every logical record.
Insert option in effect for this table: REPLACE
Column Name
-----------EMPNO
ENAME
DEPTNO
MGR

Position Len
-------- --1:4
4
6:15
10
17:18
2
20:23
4

Term
----

Encl
----

Datatype
--------CHARACTER
CHARACTER
CHARACTER
CHARACTER

Table PROJ, loaded when PROJNO != 0x202020( character '


Insert option in effect for this table: REPLACE
Column Name
-----------EMPNO
PROJNO

Position Len
-------- --1:4
25:27

Term
---4
3

Encl
----

Datatype
--------CHARACTER
CHARACTER

Table PROJ, loaded when PROJNO != 0x202020(character '


Insert option in effect for this table: REPLACE
Column Name
-----------EMPNO
PROJNO

Position Len
-------- --1:4
29:31

Term
---4
3

Encl
----

' )

' )

Datatype
--------CHARACTER
CHARACTER

Table PROJ, loaded when PROJNO != 0x202020(character ' ' )


Insert option in effect for this table: REPLACE
Column Name
Position
Len Column Name
Column Name
-----------EMPNO
PROJNO

1)
1)
1)
1)
1)
1)
1)
2)
2)
2)
2)
3)
3)
3)
3)
4)
4)
4)
4)
5)
5)
5)

Position Len
-------- --1:4
33:35

Term
---4
3

Encl
----

Datatype
--------CHARACTER
CHARACTER

Record: Rejected - Erroron table EMP, column DEPTNO


ORA-00001: unique constraint (SCOTT.EMPIX) violated
ORA-01722: invalid number
Record 8: Rejected - Error on table EMP, olumn DEPTNO.
ORA-01722: invalid number
Record 3: Rejected - Error ontale PROJ, column PROJNO.
ORA-01722: invalid number
Table EMP:
9 Rows successfully loaded.
3 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Table PROJ:
7 Rows successfully loaded.
2 Rows not loaded due to data errors.
3 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Table PROJ:
7 Rows successfully loaded.
3 Rows not loaded due to data errors.
2 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Table PROJ:
6 Rows successfully loaded.
3 Rows not loaded due to data errors.
3 Rows not loaded because all WHEN clauses were failed.

5)
0 Rows not loaded because all fields were null.
Space allocated for bind array:
5120 bytes (64 rows)
Space allocated for memory besides bind array:46763 bytes
Total logical records skipped:
0
Total logical records read:
12
Total logical records rejected:
3
Total logical records discarded:
0
Note:
1. Erorile nu sunt intilnite in aceeasi ordine in care sunt
inregistrarile fizice. Fisierele bad si discard contin
inregistrari in aceeasi ordine in care apar in fisierul log.
2. Din 12 inregistrari logice de intrare, au fost refuzate trei
(JOKER, YOUNG si EDDS). Pentru aceste inregistrari nu s-a
incarcat nici o data.
3. Doua inregistrari (JOKER si YOUNG) au fost refuzate din
cauza datelor eronate, noua inregistrari satisfac conditia din
clauza WHEN.
4. Zece inregistrari satisfac criteriul din clauza WHEN si trei
(JOKER, YOUNG si EDDS) au fost refuzare.
5. Noua inregistrari satisfac criteriul din clauza WHEN si trei
(JOKER, YOUNG si EDDS) sunt refuzate din cauza datelor
eronate.
Tabelele incarcate:
SQL>SELECT empno, ename, mgr, deptno FROM emp;
EMPNO
-----------1234
5321
2134
2414
6542
4532
1244
123
1453

ENAME
----BAKER
0TOOLE
FARMER
LITTLE
LEE
PERKINS
HUNT
DOOLITTLE
ALBERT

MGR
---9999
9999
4555
5634
4532
9999
3452
9940
5532

DEPTNO
-------------10
10
20
20
10
10
11
12
25

SQL> SELECT * from PROJ order by EMPNO;


EMPNO
-----123
1234
1234
1234
1244
1244
1244
1453
2134
2134

PROJNO
------132
101
103
102
665
456
133
200
236
456

2414
2414
2414
4532
5321
5321
5321
6542
6542
6542

236
456
40
40
321
40
55
102
14
321

Cazul 6: Folosirea incarcarii directe


Se foloseste metoda directa pentru a incarca si indexa
datele.
Cum se specifica indecsii pentru care sunt sortate datele.
Incarcarea cimpurilor care contin numai blank-uri ca null.
Clauza NULL IF
Nota: Se specifica numele tabelei in care se incarca datele,
astfel se obtine eroarea LDR_927. Specificarea paramerului
DIRECT=TRUE ca parametrul in linia de comanda nu este o
optiune cind se incarca intr-un sinonim pentru o tabela.
Fisierul de control ULCASE6.ctl
LOAD DATA
INFILE ' ulcase6.dat'
INSERT
INTO TABLE emp
1)
SORTED INDEXES (empix)
2)
(empno POSITION (01:04)
INTEGER EXTERNAL NULLIF
mgr=BLANKS,
ename
POSITION(06:15)
CHAR,
job
POSITION(17:25)
CHAR,
mgr
POSITION/(27:30)
INTEGER EXTERNAL NULLIF
mgr=BLANKS,
sal
POSITION(32:39)
DECIMAL EXTERNAL NULLIF
sal=BLANKS,
comm
POSITION(41:48)
DECIMAL EXTERNAL NULLIF
comm=BLANKS,
deptno
POSITION(50:51)
INTEGER EXTERNAL NULLIF
deptno=BLANKS)
1. Clauza SORTED INDEXES identifica indecsii in care sunt
presortate datele. Clauza indica ca fisierul de date este
sortat in coloana EMPIX. Clauza permite SQL*Loader sa
optimizeze crearea indexului eliminind faza de sortare pentru
aceste date cind se foloseste metoda directa.
2. Clauza NULL IF.......BLANKS specifica ca coloanele sunt
incarcate ca NULL data, cimpul de date din fisier contine
numai blank-uri.
Lansarea SQL*Loader
sql ldr scott/tiger control=ulcase6.ctl direct=true log
ulcase6.log
Fisierul log

Control File:
ULCASE6.CTL
Data File:
ULCASE6.DAT
Bad File:
ULCASE6.BAD
Discard File:
none specified
(Alow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed:
50
Continuation:
none specified
Path used:
Direct
Table EMP, loaded from every logical record.
Insert option in effect for this table:REPLACE
Column Name
Position
Len
Term
Encl
Datatype
------------------------------------------------------EMPNO
1:4
4
CHARACTER
ENAME
6:15
10
CHARACTER
JOB
17:25
9
CHARACTER
MGR
27:30
4
CHARACTER
SAL
32:39
8
CHARACTER
COMM
41:48
8
CHARACTER
DEPTNO
50:51
2
CHARACTER
Column EMPNO is NULL if EMPNO = BLANKS
Column MGR is NULL if MGR = BLANKS
Column SAL is NULL if SAL = BLANKS
Column COMM is NULL if COMM = BLANKS
Column DEPTNO is NULL if DEPTNO = BLANKS
The following index(es) on table EMP were processed:
Index EMPIX was loaded.
Table EMP:
7 Rows successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Bind array size not used direct path.
Space allocated for memory besides bind array:
bytes
Total logical records skipped:
0
Total logical records read:
7
Total logical records rejected:
0
Total logical records discarded:
0
Cazul 7: Extragerea datelor dintr-un raport formatat

164342

Se foloseste SYSDATE.
Se foloseste clauza TRAILING NULLCOLS.
Atentionari pentru lungimi de cimpuri ambigue.
Fisierul de date
Today's Newly Hired Employees
Dept Job
Manager MgrNo Emp Name
----- ---------------- --------- -----------20 Salesman
Blake
7698
Shepard
Falstaff
Major
30 Clerk
Scott
7788
Conrad
Ford
De Silva
Manager
King
7839
Provo

EmpNo
---------8061
8066
8064
8062
7369
8063
8065

Salary
------$1,600.00
$1,250.00
$1,250.00
$1,100.00

(Comm)
--------(3%)
(5%)
(14%)

$800.00
$2,975.00

Trigger-ul INSERT
In acest caz un tigger BEFORE INSERT este necesar pentru a introduce numarul
departamentului, numarul job-ului si numarul managerului cind aceste cimpuri nu sunt
prezente in linia de date. Cind valorile nu sunt prezente, este folosita variabila globala.
Trigger-ul INSERT si pachetul care defineste variabila globala:
CREATE OR REPLACE PACKAGE uldemo7 AS ------Global Package Variables
last_deptno
NUMBER(2);
last_job
VARCHAR2(9);
last_mgr
NUMBER(4);
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
ELSE
: new.deptno : = uldemo7.last_deptno; -- use last valid value
END IF;
IF : new.job IS NOT NULL THEN
uldemo7.last_job : = :new.job;
ELSE
: new.job : = uldemo7.last_job;
END IF;
IF : new.mgr IS NOT NULL THEN
uldemo7.last_mgr : = : new.mgr;
ELSE
: news.mgr : = uldemo7.last_mgr;
END IF;
END;
/

Nota: Este importanta faza FOR EACH ROW. Daca aceasta nu este specificata, trigger-ul
INSERT se va declansa o data numai pentru vectorul de inserare, deoarece SQL*Loader
foloseste un vector de interfata.
Fisierul de control ULCASE7.ctl
LOAD DATA
INFILE ' ULCASE7.DAT'
APPEND
INTO TABLE emp
1) WHEN (57)= ' . '
2) TRAILING NULLCOLS
3) (hiredate SYSDATE,
4)
deptno POSITION (1:2) INTEGER EXTERNAL(3)
5)
NULLIF deptno=BLANKS,
job
POSITION(7:14) CHAR TERMINATED BY WHITESPACE
6)
NULLIF job=BLANKS "UPPER( : job)",
7)
mgr POSITION(28:31) INTEGER EXTERNAL
TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,
ename POSITION(34:41) CHAR
TERMINATED BY WHITESPACE "UPPER(:ename)",
empno POSITION(45) INTEGER EXTERNAL
TERMINATED BY WHITESPACE,
sal
POSITION(51) CHAR TERMINATED BYWHITESPACE
8)
"TO_NUMBER(:sal, '$99,999.99')",
9) comm INTEGER EXTERNAL ENCLOSED BY ' (' AND'%'
"comm * 100"
Note:
1. Punctul zecimal din coloana 57(cimpul salary) identifica o linie cu date. Toate celelalte
linii din raport sunt refuzate.
2. Clauza TRAILING NULLCOLS determina SQL*Loader sa trateze oricare cimp care
lipseste la sfirsitul inregistrarii ca null. Deoarece cimpul comision nu este prezent in fiecare
inregistrare, clauza lasa sa se incarce cimpul comision ca null, in loc sa refuze inregistrarea
cind sunt gasite numai sase cimpuri pe cind sunt asteptati sapte.
3. Data platii pentru salariat este incarcata folosind data curenta a sistemului.
4. Specificarea genereaza un mesaj de atentionare, deoarece lungimea specificata nu
corespunde cu lungimea determinata de pozitia cimpului. Este folosita lungimea 3 cca
specificata.
5. Deoarece raportul arata numai numarul departamentului job-ului si managerului cind se
schimba valorile, aceste cimpuri pot fi blank. Fisierul de control determina ca acestea sa fie
incarcate ca null si nu tigger de inserare RDBMS incarca ultima valoare valida.
6. Sirul SQL schimba numele job-ului in litere mari.
7. Este necesar aici sa se specifice pozitia de inceput. Daca cimpul job si cimpul manager
sunt ambele blank, atunci clauza cimpului job TERMINATED BY BLANKS va determina
SQL*Loader sa scaneze inapoi cimpul numele angajatului. Fara clauza POSITION, cimpul
numele angajatului va fi interpretat gresit ca si cimp manager.
8. Sirul SQL translateaza un cimp dintr-un sir de caractere formatat intr-un numar. Valorile
numerice ocupa mai putin spatiu si pot fi afisate cu o varietate de optiuni de formatare.
9. Delimitatorii initiali si finali scot valoarea numerica din cimpul formatat. Sirul SQL
converteste valoarea la forma memorata.

Lansara SQL*Loader
sql ldr scott/tiger control=ulcase7.ctl log= ulcase7.log
Fisierul log
1) SQL* Loader - 307: Warning: conflicting lengths 2 and 3 specified
for column EMP.DEPTNO.
Control File:
ulcase7.ctl
Data File:
ulcase7.dat
Bad File:
ulcase7.bad
Discard File: none specified
( Alow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:
64 rows, maximum of 65536 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
------------------------------------------- ------------DEPTNO
1:2
3
CHARACTER
JOB
7:14
8
WHT
CHARACTER
MGR
28:31
4
WHT
CHARACTER
ENAME
34:41
8
WHT
CHARACTER
EMPNO
NEXT
*
WHT
CHARACTER
SAL
51
*
WHT
CHARACTER
COMM
NEXT
*
(
CHARACTER
%
HIREDATE
SYSDATE
Column DEPTNO is NULL DEPTNO = BLANKS
Column JOB is NULL if JOB = BLANKS
Column JOB had SQL string
"UPPER (:job)"
applied to it.
Column MGR is NULL if MGR = BLANKS
Column ENAME had SQL string
"UPPER (:ename)"
applied to it.
Column SAL had SQL string
"TO_NUMBER (sal, '$99,999.99')"
applied to it.
Column COMM had SQL string
":comm * 100"
applied to it.
2) 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.
2) 7 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Space allocated for bind array:
52480 bytes (64 rows)
Space allocated for memory besides bind array:
108185 bytes
Total logical records skipped:
0
Total logical records read:
13
Total logical records rejected:
0
2) Total logical records discarded:
7
Note:
1. S-a generat un mesaj de eroare de diferenta intre lungimea specificata si lungimea
derivata din specificarea pozitiei.
2. Linia 6 din header-ul raportului este refuzata din cauza separatorului blank in mijlocul
liniei.
Cazul 8: Incarcarea unui fisier cu inregistrari de lungime fixa
Se face incarcarea folosind optiunea inregistrare de lungime fixa.
Se face clauza SORTED INDEX.
Partitionarea datelor.
Definirea explicita a pozitiei cimpurilor si tipurilor de data.
Fisierul de control ULCASE8.ctl
LOAD DATA
1) INFILE 'ulcase8.dat' "fix 129"
BADFILE 'ulcase8.dat.bad'
TRUNCATE
INTO TABLE lineitem
2,3)SORTED INDEXES
(1_ship_idx) PARTITION ship_gl
(1_orderkey
position
(1:6) char,
1_partkey
position
(7:11) char,
1_suppkey
position
(12:15) char,
1_linenumber
position
(16:16) char
1_quantity
position
(17:18) char,
1_extendedpice
position
(19:26) char,
1_discount
position
(27:29) char,
1_tax
position
(30:32) char,
1_returnflag
position
(33:33) char,
1_linestatus
position
(34:34) char,
1_shipdate
position
(35:43) char,
1_commitdate
position
(44:52) char,
1_receipdate
position
(53:61) char,
1_shipinstruct
position
(62:78) char,
1_shipmode
position
(79:85) char,
1_comment
position
(86:128) char)

Note:
1. Specificarea ca fiecare inregistrare din fisierul de date are o lungime fixa.
2. SORTED INDEXES permite SQL*Loader sa optimizeze crearea indecsilor prin
eliminarea fazei de sortare a datelor cind se foloseste metoda directa.
3. Se foloseste cuvintul cheie PARTITION pentru a specifica incarcarea unei partitii
specificate. In exemplu, numai rindurile care indeplinesc criteriul--- sunt incarcate, toate
celelalte sunt refuzate.
4. Identifica numele coloanei si locatia in fisierul de date.
Crearea tabelei
In ordinea partitiilor datele tabelei sunt create folosind pentru partitii in corespondenta cu----create table lineitem
(1_orderkey
number,
1_partkey
number,
1_suppkey
number,
1_linenumber
number,
1_quantity
number,
1_extendedprice number,
1_discount
number,
1_tax
number,
1_returnflag
char,
1_linestatus
char,
1_shipdate
date,
1_commitdate
date,
1_receiptdate
date,
1_shipinstruct
char(17),
1_shipmode
char(7),
1_comment
char(43) )
partition by range (1_shipdate)
(
partition ship_ql values less than (TO_DATE( '01-APR-1996', 'DD-MON-YYYY') )
tablespace p01,
partition ship_q2 values less than (TO_DATE( '01-JUL-1996', 'DD-MON-YYYY') )
tablespace p02,
partitionship_q3 values less than (TO_DATE( '01-OCT-1996', 'DD-MON-YYYY') )
tablespace p04
)
Fisierul de date de intrare
Fisierul de intrare ULCASE8.dat este aratat mai jos. Fiecare inregistrare are 129 caractere
lungime. Cinci blank-uri preced fiecare inregistrare din fisier.
1 151978511724386.60 7.04 0NO09-SEP-6412-FEB-9622-MAR-96DELIVER IN
PERSONTRUCK iPBw4mMm7w7kQ zNPL i261OPP
1 2731 73223658958.28.09.06NO12-FEB-9628-FEB-9620-APR-96TAKE BACK
RETURN MAIL 5wM04SNy10AnghCP2nx 1Ai
1 3370 3713 810210.96 .1.02NO29-MAR-9605-MAR-9631-JAN-96TAKE BACK
RETURN
REG AIRSQC2C 5PNCy4mM
1 5214 46542831197.99.09.06NO21-APR-9630-MAR-9616-MAY
96NONE AIR Om0L65CSAwSj5k6k
1 6564 6763246897.92.07.02NO30-MAY-9607-FEB-9603-FEB-96DELIVER IN

PERSONMAIL CB0SnyOL PQ32B70wB75k 6Awl0m0wh


1 7403 160524 31329.6.1.04NO30-JUN-9614-MAR-9601
APR-96NONE FOB C2gOQj OB6RLk1BS15 igN
2 8819 82012441659.44 0.08NO05-AUG-9609-FEB-9711-MAR-97COLLECT
COD AIR 052M70MRgRNnmm476mNm
3 9415 721230 41113.5.0501AF05-SEP-9629-DEC-9318-FEB-94TAKE BACK
RETURN FOB 6wQnO0L1g6y
3 9717 183444 788.44.07.03RF09-NOV-9623-DEC-9315-FEB-94TAKE BAKE
RETURN SHIP LhiA7wygz0k4g4zRhMLMAB
3 9844 1955 6 8066.64.04.01RF28-DEC-9615-DEC-9314-FEB-9TAKE BACK
RETURN REG AIR6nmBmjQkgiCyzCQBkxPPOx5j4hB 01RywgniP7
Lansarea loader-ului
sql ldr scott/manager control=ulcase8.ctl data=ulcase8.dat log ulcase8.log
Fisierul log
Control File:
ULCASE8.CTL
Data File:
ULCASE8.DAT
Bad File:
ULCASE8.BAD
Discard File:
none specified
(Allow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed:
50
Bind array:
Test mode - (O/S dependent) default bindsize
Continuation:
none specified
Path use:
Conventional
Table LINEITEM, partition ship_ql, loaded from every logical record.
Insert option in effect for this table: TRUNCATE
Column Name
------------------L_ORDERKEY
L_ORDERKEY
L_PARTKEY
L_SUPKEY
L_LINENUMBER
L_QUANTITY
L_EXTENDEPRICE
L_DISCOUNT
L_TAX
L_RETURNFLAG
L_LINESTATUS
L_SHIPDATE
L_COMMITDATE
L_RECEIPTDATE
L_SHIPINSTRUCT
L_SHIPMODE
L_COMMENT

Position Len
---------- ----1:6
6
1:6
6
7:11
5
12:15
4
16:16
1
17:18
2
19:26
8
27:29
3
30:32
3
33:33
1
34:34
1
35:43
9
44:52
9
53:61
9
62:78
17
79:85
7
86:128
43

Term
-------

Encl
------

Datatype
------------CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER

Record 4: Rejected - Error on table LINEITEM, partition ship_ql..


ORA-14401: inserted partition key is outside specified partition
Record 5: Rejected - Error on table LINEITEM, partition ship_ql..
ORA-14401: inserted partition key is outside specified partition
Record 6: Rejected - Error on table LINEITEM, partition ship_ql.
ORA-14401: inserted partition key is outside specified partition
Record 7: Rejected - Error on table LINEITEM,partition ship_ql.
ORA-14401: inserted partition key is outside specified partition
Record 8: Rejected - Error on table LINEITEM, partition ship_ql.
ORA-14401: inserted partition key is outside specified partition
Record 9: Rejected - Error on table LINEITEM, partition ship_ql.
ORA-14401: inserted partition key is outside specified partition
Record 10: Rejected - Error on table LINEITEM, partition ship_ql.
ORA-14401: inserted partition key is outside specified partition
Table LINEITEM, partition ship_ql:
3 Rows successfully loaded.
7 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Total logical records skipped:
0
Total logical records read:
10
Total logical records rejected:
7
Total logical records discarded:
0
Fisierul de control SQL*Loader
Sintaxa limbajului de definitie a datelor (DDL)
Diagrama sintaxei
Specificarea pozitiei
pos_spec
O specificare a pozitiei (pos_spec) da locatia de start pentru
un cimp si optional locatia de sfirsit. Pos_spec se specifica
astfel:
Pozitia trebuie cuprinsa intre paranteze. Locatia de start
trebuie sa fie specificata ca un numar de coloana, ca *
(coloana urmatoare), sau *+n(coloana urmatoare plus un
offset). Locatiile de start si sfirsit trebuie separate prin
(:) sau (-).
Conditia de cimp
field_condition

O conditie de cimp compara un cimp denumit sau o zona a


inregistrarii cu o valoare. Cind conditia este evaluata la
adevarat, este efectuata functia specificata. De exemplu, o
conditie adevarata poate determina functia NULLIF sa insereze
o valoare NULL, sau determina DEFAULTIF sa insereze o valoare
implicita. Field_condition este specificata astfel:
Char_string si hex_string pot fi inchise intre apostroafe sau
ghilimele. Hex_string este un sir de pozitie hexazecimal,
fiecare pozitie corespunde cu un byte din cimp. Cuvintul cheie
BLANKS permite testarea unui cimp pentru a se vedea daca
contine in intregime blank-uri. Aceasta este necesara cind se
incarca date delimitate si nu se poate prezice lungimea
cimpului sau cind se foloseste un set de caractere multi-byte
care are blank-uri multiple.
(1)=x corect, pe cind
(1) = x genereaza o eroare.
Numele coloanei
column_name
Numele coloanei care s-a specificat intr-o conditie de cimp
trebuie
sa
fie
unul
al
coloanelor
definite
pentru
inregistrarile de date. Numele trebuie cuprins intre ghilimele
daca este un cuvint rezervat.
Specificarea tipului de data
datatype_spec
Datatype_spec
informeaza
SQL*Loader
cum
sa
interpreteze
cimpurile in inregistrarea de intrare.
Sintaxa este:
Precizia fata de lungime
precision
length
Precizia unui cimp numeric este numarul de pozitii pe care
acesta il contine. Lungimea unui cimp numeric este numarul de
byte in inregistrare. Lungimea in byte a unui cimp zecimal
ZONED este aceeasi cu precizia. Totusi, lungimea in byte a
unui cimp zecimal impachetat este (p+1)/2, rotunjit in sus,
unde p este precizia, deoarece numerele impachetate contin 2
digiti (sau digit si semn) per byte.
Masca datelor
date mask
Masca datelor specifica formatul valorii datelor.
Specificarea delimitatorului
delimiter_spec
Delimiter_spec
specifica
un
delimitator
de
final,
un
delimitator de inchidere sau o combinatie a celor doua,
astfel:
Comentariile
Comentariile pot apare oriunde in sectiunea de comanda a
fisierului, dar nu pot apare in date. Se preced comentariile
cu liniuta dubla, care poate apare oriunde in linie. De
exemplu,

--This is a Comment (acesta este un comentariu)


Intregul text de la dreapta liniutei duble pina la sfirsitul
liniei este ignorat.
Specificarea parametrilor liniei de comanda in fisierul de
control
Fraza OPTIONS este folosita cind se invoca un fisier de
control cu acelasi set de optiuni, sau cind numarul de optiuni
facute in linia de comanda este prea mare.Fraza OPTIONS
precede fraza LOAD DATA.
OPTIONS
Acest cuvint cheie permite specificarea argumentelor la
momentul executiei, mai degraba decit in linia de comanda.
Prin intermediul cuvintului cheie se pot specifica:
SKIP = n
LOAD = n
ERRORS = n
ROWS = n
BINDSIZE = n
SILENT = {FEEDBACK | ERRORS | DISCARDS | ALL}
DIRECT = {TRUE | FALSE}
PARALEL = {TRUE | FALSE}
De exemplu:
OPTIONS (BINDSIZE=100000, SILENT=(ERRORS, FEEDBACK))
Valorile specificate in linia de comanda suprascriu valorile
specificate in fraza OPTIONS a fisierului de control. Cuvintul
cheie OPTIONS stabileste valori implicite care pot fi
schimbate usor prin linia de comanda.
Specificarea RECOVERABLE si UNRECOVERABLE
Urmatoarele optiuni se aplica numai la incarcarea directa:
RECOVERABLE
Datele incarcate sunt inregistrate in redo log. Optiunea este
implicita
pentru
incarcarea
directa.
Toate
incarcarile
conventionale sunt recoverable.
UNRECOVERABLE
Se poate specifica optiunea numai pentru incarcarea directa.
Cind se specifica, datele incarcate nu sunt inregistrate in
log ceea ce creste performanta.(Alte schimbari in baza de date
ramin inregistrate in log). Nu se poate specifica optiunea
pentru o incarcare conventionala. UNRECOVERABLE este o optiune
la nivel comanda si este valida numai pentru comanda. Trebuie
pentru fiecare comanda/operatie.
Specificarea numelui fisierelor si obiectele bazei de date
Numele obiectelor din baza de date intre ghilimele
SQL*Loader urmeaza standardul SQL pentru specificarea numelui
obiectelor (de exemplu, nume de tabele si coloane).Cuvintele
rezervate SQL si SQL*Loader trebuie sa fie specificate intre
ghilimele. Cuvintele rezervate cele mai asemanatoare cu numele
coloanelor sunt:
COUNT
DATA
DATE
FORMAT
OPTIONS
PART
POSITION
Daca este un sistem cu numele coloanelor PART, COUNT si DATA,
trebuie specificate numele intre ghilimele in fisierul de
control SQL*Loader.

INTO TABLE inventory


(partnum INTEGER,
PART
CHAR (15),
COUNT
INTEGER,
DATA
VARCHAR2 (30)
Se folosesc ghilimelele si daca numele obiectului contine
caractere speciale altele decit cele pe care le recunoaste SQL
($,#,_) sau daca numele este case sensitive.
Sir SQL cu ghilimele
Nume de fisere intre ghilimele
In mai multe sisteme de operare, incarcarea de a specifica un
nume complet, inclusiv calea genereaza o eroare, cind se
folosesc alte caractere speciale decit $, #, sau _. Uzual, se
pune numele fisierului intre apostroafe. Numele fisierelor
care folosesc caracterul backslash ,\, solicita o tratare
speciala.
Ghilimele si apostroafe in sir
SQL*Loader foloseste siruri cuprinse intre ghilimele si siruri
cuprinse intre apostroafe in fisierul de control. Fiecare tip
de sir poate aparea printre altele.
Caracterul backslash Escape
Numai in sintaxa DDL se poate plasa ghilimea inauntrul unui
sir
delimitat
de
ghilimele
precedindu-l
pe
acesta
de
caracterul escape ,\, oricind caracterul escape este permis in
sir. De exemplu, in urmatorul sir este inclusa ghilimeaua care
puncteaza homedir\datanorm\myfile precedind cu \:
INFILE homedir\data\norm\mydata
Pentru a pune caracterul escape insusi intr-un sir, se
introduce de doua ori astfel: \\
De exemplu,
so\far
or
so\far
is parsed as
sofar
so\\far
or
\so\\far\ is parsed as so\far
so\\\\far
or
so\\\\far
is parsed as
so\\far
Nota:O ghilimea in pozitia initiala nu poate fi sarita, de
aceea trebuie evitata crearea sirurilor cu ghilimele initiale.
Folosirea blackslash in numele fisierului
Siruri non-portabile
Sunt doua siruri asemanatoare de siruri de caractere in
fisierul de control SQL*Loader care nu sunt portabile intre
sistemele de operare: siruri de nume de fisiere si siruri de
optiuni de procesare fisiere. Cind se convertesc la un alt
sistem de operare, aceste siruri trebuie in general rescrise.
Acestea sunt siruri neportabile. Toate celelalte siruri din
fisierul de control SQL*LOader sunt portabile intre sistemele
de operare.
Daca sistemul de operare foloseste caracterul backslash pentru
a separa directoare intr-un nume care contine calea completa
si daca versiunea de Oracle implementeaza caracterul escape
backslash pentru numele fisierelor si alte siruri nonportabile, atunci trebie specificat backslash dublu in calea
fisierului si folosite ghilimele. De exemplu, pentru a

incaraca fisierul denumit topdir\mydir\mydata,


specify:
INFILE topdir\\mydir\\mydata

you

must

Versiunea de Oracle nu are implementat caracterul escape


blackslash pentru siruri non-portabile. Cind caracterul escape
este nedisponibil, un caracter backslash este tratat ca un
caracter normal, mai degraba decit un caracter escape (desi
acesta ramine utilizabil in toate celelalte siruri).Nume cum
ar fi INFILE topdir\mydir\myfile trebuie specificat normal.
Nu sunt necesare backslash-uri duble.
Deoarece caracterul backslash nu este recunoscut ca un
caracter escape, sirurile dintre apostroafe nu pot fi
intercalate inauntrul altor siruri delimitate de apostroafe.
Aceeasi regula si pentru ghilimele: Un sir cuprins intre
ghilimele nu poate fi in interiorul altui sir delimitat de
ghilimele.
Cum se determina daca este permis caracterul escape
Se poate determina daca backslash este folosit ca si caracter
escape
in
siruri
non-portabile
verificind
documentatia
specifica sistemului de operare. O alta modalitate este de a
se specifica in sirul de procesare a fisierului test\me si
se vrifica fisierul log. Daca fisierul log arata sirul de
procesare ca test\me atunci caracterul backslash nu este
folosit ca si caracter escape si nu sunt necesare backslashuri duble pentru specificarea fisierului.
Daca fisierul log arata sirul de procesare a fisierului
testme atunci backslash este tratat ca si caracter escape si
sunt necesare backslash-uri duble.
Includerea datelor in fisierul de control cu BEGINDATA
Daca datele sunt continute in fisierul de control, ele sunt
plasate la sfirsitul specificatiilor de control. Trebuie
plasat cuvintul cheie BEGINDATA inaintea primei inregistrari
de date pentru a separa datele de definitia datelor. Sintaxa
este:
BEGINDATA
Acest cuvint cheie este folosit cu cuvintul cheie INFILE.
Daca se omite BEGINDATA, SQL*Loader incearca sa interpreteze
datele ca informatii de control si genereaza un mesaj de
eroare. Daca datele sint intr-un fisier separat, atingerea
sfirsitului fisierului de control semnaleaza ca informatia de
control este completa si nu trebuie utilizat BEGINDATA.
Nu trebuie sa fie spatii sau caractere pe aceeasi linie dupa
clauza BEGINDATA, altfel linia care contine BEGINDATA este
interpretata ca prima linie de date. Dupa BEGINDATA nu trebuie
sa fie nici comentarii-acestea sunt interpretate deasemenea ca
date.
Identificarea fisierelor de date
Pentru a specifica complet fisierul de date se foloseste un
cuvint cheie, optional urmat de un sir de optiuni de procesare
a fisierului. Se pot specifica mai multe fisiere folosind mai
multe cuvinte cheie INFILE. Se poate specifica fisierul de
date folosind linia de comanda.

Denumirea fisierului
Pentru a specifica fisierul care contine date de incarcat, se
foloseste cuvintul cheie INFILE sau INDDN din fisierul de
control. Daca nu s-a specificat un nume de fisier, numele
implicit este numele fisierului de control cu extensia DAT.
Daca fisierul de control contine date de incarcat se specifica
numele fisierului *. Aceasta specificare lucreaza impreuna
cu cuvintul cheie BEGINDATA.
INFILE sau INDDN (se foloseste INDDN cind este ceruta
compatibilitate DB2). Acest cuvint cheie specifica ca urmeaza
o specificatie de nume fisier.
Filname - numele fisierului care contine date. Orice spatii
sau semne de punctuatii din numele fisierului trebuie inchise
intre apostroafe. Daca datele sunt in fisierul de control si
in fisierul de date, trebuie specificat primul asteriscul in
ordinea pentru care se incarca datele.
Processing_options sir de optiuni de rocesare. Aceasta
specifica formatul fisierului de date si optimizeaza citirea
datelor.
Specificarea mai multor fisiere de date
Pentru a incarca date din mai multe fisiere la o executie a
SQL*Loader, se foloseste fraza INFILE pentru fiecare fisier de
date. Fisierul de date nu trebuie sa aiba acelasi format de
fisier. De exemplu, doua fisiere cu siruri de optiuni de
procesare diferite si al treilea poate consta in date in
fisierul de control.
Pentru fiecare fisier de date se poate specifica un fisier de
refuz si un fisier bad. Aceste nume de fisiere trebuie
declarat dupa fiecare nume de fisier. Urmatoarea portiune a
unui fiser de control specifica patru fisiere.
INFILE mydat1.dat BADFILE mydat1.bad DISCARDFILE mydat1.dis
INFILE mydat2.dat
INFILE mydat3.dat DISCARDFILE mydat3.dis
INFILE mydat4.dat DISCARDMAX 10 0
Pentru primul fisier (f1.dat) sunt denumite explicit fisierul
de refuz si fisierul bad. Daca este necesar se creeaza ambele.
Pentru fisierul al doilea (f2.dat) nu s-a specificat fisier de
refuz si nici bad. Daca este necesar se creeaza numai fisierul
bad. Daca se creeaza fisierul bad are numele si extensia
implicita. Fisierul de refuz nu se creeaza chiar daca sunt
rinduri refuzate.
Pentru fisierul al treilea (f3.dat) se creeaza un fisier bad
implicit, daca este necesar. La fel, daca este necesar, se
creeaza un fisier de refuz cu numele dat.
Pentru fisierul al patrulea (f4.dat) se creeaza, daca este
necesar, un fisier bad implicit. Deoarece este folosita
optiunea DISCARDMAX SQL*Loader presupune ca este cautat si
creat un fisier de refuz cu numele implicit (f4.dsc), daca
este necesar.
Nota: Inregistrarile fizice din fisiere separate nu pot fi
legate intr-o inregistrare logica.
Exemplu de specificare a fisierelor de date

In primul exemplu se specifica ca datele sunt continute in


fisierul de control:
INFILE *
In al doilea exemplu se specifica ca datele sunt continute in
fisierul cu numele FDATE cu extensia implicita DAT:
INFILE *DATE
Urmatorul exemplu specifica calea intreaga la un fisier.
INFILE c:/topdir/subdir/datafile.dat
Nota:Numele fisierelor care include spatii sau semne de
punctuatie trebuie inchise intre apostroafe.
Specificarea READBUFFERS
Cuvintul cheie READBUFFERS controleaza folosirea memoriei.
Clauza se poate specifica numai pentru incarcarea directa.
Specificarea formatului fisierelor de date
Se specifica un sir de optiuni de procesare a fisierelor
pentru a controla procesarea fisierelor, care este dependent
de sistemul de operare.
Exemplu de procesare a fisierelor
RECSIZE lungimea unei inregistrari de dimensiune fixa
BUFFERS numarul de buffere folosite pentru I/O asincrone.
Nota: Pentru detalii privind sintaxa sirului de optiuni de
procesare a fisierelor se va vedea documentatia Oracle,
specifica sistemului de operare.
Pentru a declara un fisier denumit FDATE.DAT ca un fisier care
contine inregistrari de 80 byte si se informeaza SQL*Loader sa
foloseasca 8 buffere pentru I/O, se foloseste clauza:
INFILE FDATE.DAT RECSIZE 80 BUFFERS 8
Specificarea fisierelor BAD
Cind se executa SQL*Loader, acesta poate crea un fisier numit
BAD sau REJECT in care sunt folosite inregistrarile care au
fost refuzate din cauza unor erori Oracle. Aceste fisiere se
creeaza respectind urmatoarele reguli:
Se creeaza un fisier BAD numai daca una sau mai multe
inregistrari sunt refuzate.
Daca nu sunt inregistrari refuzate atunci nu se creeaza
fisierul BAD. In acest caz trebuie reinitializat fisierul
BAD.
Daca se creeaza fisierul BAD, acesta suprascrie un fisier
existent cu acelasi nume.
Daca nu se creeaza fisierul BAD, fisierul care exista cu
acelasi nume ramine intact.
Informatii suplimentare: In unele sisteme se creeaza o noua
versiune a fisierelor daca deja exista un fisier cu acelasi
nume. Se va vedea documentatia Oracle specifica sistemiului de
operare.
Pentru a specifica numele acestui fisier se foloseste cuvintul
cheie BADFILE sau BADDN, urmat de numele fisierului. Daca nu
se specifica numele fisierului BAD, numele implicit este
acelasi cu al fisierului de date si extensia BAD. Se poate
specifica fisierul BAD in linia de comanda cu parametrul BAD.

Un nume de fisier specificat


cu prima clauza INFILE sau
suprascriind oricare fisier
parte a acestei clauze.
Fisierul BAD este creat cu
format de fisier astfel ca
corectie. Sintaxa este:

in linia de comanda este asociat


INDDN din fisierul de control,
BAD care a fost specificat ca
aceeasi inregistrare si acelasi
datele pot fi reincarcate dupa

Unde:
BADFILE (BADDN) (Se foloseste BADDN cind este ceruta
compatibilitatea DB2). Acest cuvint cheie specifica un nume de
fisier pentru fisierul BAD.
bad_filename Specificarea unui nume valid pentru platforma.
Orice spatii sau semne de punctuatie in numele fisierului,
trebuie cuprinse intre apostroafe.
Exemplu de specificare a fisierului BAD
In exemplu se specifica un fisier BAD cu numele UGH si
extensia implicita BAD:
BADFILE UGH
Se specifica un fisier BAD cu numele BAD01 si extensia REJ
BADFILE BAD01.REJ
BADFILE /REFECT_DIR/BAD01.REJ
Inregistrarile refuzate (reject)
O inregistrare este refuzata in una din urmatoarele conditii:
La inserare inregistrarea genereaza o eroare Oracle (cum ar
fi date invalide pentru tipul respectiv de data).
SQL*Loader nu poate determina daca data este acceptabila,
adica nu poate determina daca inregistrarea indeplineste
criteriul din clauza WHEN, ca si in cazul unui cimp caruia
ii lipseste delimitatorul final.
Daca data poate fi evaluata in concordanta cu criteriul din
clauza WHEN, atunci este sau inserata sau refuzata.
Daca o inregistrare este refuzata la inserare, nici alte parti
al inregistrarii nu sunt inserate in alte tabele. De exemplu,
daca o inregistrare este inserata in mai multe tabele si mai
multe inserari s-au efectuat cu succes dar una esueaza, atunci
toate
inserarile
aferente
inregistrarii
sunt
anulate.
Inregistrarea este scrisa in fisierul BAD care poate fi
corectat si reincarcat. Inserarile anterioare fara erori nu
sunt afectate. Fisierul log indica eroarea Oracle pentru
fiecare inregistrare refuzata.
Restrictia de integriatate
Toate
restrictiile
de
integritate
sunt
respectate
de
incarcarea
conventionala.
La
incarcarea
directa
unele
restrictii nu sunt fortate.
Fisierul de refuz ulterior (discard)
La executia SQL*Loader, poate crea un fisier de inregistrari
refuzate pentru inregistrarile care nu indeplinesc unul din
criteriile de incarcare. Inregistrarile din acest fisier se
numesc
inregistrari
refuzate
(discard).
Inregistrarile
refuzate (discard) nu satisfac nici una din clauzele WHEN
specificate in fisierul de control. Inregistrarile refuzate nu
este necesar sa aiba date eronate.

Fisierul este creat in concordanta cu urmatoarele reguli:


Un fisier de refuz (discard) este creat numai daca s-a
specificat un nume de fisier si cind una sau mai multe
inregistrari nu satisfac una din clauzele WHEN specificate
in fisierul de control. Daca se creeaza, fisierul suprascrie
un fisier existent care are acelasi nume.
Daca nu sunt inregistrari refuzate, nu se creeaza fisier de
refuz.
Pentru crearea fisierului se foloseste una din urmatoarele
optiuni:
In fisierul de control
In linia de comanda
DISCARDFILE filename
DISCARD
DISCARDDN filename
DISCARDMAX
DISCARDS
DISCARDMAX
Se poate solicita fisierul de refuz direct prin parametrul
care specifica numele sau indirect specificind numarul maxim
de refuzuri.
Folosirea definirii in fisierul de control
Pentru a specifica numele fisierului se foloseste cuvintul
cheie DISCARDFILE sau DISCARDDN (pentru compatibilitate DB2),
urmat de numele fisierului.
unde:
DISCARDFILE (sau DISCARDDN pentru compatibilitate DB2). Acest
cuvint cheie specifica ca urmeaza un nume de fisier.
Discard_filename un nume de fisier valid.
Orice spatii sau semne de punctuatie trebuie cuprinse intre
apostroafe.
Numele implicit al fisierului este numele fisierului de date a
extensiei DSC. Un nume de fisier specificat in linia de
comanda suprascrie pe cel specificat in fisierul de control.
In functie de sistemul de operare fisierul este suprascris
daca exista sau se creeaza o versiune noua.
Fisierul
de
refuz
este
creat
cu
acelasi
format
al
inregistrarilor si formatul fisierului cu al fisierului de
date. Acesta poate fi ulterior folosit usor pentru incarcarea
datelor cu fisierul de control existent, dupa schimbarea
clauzei WHEN sau corectarea datelor.
Exemplu de specificare a fisierului
Se specifica un nume de fisier CIRCULAR cu extensia implicita
DSC:
DISCARDFILE CIRCULAR
Se specifica un fisier cu extensia MAY:
DISCARDFILE NOTAPPL.MAY
Se specifica un fisier, numele calea intreaga:
DISCARDFILE \DISCARD_DIR/FORGET.ME
Inregistrarile refuzate (discard)
Daca nu s-a specificat cuvintul cheie INTO TABLE pentru o
inregistrare, inregistrarea este refuzata. Situatia aceasta se
intilneste de fiecare data cind cuvintele cheie INTO TABLE si
fisierul de control are o clauza WHEN; si daca inregistrarea

nu indeplineste una din conditiile clauzei sau toate cimpurile


sunt null.
Inregistrarile nu sunt refuzate daca cuvintul cheie INTO TABLE
este specificat fara clauza WHEN. O incarcare este facuta sa
insereze orice inregistrare intr-o asemenea tabela. Unele
inregistrari sunt refuzate intr-un mod (reject) sau altele
sunt refuzate in alt mod (discard).
Limitarea numarului de refuzuri
Se poate limita numarul de inrgistrari care sunt refuzate
pentru fiecare fisier de date:
unde: n trebuie sa fie un intreg. Cind este atinsa limita de
refuz, procesarea fisierului de date se termina si continua cu
fisierul urmator daca exista.
Se poate specifica un numar diferit de refuzuri pentru fiecare
fisier. Alternativ, daca numarul de refuzuri este specificat
numai o data, numarul de refuz este acelasi pentru toate
fiserele.
Daca se specifica un numar maxim de refuzuri dar nu se
specifica numele fisierului, SQL*Loader creeaza un fisier de
refuz cu numele implicit al fisierului de date si extensia
implicita.
Specificarea parametrului in linia de comanda
Daca se specifica fisierul de refuz din linia de comanda cu
parametrul DISCARDFILE.
Un nume de fisier specificat in linia de comanda cu clauza
INFILE sai INDDN in fisierul de control suprascrie orice
fisier BAD care a fost specificat ca parte a clauzei.
Manipularea diferitelor scheme de codificare
SQL*Loader foloseste furnitura Oracle NLS (national Language
Support) pentru a manipula diferite scheme de codificare
folosite pe diverse calculatoare sau mai multe tari.
Setul de caractere Multi-Byte (asiatic)
Setul de caractere multi-byte suporta limbajul asiatic. Datele
pot fi incarcate in format multi-byte si obiectele bazei de
date (tabele, cimpuri) pot fi specificate cu caractere multibyte. In fisierul de control comentariile si numele obiectelor
pot folosi deasemenea caractere multi-byte.
Conversia caracterelor la intrare
SQL*Loader are capacitatea de a converti date din setul de
caractere al fisierului de date la setul de caractere al bazei
de date, cind acestea sunt definite. Cind se foloseste
incarcarea conventionala datele sunt convertite in setul de
caractere al sesiunii stabilit prin parametrul NLS_LANG.
Datele sunt incarcate folosind comenzi SQL. Setul de caractere
al sesiunii este cel suportat de terminal.
In timpul incarcarii directe, datele sunt convertite direct la
setul de caractere al bazei de date. Consecinta, metoda de
incarcare direct permite incarcarea intr-un set de caractere
care este suportat de terminal.
Cind se efectueaza o conversie de date este esential ca setul
de caractere destinatie sa contina o reprezentare a tuturor
caracterelor care exista in date. Altfel, caracterele care nu

au corespondent in setul de caractere destinatie vor fi


convertite la un caracter implicit, cu consecinta pierderea
datelor. Cind se foloseste incarcarea directa, setul de
caractere al bazei de date trebuie sa fie un superset sau
echivalent al setului de caractere al fisieruli de date.
Similar, cind se foloseste incarcarea conventionala, setul de
caractere al sesiunii trebuie sa fie un superset sau
echivalent al fisierului de date. Setul de carcatere folosit
in fiecare fisier de date este specificat cu cuvintul cheie
CHARACTERSET.
Cuvintul cheie CHARACTERSET
Definitia CHARACTERSET informeaza SQL*Loader ce set de
caractere este folosit in fiecare fisier de date. Fisiere
diferite pot fi specificate ca seturi de carcatere diferite.
Pentru un fisier poate fi specificat numai un set de
caractere. Folosirea cuvintului cheie CHARACTERSET determina
convertirea datelor automat cind sunt incarcate in Oracle.
Sint afectate numai cimpurile CHAR, DATE si EXTERNAL. Daca nu
se
specifica
cuvintul
cheie
CHARACTERSET,
nu
se
face
conversia.
Sintaxa optiunii:
CHARACTERSET character_set_spec
Unde character_set_spec este acronimul folosit de Oracle
pentru a referi o schema de codificare.
Setul de caractere al fisierului de control
Fisierul de control SQL*Loader se presupune ca este in setul
de caractere specificat pentru sesiune prin parametrul
NLS_LANG. Cu toate acestea delimitatorii si valorile clauzelor
de comparare trebuie sa corespunda cu setul de caractere
folosit in fisierul de date. Pentru a se asigura ca aceste
specificatii sunt corecte, este preferabil sa se specifice
siruri hexazecimale mai degraba decit valori si de caractere.
Toate datele de dupa BEGINDATA se presupune deasemenea ca sunt
in
setul
de
caractere
specificat
pentru
sesiune
prin
parametrul NLS_lang. Datele care folosesc un set de caractere
diferit trebuie sa fie in fisiere separate.
Incarcarea in tabele goalre si care nu sunt goale
Se pot specifica una di metodele de a incarca tabele:
Cum este efectuata o tabela care nu este goala
Daca tabela care se incarca nu este goala, exista patru
alegeri a modului cum actioneaza SQL*Loader.
Atentie: Cind este specificat cuvintul cheie REPLACE sau
TRUNCATE, este inlocuita intreaga tabela, nu rindurile
individuale. Dupa ce s-au sters toate rindurile este lansat un
commit. Nu se pot recupera datele care au fost in tabela
inaintea incarcarii decit daca acestea au fost salvate cu un
Export.
INSERT: Este metoda implicita. Aceasta solicita ca tabela sa
fie goala inainte de incarcare. Daca tabela contine rinduri
SQL*Loader se termina cu eroare.

APPEND: Daca deja exista date in tabela, SQL*Loader adauga


rinduri noi la acestea. Daca nu exista rinduri, atunci
rindurile sunt incarcate simplu.
REPLACE: Toate rindurile din tabela sunt sterse si se incarca
date noi. Tabela trebuie sa fie in schema utilizatorului sau
acesta sa aiba privilegiul DELETE in tabela. Rindurile sterse
determina declansarea oricaror tiggere de stergere definite in
tabela. Daca pentru tabela s-a specificat DELETE CASCADE sunt
efectuate stergerile corespunzatoare.
Actualizarea rindurilor existente
Metoda REPLACE este o inlocuire a tabelei nu a rindurilor
individuale.
SQL*Loader
nu
actualizeaza
inregistrarile
existente chiar daca au coloane null. Pentru a actualiza
rindurile existente se urmeaza procedura urmatoare:
1. Se incarca datele intr-o tabela temporara.
2. Se folosesc comenzile SQL*Loader UPDATE cu subinterogari
corespunzatoare.
3. Se sterge tabela temporara.
TRUNCATE:Cu aceasta metoda SQL*Loader foloseste comanda SQL
TRUNCATE pentru a obtine cele mai bune performante posibile.
Pentru ca sa opereze comanda TRUNCATE, constringerile de
integritate referentiala trebuie sa fie dezvoltate. Daca nu
sunt dezactivate SQL*Loader returneaza o eroare.
Odata ce constringerile de integritate au fost dezactivate,
DELETE CASCADE nu mai este definit pentru tabela. Daca este
necesar DELETE CASCADE continutul tabelei trebuie sters manual
inainte de a incepe incarcarea.
Tabela trebuie sa fie in schema utilizatorului sau acesta
trebuie sa aiba privilegiul DELETE ANY TABLE.
Specificarea unei metode pentru toate tabelele
Se specifica o metoda de incarcare care se aplica la toate
tabelele plasind cuvintul cheie inaintea clauzei INTO TABLE.
Continuarea unei incarcari intrerupte
Daca SQL*Loader se executa in afara spatiului pentru rinduri
de date sau intrari in index, incarcarea este discontinua. (De
exemplu, tabela poate atinge numarul maxim de extenturi).
Incarcarea poate continua dupa ce s-a facut disponibil mai
mult spatiu.
Setarea tabelelor si indecsilor
Cind incarcarea este discontinua, datele incarcate ramin in
tabela si tabela este in starea valid. Daca se foloseste
incarcarea conventionala, toti indecsii sunt in sarea valid.
Daca este folosita metoda incarcarii directe, orice index care
se executa in afara spatiului este in starea incarcarii
directe. Acestia trebuie stersi inainte ca incarcarea sa
continue. Ceilalti indecsi sunt valizi daca nu se intilnesc
alte erori.
Folosirea fisierului log
Fisierul
log
al
SQL*Loader
arata
starea
tabelelor
si
indecsilor si numarul de inregistrare citite din fisierul de
date de intrare. Se folosesc aceste informatii pentru a
verifica incarcarea.
Stergerea indecsilor

Inainte de a continua o incarcare directa se inspecteaza


fisierul log pentru a vedea ca nu sunt indecsi in starea
incarcare directa.
Orice index care este in starea incarcare directa trebuie
stersi inainte de a continua incarcarea. Indecsii pot fi
recreati sau inainte de a continua incarcarea sau dupa
incarcarea completa.
Continuarea incarcarii unei singure tabele
Pentru a continua o incarcare directa sau conventionala
intrerupta care implica numai o tabela, se specifica numarul
de inregistrari logice care sar cu parametrul SKIP in linia de
comanda. Daca fisierul log arata ca au fost citite anterior
345 de inregistrari, comanda de continuare ar arata:
SQLLDR
USERID=scott/tiger
CONTROL=FAST1.CTL
DIRECT=TRUE
SKIP=345
Continuarea incarcarii conventionale in mai multe tabele
Intr-o incarcare conventionala, nu este posibil ca incarcarea
in mai multe tabele sa fie desincronizate. Astfel, incarcarea
conventionala, intrerupta poate continua cu parametrul SKIP in
linia de comanda.
Continuarea incarcarii directe in mai multe tabele
Daca SQL*Loader nu poate termina incarcarea directa in mai
multe tabele, numarul de inregistrari logoice procesate poate
fi diferit pentru fiecare tabela. Daca se intimpla asa,
tabelele nu sunt sincronizate si continuarea procesului este
mai complexa. Pentru a continua o incarcare directa care
implica mai multe tabele, se inspecteaza fisierul log pentru a
determina cite inregistrari s-au incarcat in fiecare tabela.
Daca este acelasi numar se continua simplu incarcarea.
CONTINUE_LOAD
Daca numarul este diferit se specifica cuvintul cheie
CONTINUE_LOAD si se specifica SKIP la nivelul tabelei in loc
de nivelul incarcarii. Aceasta fraza are rolul de a manipula
incarcarile intrerupte nesincronizat.
In loc de a se specifica:
LOAD DATA ...
La inceputul fisierului de control se specifica:
SKIP
Atunci, pentru fiecare clauza INTO TABLE se specifica numarul
de inregistrari care se sar pentru tabela folosind cuvintul
cheie SKIP.

INTO TABLE emp


SKIP 2345

INTO TABLE dept


SKIP 514

Combinatia SKIP si CONTINUE_LOAD


Cuvintul cheie CONTINUE_LOAD este necesar numai dupa esuarea
unei incarcari directe,deoarece incarcarea tabelelor multiple

nu poate fi nesincronizata cind se foloseste incarcarea


conventionala.
Daca se specifica CONTINUE_LOAD, nu se poate folosi parametrul
SKIP din linia de comanda. Trebuie folosita clauza SKIP la
nivel de tabela. Daca se specifica LOAD, se poate folosi
optional parametrul liniei de comanda SKIP, dar nu se poate
folosi clauza SKIP la nivelul tabelei.
Asamblarea inregistrarilor logice din inregistrari fizice
Se poate crea o inregistrare logica din mai multe inregistrari
fizice folosind una din cele doua clauze, depinzind de date:
CONCATENATE
CONTINUEIF
CONCATENATE este indicata in cazurile simple, cind SQL*Loader
trebuie intotdeauna sa adauge acelasi numar de inregistrari
fizice pentru a forma o inregistrare logica.
Sintaxa este:
CONCATENATE n
Unde n arata numarul de inregistrari fizice care se combina.
Daca numarul de inregistrari fizice care trebuie sa continue
este variabil trebuie folosit CONTINUE IF.
CONTINUEIF este urmata de o conditie care este evaluata pentru
fiecare inregistrare fizica cum este citita. De exemplu, doua
inregistrari trebuie combinate daca au caracterul # in pozitia
80 a primei inregistrari. Daca este un alt caracter, atunci
inregistrarea a doua nu va fi adaugata la prima.
Intreaga
sintaxa
pentru
CONTINUEIF
adauga
mai
multa
flexibilitate:
Unde:
THIS Daca conditia este adevarata in inregistrarea curenta,
urmatoarea inregistrare fizica este citita si concatenata cu
inregistrarea fizica curenta, continuind pina cind conditia
devine falsa. Daca conditia este falsa, inregistrarea fizica
curenta devine ultima inregistrare fizica a inregistrarii
logice curente. THIS este implicit.
NEXT

Daca
conditia
este
adevarata
in
urmatoarea
inregistrare, inregistrarea fizica curenta este adaugata la
inregistrarea cutenta, continuind pina cind conditia devine
falsa.
pos_spec

Specifica
inceputul
si
sfirsitul
numerelor
coloanelor in inregistrarea fizica.
Numarul coloanei incepe cu 1. Sunt acceptate sau liniuta sau
doua puncte (start-end sau start:end).
Daca se omite end, lungimea cimplului de continuare este
lungimea sirului de byte sau sirului de caractere. Daca se
foloseste end, lungimea cimpului de continuare rezultat nu
este aceeasi cu a sirului de byte sau a sirului de caractere,
sirul scurt este completat. Sirurile de caractere sunt
completate cu blank-uri, sirurile hexazecimale cu zerouri.
LAST Acest test este similar cu THIS dar testul este facut
intotdeauna pe ultimul caracter non-blank. Daca ultimul
caracter non-blank din inregistrarea curenta indeplineste
criteriul, atunci urmatoarea inregistrare fizica este citita

si concatenata cu inregistrarea fizica curenta, continuind


pina cind conditia devine falsa. Daca conditia este falsa in
inregistrarea curenta, atunci inregistrarea fizica curenta
este ultima inregistrare fizica a inregistrarii curente.
operator Operatorii admisi sunt egali sau diferiti. Pentru
operatorul egal, cimpul si sirul de comparare trebuie sa
coincida exact pentru ca conditia sa fie adevarata. Pentru
operatorul definit, acesta trebuie sa difere printr-un
caracter oarecare.
char_string Un sir de caractere care este comparat cu cimpul
de continuare definit prin start si end, in concordanta cu
operatorul.Sirul
trebuie
cuprins
intre
apostroafe
sau
ghilimele. Compararea este facuta caracter cu caracter,
completindu-se cu blank-uri la dreapta daca este necesar.
Xhex-string- Un sir de byte in format hexazecimal folosit in
aceeasi maniera ca sirul de caractere.X1FBO33 reprezinta 3
byte cu valorile 1F,b) si 33(hex a).
Nota: Pozitia in clauza CONTINUEIF refera pozitia in cadrul
fiecarei inregistrari fizice. Aceasta este singura data cind
se refera pozitia caracterului in inregistrarea fizica. Toate
celelalte referiri sint la inregistrarea logica.
Pentru
CONTINUEIF
THIS
si
CONTINUEIF
NEXT,
cimpul
de
continuare este eliminat din toate inregistrarile fizice
inainte de a fi asamblate in inregistrarea logica. Aceasta
permite valorilor sa continue in inregistrare fara extra
caractere (caracterele de continuare) in exterior. Exemple de
CONTINUEIF THIS si CONTINUEIF NEXT:
CONTINUEIF THIS
CONTINUEIF NEXT
(1:2) = %% (1:2) =%%
Se presupune ca inregistrarea are 12 caractere si punctul
inseamna un spatiu:
%%aaaaaaaa......aaaaaaaa....
%%bbbbbbbb....%%bbbbbbbb....
..cccccccc....%%cccccccc....
%%dddddddddd....dddddddddd..
%%eeeeeeeeee..%%eeeeeeeeee..
..ffffffffff..%%ffffffffff..
Inregistrarile logice vor fi aceleasi in fiecare caz:
aaaaaaaa....bbbbbbbb....cccccccc....
dddddddddd..eeeeeeeeee..ffffffffff..
Nota: CONTINUEIF LAST difera de CONTINUEIF THIS si CONTINUEIF
NEXT. Cu CONTINUEIF LAST sirul de continuare nu este eliminat
din inregistrarea fizica.
In loc, acest caracter este inclus cind este asamblata
inregistrarea logica.
Blank-urile de la sfirsitul inregistrarii fizice nu sunt parte
a inregistrarii logice.
Exemplu de specificare CONTINUEIF
In exemplul urmator se specifica ca daca inregistrarea fizica
curenta (inregistrarea 1) are un asterisc in coloana 1. Atunci
inregistrarea fizica urmatoare (inregistrarea 2) trebuie
adaugata la prima. Daca inregistrarea 2 are deasemenea un

asterisc
in
prima
coloana,
atunci
este
adaugata
si
inregistrarea 3 la primele doua. Daca inregistrarea 2 nu are
asterisc in coloana 1, aceasta este adaugata la prima, dar
inregistrarea 3 devine o inregistrare logica noua.
CONTINUEIF THIS (1) = *
In exemplul urmator se specifica, ca daca inregistrarea fizica
curenta (inregistrarea1) are o virgula in ultima pozitie care
nu este blank a coloanei de date, atunci inregistrarea fizica
urmatoare (inregistrarea2) va fi adaugata la inregistrarea 1.
Daca inregistrarea nu are o virgula in ultima coloana, aceasta
este ultima inregistrare fizica a inregistrarii logice
curente.
CONTINUEIF LAST = ,
In exemplul urmator se specifica ca daca inregistrarea fizica
urmatoare (inregistrarea2) are 10 in coloana 7 si 8, atunci
trebuie
adaugata
la
inregistrarea
fizica
precedenta
(inregistrarea1). Daca inregistrarea nu are 10 in coloanele
7 si 8, atunci aceasta devine o noua inregistrare logica.
CONTINUEIF NEXT (7:8) = 10
Incarcarea inregistrarilor logice in tabele
Care tabele se incarca
Care inregistrari se incarca in tabele
Caracteristicile
implicite
ale
coloanelor
in
aceste
inregistrari
Specificarea numelui tabelelor
Cuvintul cheie INTO TABLE al frazei LOAD DATA permite
identificarea tabelelor, cimpurilor si tipurilor de data.
Aceasta defineste relatiile intre inregistrarile din fisierele
de date si tabelele din baza de date.
INTO TABLE
Printre mai multe functii, cuvintul cheie INTO TABLE permite
specificarea tabelei in care se incarca datele. Pentru
incarcarea in mai multe tabele se include o clauza INTO TABLE
pentru fiecare tabela care se incarca. Pentru a incepe o
clauza INTO TABLE se foloseste cuvintul cheie INTO TABLE urmat
de numele tabelei Oracle care receptioneaza datele.
Tabela trebuie sa existe. Numele tabelei trebuie inclus intre
ghilimele daca este acelasi cu un cuvint rezervat SQL*Loader,
daca contine caractere speciale sau daca este case-sensitive.
INTO TABLE SCOTT.COMMENT
INTO TABLE SCOTT.Comment
INTO TABLE SCOTT.-COMMENT
Utilizatorul
care
executa
SQL*Loader
trebuie
sa
aiba
privilegiul INSERT in tabela. Altfel, numele tabelei trebuie
prefixat de utilizator cu numele proprietarului:
INTO TABLE SOPHIA.EMP
Metode specifice de incarcare a tabelei
Clauza INTO TABLE poate include o metoda de incarcare
specifica tabelei (INSERT, APPEND, REPLACE sau TRUNCATE) care
se aplica numai la aceasta tabela. Specificarea unuia din
aceste metode prin clauza INTO TABLE suprascrie metoda globala
de incarcare a tabelei. Implicit, metoda globala de incarcare

este INSERT, daca nu s-a stabilit o alta metoda prin


specificarea ei in clauza INTO TABLE.
Cuvintul cheie OPTIONS specifice tabelei
Cuvintul
cheie
OPTIONS
este
specificat
pentru
tabele
individuale in incarcarea paralela. Este valid numai pentru
incarcarea paralela.
Alegerea rindurilor care se incarca
Se poate alege incarcarea sau refuzarea unei inregistrari
logice folosind clauza WHEN pentru a tasta o conditie in
inregistrare.
Clauza WHEN apare dupa numele tabelei si este urmata de una
sau mai multe conditii de cimp.
De exemplu, clauza urmatoare indica ca orice inregistrare care
are valoarea g in pozitia cinci poate fi incarcata:
WHEN (5) = g
O clauza WHEN poate contine anumite comparatii, fiecare este
precedata de AND. Parantezele sunt optionale, dar pot fi
folosite pentru claritatea comparatiilor combinate prin AND.
De exemplu,
WHEN (DEPTNO 10) AND (JOB = SALES)
Pentru a evalua clauza WHEN, SQL*Loader determina intii
valoarea tuturor cimpurilor din inregistrare. Atunci este
evaluata clauza WHEN. Un rind este inserat in tabela numai
cind clauza WHEN este adevarata.
Specificarea delimitatorilor impliciti de date
Daca toate cimpurile sunt terminate similar in fisierul de
date, se poate folosi clauza FIELDS pentru a indica
delimitatorul implicit.
Sintaxa este:
Se poate suprascrie delimitatorul unei coloane specificind
acesta dupa numele coloanei.
Manipularea inregistrarilor scurte cu date lipsa
Cind
fisierul
specifica
mai
multe
cimpuri
pentru
o
inregistrare care sunt prezente in inregistrare, SQL*Loader
trebuie sa determine fie coloana ramasa (specificata) va fi
considerata null, fie genereaza o eroare.
Daca definitia din fisierul de control specifica explicit ca
pozitia de start a unui cimp este dincolo de sfirsitul
inregistrarii logice, SQL*Loader defineste intotdeauna cimpul
ca fiind null. Daca un cimp este definit ca o pozitie relativa
(cum ar fi DNAME si LOC din exemplul urmator) si inregistrarea
se termina inainte ca sa fie gasit cimpul, atunci SQL*Loader
poate trata cimpul ca fiind null sau genereaza o eroare.
SQL*Loader foloseste prezenta sau absenta clauzei TRAILING
NULLCOLS pentru a determina cursul actiunii.
TRAILING NULLCOLS
TRAILING NULLCOLS pune SQL*Loader sa trateze oricare coloana
pozitionata relativ care nu este prezenta in inregistrare ca
null.
De exemplu, daca urmatoarea data
10 Accounting

este citita cu fisierul de control


INTO TABLE dept
TRAILING NULLCOLS
( deptno CHAR TERMINATED BY ,
dname CHAR TERMINATED BY WHITESPACE,
loc
CHAR TERMINATED BY WHITESPACE
)
si inregistrarea se termina dupa DNAME. Cimpul ramas LOC este
setat la null. Fara TRAILING NULLCOLS se genereaza o eroare
din cauza datelor lipsa.
Optiunea Index
Optiunea SORTED INDEXES
Optiunea SORTED INDEXES se aplica la incarcarea directa. Ea
informeaza SQL*Loader ca datele care urmeaza sunt deja sortate
in indexul specificat permitind optimizarea performantei.
Optiunea SINGLEROW
Scopul optiunii SINGLEROW este de a folosi incarcarea directa
cu APPEND in sistem cu memorie putina, sau cind se incarca un
numar mic de rinduri intr-o tabela mare. Aceasta optiune
insereaza fiecare intrare index direct in index, un rind o
data.
Implicit, SQL*Loader nu foloseste SINGLEROW cind adauga
(APPEND) rinduri la o tabela. In loc, intrarile indecsilor
sunt puse intr-o zona separat) temporara si intercalat cu
indexul original la sfirsitul incarcarii. Aceasta metoda are
performanta maxima si produce un index optional dar necesita
spatiu suplimentar.
In timpul intercalarii, indexul original, indexul nou si
spatiul pentru intrari ocupa simultan spatiu. Cu optiunea
SINGLEROW, spatiul de memorare nu este solicitat pentru
indexul nou sau pentru intrarile noi in index. Indexul
rezultat poate sa nu fie optional ca unul sortat recent, dar
cere mai putin spatiu pentru a fi efectuat. Acesta ia si timp
mai mult deoarece informatii aditionale UNDO se genereaza
pentru fiecare inserare in index. Aceasta optiune este
sugerata cind:
Cantitatea de memorie disponibila este limitata
Numarul de rinduri de inserat este mic comparat cu
dimensiunea tabelei (un raport de 1/20 sau mai mic)
Specificarea conditiilor de cimp
O conditie de cimp este o fraza despre un cimp intr-o
inregistrare logica evaluata ca adevarata sau falsa. Este
utilizata in clauzele NULLIF si DEFAULTIF cit si in clauza
WHEN. O conditie de cimp este similara cu conditia din clauza
CONTINUEIF, cu doua diferente importante. Prima, pozitia in
conditia cimp refera o inregistrare logica nu o inregistrare
fizica.
A
doua,
se
poate
specifica
sau
pozitia
in
inregistrarea logica sau numele cimpului care se incarca.
unde:
start specifica pozitia de start a cimpului de comparare in
inregistrarea logica.

end specifica pozitia de sfirsit a cimpului de comparare in


inregistrarea logica. Se accepta start-end sau start:end. Daca
se omite end, sfirsitul cimpului este determinat de lungimea
sirului de comparare. Daca lungimile sunt diferite, cimpul mai
scurt este completat; Sirul caracter este completat cu blankuri, sirul hexazecimal cu zero.
column_name numele coloanei din baza de date. Daca
column_name este folosit in loc de start:end, specificatia
coloanei defineste cimpul de comparare. Column_name trebuie sa
fie exact cu numele coloanei din definitia tabelei. Se
folosesc apostroafe pentru a incadra numele coloanei daca
acesta coincide cu un cuvint cheie SQL*Loader, contine
caractere speciale.
operator un operator de comparare pentru egal sau diferit.
char-string un sir de caractere cuprinse intre apostroafe
sau ghilimele care este comparat cu cimpul de comparare. Daca
rezultatul compararii este adevarat, rindul curent este
inserat in tabela.
Xhex_string un sir de bytes in format hexazecimal care
este folosit in acelasi fel ca sirul de caractere.
BLANKS un cuvint cheie care denota un numar arbitrar de
blank-uri.
Compararea cimpului cu BLANKS
Cuvintul cheie BLANKS face posibila determinarea cu usurinta
daca un cimp de lungime necunoscuta este blank.
Pentru exemplu se foloseste urmatoarea clauza:
column_name...NULLIF column_name=BLANKS
Cuvintul cheie Blanks recunoaste numai blank-uri nu tab-uri.
Poate fi folosit in loc de sir literal in orice comparatie de
cimp. Conditia este TRUE ori de cite ori coloana este in
intregime blank. Cuvintul cheie BLANKS lucreaza deasemenea cu
cimpuri
de
lungime
fixa.
Utilizarea
este
aceeasi
cu
specificarea unui sir de blancuri corespunzator.
De exemplu, urmatoarele specificari sunt echivalente:
Fixed_field CHAR(2) NULLIF (fixed_field)=BLANKS
Fixed_field CHAR(2) NULLIF (fixed_field)=
Nota: Poate fi mai mult de un blank intr-un set de caractere
multi-byte. O idee buna este de a folosi cuvintul cheie BLANKS
cu aceste seturi de caractere in loc de a specifica un sir de
caractere blank. Sirul de caractere va coincide numai cu o
secventa specifica de caractere blank, pe cind cuvintul cheie
BLANKS va coincide cu combinatii de caractere blank.
Compararea cimpurilor cu literali
Cind se compara un cimp de date cu un sir literal mai scurt,
sirul este completat pentru comparare, sirul de caractere este
completat cu blank-uri; de exemplu:
NULLIF(1:4)=_
Compara data din pozitia 1-4 cu blank-uri. Saca pozitiile 1:4
contin 4 blank-uri, clauza este evaluata la adevarat.
Sirurile hexazecimale sunt completate cu zero.
Clauza NULLIF (1:4)=XFF
Compara pozitia (1:4) cu sirul hexazecimal FF000000.
Specificarea coloanelor si cimpurilor

Se poate incarca orice numar de coloane ale tabelei. Coloanele


definite in baza de date, dar nespecificate in fisierul de
control sunt asignate cu valori null.
O specificare de coloana este numele coloanei urmata de o
specificare pentru valorile care se inscriu in coloana. Lista
coloanelor este inclusa in paranteze si separate de virgula:
(columnspec, columnspec,...)
Fiecare nume de coloana trebuie sa corespunda unei coloane a
tab-ului denumita in clauza INTO TABLE. Un nume de coloana
trebuie inclus intre apostroafe daca este cuvint rezervat SQL
sau SQL*Loader, daca contine caractere speciale sau daca este
case-sensitive.
Daca valoarea este generata de SQL*Loader specificatia include
cuvintul cheie RECNUM, functia SEQUENCE sau cuvintul cheie
CONSTANT. Daca valoarea coloanei este citita din fisierul de
date, este specificat cimpul de date care contine valoarea
coloanei. In acest caz, specificatia coloanei include un nume
de coloana care identifica o coloana in baza de date si o
specificatie de cimp care descrie un cimp in inregistrarea de
date. Specificarea cimpului include pozitia, tipul de data,
restrictiile null si implicite.
Specificarea tipului de data a unui cimp de date
O specificare a tipului de data a unui cimp informeaza
SQL*Loader cum sa interpreteze datele din cimp. De exemplu, un
tip de data INTEGER specifica date binare, pe cind INTEGER
EXTERNAL specifica date caracter care reprezinta un numar. Un
cimp CHAR poate contine orice date caracter.
Se poate specifica numai un tip de data pentru fiecare cimp;
daca nu e specificat este presupus CHAR.
Inainte de a specifica tipul de data, trebuie specificata
pozitia cimpului.
Specificarea pozitiei unui cimp de date
Pentru a incaraca date dintr-un fisier de date SQL*Loader
trebuie sa cunoasca locatia si lungimea cimpurilor. Pentru a
specifica pozitia cimpului in inregistrarea logica, se
foloseste cuvintul cheie POSITION, in specificarea coloanei.
Pozitia poate fi formulata explicit sau relativ precedind
cimpul. Argumentele POSITIONS trebuie incluse intre paranteze.
unde:
start coloana de start a cimpului de date in inregistrarea
logica. Pozitia primului caracter intr-o inregistare logica
este 1.
end pozitia de sfirsit a cimpului de date in inregistrarea
logica. Este acceptat start-end sau start:end. Daca se omite
end, lungimea cimpului este derivata din tipul de data in
fisierul de date. De notat ca daca este specificat CHAR fara
star sau end se presupune ca este 1. Daca este imposibil
stabilirea lungimii cimpului din tipul datei, este lansat un
mesaj de eroare.
* - specifica faptul ca cimpul de date urmeaza imediat dupa
cimpul anterior. Daca se foloseste * pentru primul cimp de
date in fisierul de control, acest cimp se presupune ca este

la inceputul inregistrarii logice. Cind se foloseste * pentru


a specifica pozitia, lungimea cimpului este determinata din
tipul de data.
+n se poate folosi un offset, specificat ca +n, pentru a
separa cimpul curent de cel anterior. Un numar de caractere
este sarit inainte de a citi valoarea pentru cimpul curent.
Se poate omite POSITION in intregime. Daca se face aceasta,
specificarea poizitiei pentru cimpul de date este aceeasi ca
si cum s-ar fi folosit POSITION (*).
De exemplu,
ENAME POSITION (1:20) CHAR
EMPNO POSITION (22-26) INTEGER EXTERNAL
ALLOW POSITION (*+2)
INTEGER EXTERNAL TERMINATED BY /
Coloana ENAME este data tip caracter in pozitia 1 la 20, urmat
de coloana EMPNO care este
presupusa data numerica in
coloanele 22 la 27. Coloana ALLOW are un offset fata de
coloana EMPNO de +2, astfel ca starteaza in coloana 29 si
continua pina intilneste un slash.
Folosirea POSITION cu date care contin tab-uri
Cind se determina pozitia cimpului, trebuie atentionat pentru
tab-urile
din
fisierul
de
date.
Situatia
este
foarte
asemanatoare cind SQL*Loader foloseste capacitatile sirurilor
SQL pentru a incarca date dintr-un raport formatat.
Se analizeaza copia listata a raportului, se vertifica cu
atentie pozitia tuturor caracterelor si se creeaza fisierul
de control.
Incarcarea esueaza cu erori invalid number si missing
field.
Aceste erori se intilnesc cind datele contin tab-uri. Cind se
tipareste, fiecare tab expandeaza pentru a acoperi citeva
coloane pe hirtie. In fisierul de date fiecare tab ocupa un
caracter. Ca rezultat, cind SQL*Loader citeste fisierul de
date, specificarea POSITION este gresita. Pentru a rezolva
problema, se analizeaza fisierul de date in privinta taburilor si se ajusteaza specificarea POSITION sau se folosesc
cimpuri delimitate.
Folosirea POSITION cu incarcarea mai multor tabele
Intr-o incarcare in mai multe tabele, se specifica clauze
multiple INTO TABLE. Cind se specifica POSITION (*) pentru
prima coloana a primei tabele, pozitia este calculata relativ
la
inceputul
inregistrarii
logice.
Cind
se
specifica
POSITION(*) pentru prima coloana a urmatoarei tabele, pozitia
este calculata relativ la ultima coloana a ultimei tabele
incarcate.
Astfel, cind incepe o clauza urmatoare INTO TABLE, pozitia nu
este setata automat la inceputl inregistrarii logice. Aceasta
permite ca clauza INTO TABLE sa proceseze parti diferite ale
aceleiasi inregistrari logice.
O inregistrare logica poate contine date pentru una sau doua
tabele dar nu ambele. In acest caz trebuie resetata POSITION.
In loc de a omite specificarea pozitiei sau folosirea POSITION
(*+n) pentru primul cimp din tabela in clauza INTO TABLE se
foloseste POSITION (1) sau POSITION (n).

De exemplu,
SITEID POSITION (*) SMALLINT
SITELOC POSITION (*) INTEGER
Daca sunt specificate doua coloane si SITEID va incepe in
coloana 1 si SITELOC va incepe in coloana imediat urmatoare.
ENAME POSITION (1:20) CHAR
EMPNO POSITION (22-26) INTEGER EXTERNAL
ALLOW POSITION (*+2)
INTEGER EXTERNAL TERMINATED BY /
Coloana ENAME este caracter in pozitia 1 la 20, urmata de
coloana EMPNO care se presupune ca este data numerica in
coloana 22 la 26. Coloana ALLOW are offset la sfirsitul lui
EMPNO de +2 si starteaza in coloana 28 si continua pina este
intilnit un slash.
Folosirea frazei INTO TABLE multiple
Frazele multiple INTO TABLE permit:
incarcarea datelor in tabele diferite
extragerea mai multor inregistrari logice dintr-o singura
inregistrare de intrare
distinctie intre diferite formate a inregistrarilor de
intrare
In primul caz este obisnuit pentru fraza INTO TABLE sa refere
aceeasi tabela.
Extragerea mai multor inregistrari logice
Unele medii de memorare si transfer are o lungime fixa a
inregistrarii. Cind inregistrarea este scurta, este mai
eficient sa fie memorata intr-o singura inregistrare fizica,
pentru a folosi spatiul de memorare mai eficient.
In exemplu, SQL*Lader trateaza o inregistrare fizica in
fisierul de intrare ca doua inregistrari logice si foloseste
doua clauze INTO TABLE pentru a incarca date in tabela EMP.
Daca datele sunt:
1119 Smith
1120 Yvonne
1121 Albert
1130 Thomas
Urmatorul fisier de control extrage inregistrarile logice:
INTO TABLE emp
(empno POSITION (1:4) INTEGER EXTERNAL,
ename POSITION (6:15) CHAR)
INTO TABLE emp
(empno POSITION (17:20) INTEGER EXTERNAL,
ename POSITION (21:30) CHAR)
Pozitionarea relativa
Aceeasi inregistrare poate fi incarcata cu o specificare
diferita. Urmatorul fisier de control foloseste pozitionarea
relativa in loc de pozitionarea fixa. Aceasta specifica ca
fiecare cimp este delimitat de un singur blank ( )sau cu un
numar nedeterminat de blak-uri si tab-uri (WHITESPACE):
INTO TABLE emp
(empno INTEGER EXTERNAL TERMINATED BY ,
ename CHAR
TERMINATED BY WHITESPACE)
INTO TABLE emp
(empno INTEGER EXTERNAL TERMINATED BY ,

ename CHAR
TERMINATED BY WHITESPACE)
Punctul importatnt in exemplu este ca al doilea cimp EMPNO
este gasit imediat dupa primul ENAME, cu toate ca este intr-o
clauza INTO TABLE separata.
Scanarea cimpurilor nu incepe de la inceputul inregistrarii
pentru o noua clauza INTO TABLE, scanarea continua pina cind.
Pentru a forta scanarea inregistrarii sa inceapa intr-o
locatie specifica, se foloseste cuvintul cheie POSITION.
Distinctia intre diferite formate ale inregistrarii de intrare
Un singur fisier de date poate contine inregistrari intr-o
varietate de formate. Se considera urmatoarele date in care
inregistrarile EMP si DEPT sunt intercalate :
1 50
Manufacturing
-DEPT record
2 1119 Smith
50
-EMP record
2 1120 Snyder
50
1 60
Shipping
2 1121 Stevens 60
Un cimp de identificare a inregistrarii (ID) distinge intre
doua formate. Inregistrarea pentru departament are 1 in
prima coloana, pe cind inregistrarea de angajat are 2.
Fisierul de control foloseste pozitionarea exacta pentru a
incarca aceste date:
INTO TABLE dept
WHEN recid = 1
(recid POSITION(1:1) INTEGER EXTERNAL,
deptno POSITION(3:4) INTEGER EXTERNAL,
ename POSITION(8:21) CHAR)
INTO TABLE emp
WHEN recid <> 1
(recid POSITION(1:1)
INTEGER EXTERNAL,
empno POSITION(3:6)
INTEGER EXTERNAL,
ename POSITION(8:17) CHAR,
deptno POSITION(19:20) INTEGER EXTERNAL)
Pozitionarea relativa
Inregistrarile din exemplul anterior pot fi incarcate si ca
date delimitate. In acest caz totusi este necesar sa se
foloseasca cuvintul cheie POSITION.
Se foloseste urmatorul fisier de control:
INTO TABLE dept
WHEN recid = 1
(recid INTEGER EXTERNAL TERMINATED BY WHITESPACE,
deptno INTEGER EXTERNAL TERMINATED BY WHITESPACE,
dname CHAR TERMINATED BY WHITESPACE)
INTO TABLE emp
WHEN recid <> 1
(recid POSITION(1) INTEGER EXTERNAL TERMINATED BY ,
empno INTEGER EXTERNAL TERMINATED BY
ename CHAR TERMINATED BY WHITESPACE,
deptno INTEGER EXTERNAL TERMINATED BY )
Cuvintul cheie POSITION in a doua clauza INTO TABLE este
necesar pentru a incarca datele corect. Cuvintul cheie
determnina scanarea cimpurilor sa inceapa la coloana 1 cind se

verifica daca datele corespund cu al doilea format. Fara


aceasta, SQL*Loader cauta cimpul RECID dupa DNAME.
Incarcarea datelor in mai multe tabele
Folosind clauza position cu mai multe clauze INTO TABLES,
datele dintr-o singura inregistrare pot fi incarcate in mai
multe tabele.
Sumar
Clauzele multiple INTO TABLE permit extragerea mai multor
inregistrari logice dintr-o singura inregistrare de intrare si
recunoaste formate ale inregistrarii diferite in acelasi
fisier.
Pentru
datele
delimitate,
folosirea
corespunzatoare
a
cuvintului cheie POSITION este esentiala pentru obtinerea
rezultatelor asteptate.
Cind nu se foloseste cuvintul cheie POSITION clauzele multiple
INTO
TABLES
proceseaza
parti
diferite
ale
aceleiasi
inregistrari (date delimitate) permitind ca mai multe tabele
sa fie incarcate dintr-o inregistrare. Cind se foloseste
cuvintul cheie POSITION, clauzele INTO TABLE multiple pot
procesa aceeasi inregistrare in diferite moduri, permitind ca
mai multe formate sa fie recunoscute intr-un fisier de
intrare.
Generarea datelor
Incarcarea datelor fara fisiere
Este posibil sa se foloseasca SQL*Loader pentru a genera date
specificind numai secvente, numere de inregistrare, date
sistem si constante ca specificari de cimpuri.
SQL*Loader incarca atitea rinduri cite sunt specificate prin
cuvintul cheie LOAD. In aceasta situatie este cerut cuvintul
cheie LOAD. Cuvintul cheie SKIP nu este permis.
SQL*Loader este optimizat in acest caz. Ori de cite ori
SQL*Loader detecteaza ca sunt folosite numai specificari
generate, acesta ignora orice fisier specificat nu sunt
efectuate operatii I/O. In plus, nu este necesara memorie
pentru un vector de legatura. Daca exista clauza WHEN in
fisierul de control, SQL*Loader presupune ca evaluarea datelor
este necesara si sunt citite inregistrarile de intrare.
Setarea unei coloane la o valoare constanta
Aceasta este o forma simpla de a genera date. Acestea nu
variaza in timpul incarcarii si nu variaza intre incarcari.
CONTANTA
Pentru setarea unei coloane la o valoare constanta se
foloseste cuvintul cheie CONSTANT urmat de o valoare.
CONSTANT valoare
Data CONSTANT este interpretata de SQL*Loader ca intrare
caracter. Este convertita, daca este necesar, la tipul de data
al coloanei. Se pot inchide valorile intre ghilimele este
obligatoriu cind contine spatiu sau este cuvint rezervat.
Trebuie
specificata
o
valoare
legala
pentru
coloana
destinatie. Daca valoarea nu e corespunzatoare, fiecare rind
este refuzat.
Valorile numerice mai mari de 2**32-1 (4.294.967.295) trebuie
inchise intre apostroafe.

Nota: Nu se foloseste cuvintul cheie CONSTANT pentru a seta o


coloana la null. Pentru a seta o coloana la null nu se
specifica nimic pentru coloana.
Oracle seteaza automat aceste coloane la null cind incarac
rindul. Combinatia CONSTANT si o valoare este o specificare
completa a coloanei.
Setarea coloanei la un numar de inregistrare din fisierul de
data
Se foloseste cuvintul cheie RECNUM dupa numele coloanei pentru
a seta coloana la numarul inregistrarii logice din care a fost
incarcat rindul. Inregistrari ce sunt contorizate secvential
de la inceputul primului fisier, incepind cu inregistrarea1.
RECNUM
este
incrementat
cind
este
asamblata
fiecare
inregistrare logica. Astfel, acesta este incrementat pentru
inregistrari care sunt refuzate (discard, reject, sarite sau
incarcate).
Daca
se
foloseste
optiunea
SKIP=10,
prima
inregistrare incarcata are RECNUM 11.
RECNUM
Combinatia numele coloanei si RECNUM este o specificare
completa a coloanei.
column_name RECNUM
Setarea unei coloane la data curenta
O coloana specificata cu SYSDATE citeste data curenta a
sistemului, asa cum este definita functia SQL SYSDATE.
SYSDATE
Combinatia dintre numerele coloanei si cuvintul cheie SYSDATE
este o specificare completa a coloanei.
column_name SYSDATE
Coloana bazei de date trebuie sa fie CHAR sau DATE. Daca tipul
coloanei este CHAR, data este incarcata in forma dd-mon-yy.
Dupa incarcare poate fi accesata numai in aceasta forma. Daca
data sistem este incarcata intr-o coloana DATE, aceasta poate
fi accesata intr-o varietate de forme care includ timpul si
data. Pentru fiecare vector de inregistrari inserate intr-o
incarcare conventionala si pentru fiecare bloc de inregistrari
incarcate in timpul incarcarii directe se foloseste o noua
combinatie data/timp sistem.
Setarea coloanei la un numar de secventa mic
Cuvintul cheie SEQUENCE asigura o valoare unica pentru o
coloana particulara SEQUENCE se incrementeaza pentru fiecare
inregistrare care este incarcata sau refuzata(reject). Nu este
incrementata
pentru
inregistrarile
refizate(discard)
sau
sarite.
SEQUENCE
Combinatia nume coloana si functia SEQUENCE este o specificare
completa a coloanei.
unde:
columname Numele coloanei din baza de date la care I se
asigneaza secventa.
SEQUENCE Se specifica cuvintul cheie SEQUENCE pentru a
specifica valoarea pentru o coloana.
n - Specifica numarul cu care incep e secventa.

COUNT Secventa starteaza cu numarul de rinduri deja existent


in tabela plus incrementul.
MAX Secventa starteaza cu valoarea maxima curenta pentru
coloana plus un increment.
increment Valoarea cu care numarul de secventa este
incrementat dupa ce o inregistrare este incarcata sau
refuzata.
Daca un rind este refuzat (eroare de format sau genereaza o
eroare Oracle), numerele de secventa generate nu mascheaza
fenomenul. Daca la patru rinduri sunt asignate secventele
10,12,14 si 16 nu 10,12,14. Aceasta permite ca secventele sa
fie operate in ciuda erorilor de date. Cind se corecteaza se
reinsereaza datele refuzate, se pot seta manual coloanele
pentru a se agrea cu secventele.
Generarea numarului de secventa pentru mai multe tabele
Deoarece un numar unic de secventa se genereaza pentru fiecare
inregistrare logica de intrare mai degraba decit pentru
fiecare tabela inserata, acelasi numar de secventa poate fi
folosit cind se insereaza date in mai multe tabele.
Uneori se doreste generarea numerelor de secventa diferite
pentru fiecare clauza INTO TABLE. De exemplu, formatul datelor
defineste trei inregistrari logice fiecare inregistrare de
intrare. In acest caz se folosesc trei clauze INTO TABLE
fiecare cu inserarea unei parti din inregistrare in aceeasi
tabela. De notat, cind se folosesc SEQUENCE(MAX) SQL*Loader va
folosi maximum din fiecare tabela care poate conduce la
inconsistente in numerele de secventa. Pentru a genera numere
de secventa pentru aceste inregistrari , trebuie generat un
numar unic pentru fiecare din cele trei inserari. Se foloseste
numarul de inserari in tabela per inregistrare ca increment si
se starteaza numarul de secventa pentru fiecare inserare cu
numere succesive.
Exemple
Se presupune ca se doreste incarcarea urmatoarelor nume de
departamente in tabela DEPT. Fiecare inregistrare de intrare
contine numele departamentului si se doreste generarea
numarului de departament automat.
Accounting
Personnel
Manufacturing
Shipping
Purchasing
Maintenance
Se foloseste urmatorul fisier de control pentru a genera numar
de departament unic:
INTO TABLE dept
(deptno sequence(1, 3),
dname
position(1:14) char)
INTO TABLE dept
(deptno sequence(2, 3),
dname position(16:29) char)
INTO TABLE dept
(deptno sequence(3, 3),
dname position(31:44) char)
Prima clauza INTO TABLE genereaza numarul de departament1, a
doua numarul doi si a treia numarul 3. Toate trei folosesc 3
ca increment de secventa (numarul numelui departamentului in

fiecare inregistrare). Fisierul de control incarca Accountig


ca deparament cu numarul 1. Personal cu 2 si Manufacturing cu
3. Numarul de secventa este incrementat cu 3 pentru
inregistrarea urmatoare, astfel ca Shipping se incarca cu 4,
Purchasing cu 5 s.a.m.d.
Specificarea tipurilor de data
Conversia tipului de data
Specificarea tipuli de data si fiserul de control spune
SQL*Loader cum sa interpreteze informatiile din fisierul de
date. Serverul defineste tipurile de date pentru fiecare
coloana din baza de date. Legatura intre acestea doua este
numele coloanei specificate in fisierul de control.
SQL*Loader extrage date dintr-un cimp din fisierul de import,
ghidat de specificarea tipului in fisierul de control.
SQL*Loader trimite cimpul la server pentru a fi memorat in
coloana corespunzatoare (ca parte a vectorului de legatura a
rindurilor inserate). Tipul de data din fisier nu este necesar
sa fie acelasi cu tipul de data al coloanei din baza de date
Oracle. Oracle efectueaza automat conversia, dar trebuie
asigurat ca conversia are sens si nu genereaza erori. Cind un
cimp cu tipul CHAR este incarcat intr-o coloana cu tipul
NUMBER, trebuie asigurat ca continutul cimpului caracter
reprezinta un numar valid.
Nota: SQL*Loader nu contine specificatii de tip de data pentru
tipuri de date interne Oracle, cum ar fi NUMBER sau VARCHAR2.
Tipurile de data pentru SQL*Loader descrie date care pot fi
create cu un editor de texte (tipuri caracter) se cer limbaje
de programare standard (tipuri native). Cu toate ca SQL*Loader
nu recunoaste tipuri de date cum ar fi NUMBER sau VARCHAR2 ,
oricare data pe care Oracle o poate converti poate fi
incarcata in coloanele bazei de date.
Tipuri de date
Anumite tipuri de date constau in intregime in date binare sau
contin date binare in implementarea lor. Aceste tipuri de date
non-caracter sunt tipuri native.
INTEGER
ZONED
SMALLINT
VARCHAR
FLOAT
GRAPHIC
DOUBLE
GRAPHIC EXTERNAL
BYTEINT
VARGRAPHIC
(packed)DECIMAL RAW
Deoarece aceste tipuri de date contin date binare, multe
dintre acestea nu sunt pregatite pentru transport intre
diferite sisteme de operare. Datele RAW si GRAPHIC sunt o
exceptie SQL*Loader nu incearca sa interpreteze aceste tipuri,
pur si simplu le memoreaza cum sunt.
Informatii suplimentare: Tipurile de date native nu pot fi
specificate cu delimitatori. Dimensiunea tipurilor native
INTEGER, SMALLINT, FLOAT si DOUBLE sunt determinati de
sistemul de operare gazda. Aceasta dimensiune este fixa, nu
poate fi suprascrisa in fisierul de control. Dimensiunea altor
tipuri native poate fi specificata in fisierul de control.
INTEGER

Data este un cuvint intreg binar. Daca se specifica start:end


in clauza POSITION, end este ignorat. Lungimea cimpului este
lungimea cuvintului intre in sistem(In C tipul LONG INT).
Aceasta lungime nu poate fi modificata prin fisierul de
control.
INTEGER
SMALLINT
Daca este un binar intreg pe jumatate de cuvint. Daca se
specifica start:end in clauza POSITION, end este ignorat.
Lungimea cimpului este o jumatate de cuvint in sistem.
SMALLINT
Informatii suplimentare: In limbajul de programare C, este
tipul SHORT INT. O cale de a-i determina lungimea, este de a
face un fisier de control mic fara date si a vedea rezultatul
in fisierul log. Lungimea nu poate fi modificata prin fisierul
de control.
FLOAT
Datele sunt in precizie simpla, numar binar, punct zecimal
flotant. Daca se specifica in clauza POSITION, este ignorata.
Lungimea cimpului este lungimea preciziei simple, numar binar
in punct zecimal flotant in sistem.(In C tipul FLOAT).
Lungimea nu poate fi modificata prin fisierul de control.
DOUBLE
Datele sunt in precizie dubla, numar binar punct zecimal
flotant. Daca se specifica end in clauza POSITION, este
ignorata. Lungimea cimpului este lungimea unui numar binar in
punct zecimal flotant in precizie dubla.(In C tipul DOUBLE sau
LONG FLOAT). Lungimea nu poate fi modificata prin fisierul de
control.
DOUBLE
BYTEINT
Este incarcata valoarea zecimala a reprezentarii binare. De
exemplu, caracterul x1C este incarcat ca 28. Lungimea
cimpului BYTEINT este intotdeauna 1 byte. Daca se specifica
(star:end) end se ignora.
Sintaxa este:
BYTEINT
Exemplu
(column1 position(1) BYTEINT,
column2 BYTEINT,
...
)
ZONED
Datele ZONED sunt in format zecimal: un sir de pozitii
zecimale, unul per byte, cu semnul inclus in ultimul byte.(In
COBOL este cimpul SIGN TRAILING).Lungimea cimpului este egala
cu precizia (numarul de pozitii, care s-au specificat.
Sintaxa este:
unde:
precision numarul de pozitii in numar si scala(daca este
data) este numarul de pozitii la dreapta punctului zecimal.
De exemplu,

sal POSITION(32) ZONED(8)


specifica 8 pozitii intregi care incep la pozitia 32.
DECIMAL
Datele DECIMAL sunt in format zecimal impachetat: doua pozitii
per byte, exceptie ultimul byte care contine o pozitie si un
semn. Cimpurile DECIMAL permit specificarea unui punct zecimal
asa incit pot fi reprezentate valori fractionale.
Sintaxa este:
unde:
precision numarul de pozitii in valoare. Lungimea cimpului
este calculata din pozitii(numarul de pozitii +2/2)rotunjit in
sus.
scale factorul de scala, numarul de pozitie la dreapta
punctului zecimal. Implicit este zero (indicind un intreg).
Scala poate fi mai mare decit numarul de pozitii, dar nu poate
fi negativa.
De exemplu,
sal DECIMAL(7,2)
poate
reprezenta
un
numar
echivalent
+12345.67.In
inregistrarea de date, cimpul va ocupa 4 byte. Lungimea in
byte a cimpului DECIMAL este echivalenta cu (N+1)/2, rotunjit
in sus, unde N este numarul de pozitii si unul este adaugat
pentru semn, rotunjit in sus.
RAW
Datele RAW se incarca ca date binare asa cum sunt. Daca se
incarca intr-o coloana RAW a bazei de date, aceasta nu este
convertita de Oracle. Daca aceasta este incarcatanintr-o
coloana CHAR, Oracle o converteste la hexazecimal. Nu poate fi
incarcata intr-o coloana DATE sau numar.
Lungimea cimpului este numarul de bytes specificat in fisierul
de control. Lungimea este limitata numai de lungimea coloanei
destinatie din baza de date si resursele de memorie.
GRAPHIC
Data este un sir de caractere pe doi biti(DBCS). Oracle nu
suporta DBCS, totusi SQL*Loader citeste DBCS ca un singur
byte. Asemenea datelor RAW, cimpurile GRAPHIC sunt memorate
fara modificari in oricare din coloanele care s-au specificat.
Pentru cimpurile GRAPHIC si GRAPHIC EXTERNAL specificarea
POSOTION(start:end)
da
locatia
exacta
a
cimpului
in
inregistrarea logica. Daca se specifica lungimea dupa cuvintul
cheie GRAPHIC (EXTERNAL) se da numarul de caractere grafice pe
2 byte. Valoarea este multiplu de 2 pentru a gasi lungimea
cimpului in byte. Daca este specificat numarul de caractere
grafice, orice lungime care provine din POSITION este
ignorata.
GRAPHIC EXTERNAL
Daca cimpul DBCS este marginit de caractere shift-in si shiftout se foloseste GRAPHIC EXTERNAL. Este identic cu GRAPHIC,
conceptie ca primul si ultimul caracter (shift-in si shiftout) nu se incarca.
Sintaxa este:

unde:
GRAPHIC Datele sunt caractere pe doi biti.
EXTERNAL Sunt ignorate primul si ultimul caracter.
graphic_char_length Lungimea in DBCS.
De exemplu, [] reprezinta caractere shift-in si shift-out si #
reprezinta orice caracter pe doi biti.
Pentru a descrie #### se foloseste:
POSITION(1:4) GRAPHIC sau
POSITION(1) GRAPHIC(2)
Pentru a descrie [####] se foloseste:
POSITION(1:6) GRAPHIC EXTERNAL sau
POSITION(1) GRAPHIC EXTERNAL(2)
VARGRAPHIC
Datele sunt de lungime variabila, sir de caractere pe doi
byte. Aceasta consta in subcimpul lungime urmata de sirul de
caractere pe doi byte(DBCS).
Informatii suplimentare: Dimensiunea subcimpului lungime este
dimensiunea tipului SMALLINT din sistem (tipul SHORT INT
pentru C). Lungimea cimpului curent este data de primii doi
byte. Lungimea este numarul caracterelor grafice pe doi byte.
Acesta este multiplicat cu doi pentru a determina numarul de
byte de citit.
Sintaxa este:
Lungimea maxima specificata dupa cuvintul cheie VARGRAPHIC nu
include dimensiunea subcimpului lungime. Lungimea maxima
specifica numarul de caractere grafice. Acesta este inmultit
cu doi pentru a determina lungimea cimpului in byte.
Lungimea maxima implicita a cimpului este de 64 KB caractere
grafice sau 8 KB(2*4KB). Este o idee buna sa se specifice
lungimea maxima pentru astfel de cimpuri oricind este posibil
pentru a minimiza cerintele de memorie.
Daca este folosita clauza POSITION da locatia subcimpului
lungime, nu a primului caracter grafic. Daca se specifica
POSITION(start:end) locatia end determina o lungime maxima
pentru cimp. Ambele start si end identifica pozitia caracter
pe un singur byte. Start este extras din(end+1)pentru a da
lungimea cimpului in byte. Daca este specificata o lungime
maxima, aceasta suprascrie orice lungime maxima calculata din
POSITION.
Daca
un
cimp
VARGRAPHIC
este
terminat
la
sfirsitul
inregistrarii logice inainte ca acesta sa fie citit in
intregime se lanseaza o atentionare.
Datele VARGRAPHIC nu pot fi delimitate.
VARCHAR
Un cimp VARCHAR este un sir de caractere de lungime variabila.
Este considerat un tip de data nativ, mai degraba decit un tip
de data caracter deoarece include date binare. Consta intr-un
subcimp lungime urmat de un sir de caractere de lungime data.
Informatii suplimentare: Dimensiunea subcimp lungime este
dimensiunea tipului SQL*Loader SMALLINT in sistem(tipul SHORT
INT in C).

Sintaxa:
Lungimea maxima specificata in caracterul de control nu
include dimensiunea subcimpului lungime. Daca se specifica
optional dimensiunea maxima dupa cuvintul cheie VARCHAR,
atunci pentru aceste cimpuri se aloca un buffer de aceasta
dimensiune.
Valoarea implicita a buffer-ului este 4KB. Specificind o
valoare maxima mai mica, care este necesara pentru incarcarea
datelor se minimizeaza cerintele de memorie SQL*Loader, in
special cind sunt mai multe cimpuri VARCHAR.
Clauza POSITION, daca este folosita de locatia subcimpului
lungime, nu a primului caracter. Daca se specifica POSITION
(start:end), locatia end determina lungimea maxima a cimpului.
Start este extras din (end +1) pentru a da lungimea cimpului
in byte. Daca se specifica o lungime maxima, suprascrie orice
lungime calculata din POSITION.
Daca cimpul VARCHAR este trunchiat la sfirsitul inregistrarii
logice inainte de a se citi intreaga lungime, se lanseaza un
mesaj de atentionare.
Datele VARCHAR nu pot fi delimitate.
Conflicte intre specificarea dimensiunilor cimpurilor cu tip
de data nativ
Sunt citeva moduri de a specifica lungimea unui cimp. Daca se
specifica mai multe lungimi si sunt in conflict, una din
aceste specificari are intiietate. Daca este un conflict, se
lanseaza un mesaj de atentionare. Urmatoarele reguli determina
care lungime este folosita:
1. Dimensiunea datelor INTEGER, SMALLINT, FLOAT si DOUBLLE este
fixa. Nu este posibil sa se specifice o lungime pentru
aceste tipuri in fisierul de control. Daca sunt specificate
pozitiile de inceput si pozitiile de sfirsit, este folosita
numai pozitia de start, pozitia de sfirsit este ignorata.
2. Daca se specifica lungimea (sau pozitia) pentru cimpuri
DECIMAL, ZONED, GRAPHIC, GRAPHIC EXTERNAL sau RAW in
conflict cu dimensiunea calculata din specificarea POSITION
(start:end), atunci este folosita lungimea (sau precizia).
3. Daca dimensiunea maxima specificata pentru cimpurile VARCHAR
sau VARGRAPHIC este in conflict cu dimensiunea calculata din
specificarea POSITION (start:end), atunci este folosita
specificarea maxima.
Daca de exemplu, este un tip nativ INTEGER de 4 bytes lungime
si se specifica pozitia cimpului:
column POSITION(1:6) INTEGER
atunci este lansat un mesaj de atentionare si este folosita
lungimea corespunzatoare (4). In acest caz fisierul log arata
lungimea actuala folosita sun antetul Len in tabela
column Name
Position
Len Term Encl Datatype
------------ --------- ---- ---- ---- --------COLUMN1
1:6
4
INTEGER
Tipurile de data caracter

Acest tip de data poate fi tip CHAR, DATE si numeric EXTERNAL.


Aceste cimpuri pot fi delimitate si pot crea lungimi(sau
lungimi maxime) specificate in fisierul de control.
CHAR
Cimpul contine date caracter. Lungimea este optionala si este
luata din specificatia POSITION daca nu este specificata. Daca
este specificata, lungimea aceasta suprascrie lungimea din
specificarea POSITION. Daca nu este data o lungime, CHAR se
presupune ca are lungimea 1.
Sintaxa:
Un cimp de tip CHAR poate avea deasemenea lungime variabila
sau sa fie marginit.
Atentie: Daca coloana din baza de date este definita ca LONG,
trebuie specificata explicit lungime maxima(maximum pentru
LONG este 2 GB)sau specificarea lungimii in cuvintul cheie
CHAR sau cu cuvintul cheie POSITION. Aceasta garanteaza ca
este alocat un buffer suficient pentru valori si este necesar
chiar daca datele sunt delimitate sau marginite.
DATE
Cimpul contine caractere data care vor fi convertite de Oracle
in data folosind masca specificata.
De exemplu,
LOAD DATA
INTO TABLE DATES (COL_A POSITION (1:15) DATE DD-Mon-YYYY)
BEGINDATA
1-Jan-1991
1-Apr-1991 28-Feb-1991
Atentie: Spatiile sunt ignorate si datele sunt analizate de la
stinga la dreapta daca nu sunt prezenti delimitatorii.
Specificarea lungimii este optionala in afara de cazul cind se
specifica o masca de lungime variabila. In exemplul anterior,
masca specifica o data in format lungime fixa de 11 caractere.
SQL*Loader numara 11 caractere in masca si de aceea asteapta
11 caractere in cimp in asa fel ca specificarea lucreaza
corect.
Dar, cu o specificare cum ar fi
DATE Month dd, YYYY
masca este de 14 caractere pe cind lungimea maxima a cimpului,
cum ar fi
September 30, 1991
este de 18 caractere. In acest caz trebuie specificata o
lungime. Similar, o lungime este ceruta pentru orice data
Iuliana (masca J)- o lungime a cimpului este ceruta de
fiecare data cind lungimea sirului de date depaseste lungimea
mastii. Daca nu e specificata explicit o lungime, ea poate
deriva din clauza POSITION. Este o idee buna sa se specifice
lungimea ori de cite ori se foloseste o masca in afara cazului
in care exista siguranta ca lungimea cimpului este mai mica
sau egala cu masca.
Daca este prezenta o specificare de lungime, suprascrie
lungimea din clauza POSITION, si lungimea derivata din masca.

Masca poate fi orice masca de data valida Oracle. Daca se


omite masca, masca datei Oracle implicita este dd-mon-yy.
Lungimea
trebuie
inclusa
in
paranteze
si
masca
intre
ghilimele.
Un cimp cu tipul DATE poate fi deasemenea delimitat.
Un cimp data care este in intregime spatiu genereaza o eroare
in afara cazului cind se specifica NULLIF BLANKS.
MLSLABEL
Aceste tipuri de data Trusted Oracle memoreaza reprezentarea
interna a etichetelor Trusted Oracle generate de sistemul de
siguranta al sistemului de operare. Trusted Oracle foloseste
etichetele pentru a controla accesul la baza de date. Se pot
defini coloane folosind tipul MLSLABEL in Oracle8 pentru
compatibilitate cu aplicatiile Trusted Oracle, dar numai
valoarea NULL este valida pentru coloanele Oracle8.
Tipul de data numeric external
Tipul de data numeric external este tip de data numeric
(INTEGER, FLOAT, DECIMAL si ZONED)specificat cu cuvintul cheie
EXTERNAL cu lungime optionala si delimitatori specificati.
Aceste tipuri sunt simplu de citit, forma caracter a datelor
numerice. Numeric EXTERNAL poate fi specificat cu lungime si
delimitatori, asemanator cu datele CHAR. Lungimea este
optionala dar daca este specificata, suprascrie POSITION.
Sintaxa:
Atentie: Datele sunt numere in forma caracter, nu date
reprezentate binar, astfel ca aceste tipuri de date sunt
identice cu CHAR si sunt tratate identic, cu exceptia
utilizarii DEFAULTIF. Daca se doreste ca implicit sa fie NULL,
se foloseste CHAR; daca se doreste zero se foloseste EXTERNAL.
Valorile FLOAT EXTERNAL
Datele Float EXTERNAL pot fi date in notatie stiintifica sau
regulata. Ambele sunt reprezentari ale aceleiasi valori.
Specificarea delimitatorilor
Marginile cimpurilor CHAR, DATE, MLSLABEL sau numeric EXTERNAL
pot fi marcate prin specificarea caracterelor de delimitare
continute in inregistrarea de intrare. Se indica cum este
delimitat cimpul folosind o specificare de delimitator dupa
specificarea tipului de data.
Datele delimitate pot fi TERMINATED sau ENCLOSED.
Cimpurile TERMINATED
Cimpurile TERMINATED sunt citite de la pozitia start, pina la,
dar nu inclusiv, prima intilnire a caracterului delimitator.
Daca delimitatorul terminator este gasit in prima pozitie a
coloanei, cimpul este null.
TERMINATED BY WHITESPACE
Daca este specificat TERMINATED BY WHITESPACE, datele sunt
citite
pina
la
prima
intilnire
a
unui
caracter
WHITESPACE(spatiu, tab, linie noua). Atunci pozitia curenta
avanseaza pina cind nu se mai gasesc caractere WHITESPACE
adiacente. Aceasta permite valorilor cimpurilor sa fie
delimitate de cantitati variate de WHITESPACE.
Cimpuri inchise

Cimpurile inchise sunt citite sarind WHITESPACE pina cind este


intilnit un caracter non WHITESPACE. Daca acest caracter este
delimitator, atunci datele sunt citite pina la al doilea
delimitator. Orice alte caractere genereaza eroare. Daca se
intilnesc doua caractere delimitator unul dupa altul, in
valoarea
datei
este
folosita
o
singura
intilnire
a
caracterului de delimitare. De exemplu, DONT este memorat
ca DONT. Totusi, daca cimpul consta in doua caractere de
delimitare, valoarea sa este null. Se poate specifica clauza
TERMINATED BY sau clauza ENCLOSED BY, sau ambele. Daca sunt
folosite ambele, clauza TERMINATED BY trebuie sa fie prima.
Sintaxa:
unde:
TERMINATED Datele sunt citite pina la prima intilnire a
delimitatorului.
BY Cuvint cheie optional.
WHITESPACE Delimitatorul este un caracter WHITESPACE care
include linie noua, sfirsit de linie, retur de car (folosit
numai cu TERMINATED nu cu ENCLOSED).
OPTIONALLY

Datele
pot
fi
inchise
intre
caracterele
specificate.
Daca
SQL*Loader
gaseste
prima
aparitie
a
caracterului, citeste valoarea datei pina la aparitia celui
de-al doilea. Daca datele nu sunt incluse, data este citita ca
un cimp terminat. Daca se specifica o inchidere optionala,
trebuie specificata clauza TERMINATED BY (sau local in
definitia cimpului sau global in clauza FIELDS).
ENCLOSED Data este intre doi delimitatori.
char delimitatorul este un caracter singur CHAR.
Xhex_byte Delimitatorul este un caracter care are valoarea
specificata prin hex_byte in schema de codificare cum ar fi
X1F(echivalent cu 31 zecimale).X trebuie sa fie cu
majuscule.
AND Acest cuvint cheie specifica un delimitator de inchidere
care poate fi diferit de delimitatorul de inchidere initial.
Daca clauza AND nu este prezenta, delimitatorul initial si
final se presupune ca sunt aceeasi.
Exemple:
TERMINATED BY , a data string,
ENCLOSED BY a data string
TERMINATED BY , ENCLOSED BY a data string,
ENCLOSED BY ( AND )(a data string)
Semne de punctuatie in data
Uneori acelasi semn de punctuatie care este delimitator
trebuie sa fie inclus in date. Pentru a face posibil aceasta,
doua caractere de delimitare adiacente sunt interpretate ca o
singura aparitie a caracterului si acest caracter este inclus
in date. De exemplu:
(The
delimiters
are
left
parentheses,
(,
and
right
parentheses, )).)
cu specificarea cimpului:
ENCLOSED BY ( AND )
Scrie urmatorul rind in baza de date:

The delimiters are left parens, (, and right parens,).


Pentru aceste motive, problemele se ivesc cind cimpuri
adiacente folosesc aceiasi delimitatori.
De exemplu, specificatia urmatoare:
field1 TERMINATED BY /
field2 ENCLOSED by /
Urmatoarele date vor fi interpretate corespunzator:
This is the first string/
/This is the second string/
Dar daca field1 si field2 sunt adiacente, rezultatul va fi
incorect, pentru ca:
This is the first string//This is the second string/
va fi interpretat ca un singur sir de caractere cu un / in
mijloc si acest sir va apartine la field1.
Lungimea maxima a datelor delimitate
Lungimea maxima implicita a datelor delimitate este de 255
byte. Astfel, cimpurile delimitate solicita o cantitate
semnificativa de memorie pentru memorarea vectorului de
legatura. O idee buna ar fi specificarea unei cit mai mici
valori maxime.
Incarcarea datelor completate cu blank-uri de delimitatori
Blank-urile de completare pot fi marcate numai cu tipuri
delimitate. Daca un cimp este de noua caractere lungime si
contine valoarea DANIELbbb, unde bbb sunt trei blank-uri, este
incarcata in Oracle ca DANIEL daca este declarata CHAR(9).
Daca se doreste incarcarea blank-urilor trebuie declarat
CHAR(9) TERMINATED BY : si se adauga: la acest cimp astfel
incit cimpul este DANIELbbb:. Acest cimp este incarcat ca
DANIELbbb, cu spatiile de completare.
Conflicte intre lungimile cimpurilor de tip caracter
Un fisier de control poate specifica mai multe lungimi pentru
cimpuri de date CHAR, DATE, MLSLABEL si numeric EXTERNAL. Daca
exista un conflict intre lungimile specificate, una are
intiietate si este lansat un mesaj de atentionare.
Predeterminarea dimensiunii cimpurilor
Daca se specifica o pozitie de start si o pozitie de sfirsit
pentru aceste cimpuri, atunci lungimea cimpului se calculeaza
din aceste specificari. Daca se specifica o lungime ca parte a
tipului de data si nu se specifica o pozitie de sfirsit,
cimpul are lungimea data. Daca pozitia de start, pozitia de
sfirsit si lungimea sunt sppecificate, si cele doua lungimi
difera, atunci se foloseste lungimea data ca parte a
specificarii tipului. De exemplu, daca se specifica
position(1:10) char(15)
atunci lungimea cimpului este 15.
Cimpuri delimitate
Daca un cimp delimitat este specificat cu o lungime sau daca
aceasta este calculata din pozitiile de start si de sfirsit,
atunci aceasta lungime este lungimea maxima a cimpului.
Lungimea curenta va putea varia pina la maximum, bazata pe
prezenta delimitatorului. Daca pozitia de start si pozitia de
sfirsit sunt specificate ambele pentru un cimp si este
specificata
lungimea,
atunci
lungimea
specificata
va

suprascrie lungimea calculata din pozitia de start si de


sfirsit.
Daca delimitatorul asteptat lipseste si nu este specificata
lungimea maxima, atunci sfirsitul inregistrarii inseamna
sfirsitul cimpului. Daca s-a specificat TRAILING NULLCOLS
cimpurile ramase sunt null. Daca delimitatorul sau sfirsitul
inregistrarii genereaza un rind care este mai lung decit
maximul specificat, se genereaza o eroare.
Masca cimpurilor de data
Lungimea cimpurilor data depinde de masca, daca aceasta este
specificata. Masca furnizeaza un sablon, furnizind SQL*Loader
cum sa interpreteze datele din inregistrare. De exemplu, daca
masca specificata este:
Month dd, yyyy
atunci May 3,1991 va ocupa 11 caractere in inregistrare, pe
cind January 31, 1992 va ocupa 16.
Daca sunt specificate pozitiile de start si de sfirsit, atunci
lungimea calculata din specificarea pozitiilor suprascrie
lungimea derivata din masca. O specificare a lungimii cum ar
fi DATE(12) suprascrie pe toate. Daca cimpul data este
specificat cu delimitatori de terminare sau inchidere,
lungimea specificata in fisierul de control este interpretata
ca lungime maxima a cimpului.
Incarcarea datelor intre sisteme de operare definite
Cind fisierul de date este creat intr-un sistem de operare si
trebuie incarcate sub alt sistem de operare, datele trebuie
scrise intr-o forma pe care sistemul destinatie o poate citi.
De exemplu, daca sistemul sursa are o reprezentare nativa,
reprezentare in punct flotant care foloseste 16 byte si
sistemul destinatie are reprezentarea in punct flotant pe 12
byte. Nu exista o cale directa prin care sistemul destinatii
sa citeasca datele generate de sistemul sursa. O solutie este
de a incarca datele prin baza de date legate Net8, avind
avantajul conversiei automate. In general problemele de
incarcare intre sisteme de operare se intilnesc cind sunt
tipuri de date native.
Determinarea dimensiunii vectorului de legatura
Determinarea dimensiunii vectorului de legatura se refera la
optiunea SQL*Loader de incarcare conventionala. Nu se aplica
la metoda incarcarii directe. Deoarece incarcarea directa
formateaza blocurile bazei de date direct, nu foloseste
interfata Oracle SQL, nu foloseste un vector de legaturi.
SQL*Loader foloseste o optiune de vector de interfata SQL
pentru a transfera date in baza de date. La un moment sunt
citite mai multe rinduri si memorate intr-un vector de
legatura. Cind SQL*Loader trimite spre Oracle o comanda
INSERT, intregul vector este inserat o data. Dupa ce rindurile
vectorului de legatura s-au inserat, se lanseaza COMMIT.
Cerinte minime
Vectorul de legatura trebuie sa fie suficient de mare sa
contina un singur rind. Daca lungimea maxima a rindului
depaseste dimensiunea vectorului de legatura, asa cum este
specificata prin parametrul BINDSIZE, SQL*Loader genereaza o

eroare. Astfel vectorul de legatura contine atitea rinduri


cite incap in el, pina la limita setata prin parametrul ROWS.
Cu toate ca vectorul de legatura in intregime nu trebuie sa
ocupe memorie contigua, buffer-ul pentru fiecare cimp in
vectorul de legatura trebuie sa ocupe memorie contigua. Daca
sistemul de operare nu poate furniza memorie contigua ca sa
memoreze un cimp, SQL*Loader genereaza o eroare.
Implicatii de performanta
Pentru a minimiza numarul de apeluri la Oracle si a maximiza
performanta, este preferabil vector de legatura mare. In
general se obtine crestere de performanta cu cresterea
vectorului de legatura pina la 100 de rinduri. Cresterea
numarului
de
rinduri
peste
100
creste
nesemnificativ
performanta, astfel ca alegerea dimensiunii a 100 de rinduri
este o valoare buna. In general orice dimensiune rezonabila
permite SQL*Loader sa opereze efectiv.
Specificarea
numarului
de
rinduri
fata
de
dimensiunea
vectorului de legatura.
Cind se specifica o dimensiune a vectorului de legatura
folosind parametrul BINDSIZE in linia de comanda sau clauza
OPTION in fisierul de control, se impune o limita superioara
in vectorul de legatura. Vectorul de legatura nu depaseste
nicicind maximul.
Ca parte a initializarii sale SQL*Loader determina spatiul
cerut de memorarea unui singur rind. Daca aceasta dimensiune
este prea mare pentru a intra in maximul specificat,
incarcarea se termina cu eroare.
SQL*Loader multiplica aceasta dimensiune cu numarul de rinduri
de incarcat, daca aceasta a fost specificata cu parametrul
ROWS in linia de comanda sau cu clauza OPTION in fisierul de
control. Daca aceasta dimensiune intra in maximul vectorului
de legatura, incarcarea continua SQL*Loader nu incearca sa
expandeze numarul de rinduri pentru a atinge dimensiunea
maxima a vectorului de legatura. Daca sunt specificate si
numarul de rinduri si dimensiunea maxima a vectorului de
legatura, SQL*Loader foloseste intotdeauna cea mai mica
valoare pentru vectorul de legatura.
Daca dimensiunea maxima a vectorului de legatura este prea
mica sa cuprinda numarul initial de rinduri SQL*Loader
foloseste un numar de rinduri mai mic care sa incape in maxim.
Calcularea
Dimensiunea vectorului de legatura este egala cu numarul de
rinduri pe care le contine inmultite cu lungimea maxima a
fiecarui rind. Lungimea maxima a unui rind este egala cu suma
lungimii maxime a cimpurilor plus depasirea.
dimensiunea_vectorului=(numarul_de_rinduri)*(lungimea_maxima_
a_rindului)
unde:
(lungimea_maxima_a_rindului)=
suma(lungimea_cimpurilor_fixe)+
suma(lumngimea_maxima_a_cimpurilor_variabile)+
suma(depasirea_pentru_fiecare_cimp_variabil)

Multe cimpuri nu au dimensiune variabila. Sunt aceleasi pentru


fiecare rind incarcat. Pentru aceste cimpuri, lungimea maxima
a cimpului este lungimea cimpului, in byte. Pentru aceste
cimpuri nu este depasire.
Cimpurile care pot varia in lungime sunt:
VARCHAR
VARGRAPHIC
CHAR
DATE
numeric EXTERNAL
Lungimea maxima descrie numarul de byte sau pozitii caracter,
pe care cimpul le ocupa in inregistrarea de intrare. Lungimea
descrie deasemenea cantitatea de memorie pe care fiecare cimp
o ocupa in vectorul de legatura, dar vectorul de legatura
include o depasire aditionala pentru cimpurile care au
dimensiune variabila.
Cind tipul caracter (CHAR, DATE si numeric EXTERNAL) sunt
specificate cu delimitatori orice lungime specificata pentru
aceste cimpuri este lungimea maxima. Cind se specifica fara
delimitatori, dimensiunea in inregistrare este fixa, dar
dimensiunea
cimpurilor
inserate
poate
varia
din
cauza
completarii cu WHITESPACE. Intern, aceste tipuri sunt tratate
intotdeauna ca si cimpuri de lungime variabila chiar daca sunt
cimpuri de lungime fixa.
Pentru fiecare din aceste cimpuri, in vectorul de legatura
este inclus un indicator de lungime. Spatiul rezervat pentru
cimp in vectorul de legatura este suficient de mare pentru a
retine cea mai mare valoare posibila a cimpului. Indicatorul
de lungime da lungimea actuala a cimpului pentru fiecare rind.
In concluzie:
dimensiunea_vectorului_de_legatura =
numarul_de_rinduri * (suma(lungimea_cimpurilor_fixe)+
suma(lungimea_cimpurilor_variabile)+
(numarul_de_cimpuri_variabile)*
(dimensiunea_indicatorului_de_lungime))
Determinarea dimensiunii indicatorului de lungime
In cele mai multe sisteme dimensiunea indicatorului de lungime
este doi byte. In mai putine sisteme este trei byte. Pentru
determinarea dimensiunii se foloseste urmatorul fisier de
control:
OPTIONS (ROWS=1)
LOAD DATA
INFILE *
APPEND
INTO TABLE DEPT
(deptno POSITION(1:1) CHAR)
BEGINDATA
a
Acest fisier de control incarca unu care foloseste un cimp de
un caracter folosind un vector de legatura de un rind. Nu se
incarca date din cauza eririi de conversie care se intilneste
cind a se incarca ca numar. Dimensiunea vectorului de
legatura aratata in fisierul log, munis 1 (lungimea sirului
caracter) este valoarea indicatorului de lungime.

Nota:
O
tehnica
similara
poate
determina
dimensiunea
vectorului de legatura fara a face nici o calculatie. Se
ruleaza fisierul de control fara date si ROWS=1 pentru a
determina cerintele de memorie pentru un singur rind de date.
Se multiplica cu numarul de rinduri dorit in vectorul de
legatura si se obtine dimensiunea vectorului de legatura.
Calcularea dimensiunii buffer-ului de cimpuri
Tabela urmatoare sintetizeaza cerintele de memorie pentru
fiecare tip de date. L este lungimea specificata in fisierul
de
control,
P
este
precizia,
S
este
dimensiunea
indicatorului de lungime.
Cimpuri invariate
Tipul
Dimensiunea
INTEGER
Depinde de sistemul de operare
SMALLINT
FLOAT
DOUBLE
Cimpuri non grafice
Tip
Zecimal
(impachetat)
ZONED
RAW
CHAR (nedelimitat)
DATA (nedelimitat)
Numeric EXTERNAL
(nedelimitat)
MLSLABEL

Dimensiunea
implicita
Nu
Nu
Nu
1
Nu
Nu

Dimensiunea
specificata
(P+1)/2 rotunjit in
sus
P
L
L+S
L+S
L+S

Nu

L+S

Cimpuri grafice
Tip
Dimensiunea
implicita
GRAPHIC
GRAPHIC
EXTERNAL
VARGRAPHIC

Nu
Nu

Lungimea
Lungimea
specificata cu specificata cu
DATATYPE
POSITION
L
2*L
L-2
2*(L-2)

4KB*2

L+S

Cimpuri de lungime variabila


Tip
Dimensiune
implicita
VARCHAR
4KB
CHAR
DATE
Numeric EXTERNAL
255
(delimitate)

(2*L)+S

Specificarea
lungimii maxime (L)
L+S

L+S

Minimizarea cerintelor de memorie pentru vectorul de legatura


Vectorul de legatura

Este benefica acordarea unei atentii deosebite dimensiunii


implicite alocate pentru VARCHAR, VARGRAPHIC si formele
delimitate ale cimpurilor CHAR, DATE si numeric EXTERNAL.
Acestea pot consuma o mare cantitate de memorie in special
cind se multiplica cu numarul de rinduri din vectorul de
legatura. Este bine sa se specifice cea mai mica dimensiune
maxima posibila pentru aceste cimpuri. De exemplu:
CHAR(10) TERMINATED BY ,
foloseste
(10+2)*64=768
byte
in
vectorul
de
legatura,
presupunind ca indicatorul de lungime este de 2 byte.
CHAR TERMINATED BY ,
foloseste (255+2)*64=16.448 byte din cauza ca dimensiunea
maxima implicita pentru un cimp delimitat este 255. Aceasta
poate face o diferenta mare intre numarul de rinduri care
intra intr-un vector de legatura.
Comenzile multiple INTO TABLE
Cind se calculeaza dimensiunea vectorului de legatura pentru
un fisier de control care are multiple comenzi INTO TABLE, se
calculeaza ca si cind comanda INTO TABLE nu este prezenta. Se
imagineaza toate aceste cimpuri precizate in fisierul de
control ca o structura de date mare formatul unui singur
rind in vectorul de legatura.
Daca acelasi cimp din inregistrarea de date este mentionat de
mai multe ori in clauzele INTO TABLE, in vectorul de legatura
solicita
spatiu
aditional
de
fiecare
data
cind
este
mentionat.Astfel ca este important sa se minimizeze alocarea
buffer-ului pentru cimpuri de genul acesta.
Datele generate
Datele generate sunt create de functiile SQL*Loader CONSTANT,
RECNUM, SYSDATE si SEQUENCE. Asemenea date nu necesita spatii
in vectorul de legatura.
Setarea coloanelor la Null sau Zero
Daca se doreste ca toate valorile inserate pentru o coloana sa
fie null, se omite in intregime specificarea coloanei. Pentru
a seta valorile coloanei sa fie null conditionat de un test al
unor conditii in inregistrarea logica, se foloseste clauza
NULLIF. Pentru a seta o coloana numerica la zero in loc de
null, se foloseste clauza DEFAULTIF.
Clauza DEFAULTIF
Folosind DEFAULTIF in date numerice se seteaza o coloana la
zero cind conditia specificata pentru cimp este adevarata.
Folosind DEFAULTIF in date caracter (CHAR sau DATE) se seteaza
coloana la null.
DEFAULTIF conditie
O coloana poate avea ambele clauze NULLIF si DEFAULTIF, cu
toate ca adesea devin redundente.
Note: Acelasi efect se obtine cu un sir SQL si functia DECODE.
Cuvintul cheie NULLIF
Se foloseste cuvintul cheie NULLIF dupa tip de data si
specificare de delimitator optionala urmata de o conditie.
Conditia are acelasi format ca cea specificata in clauza WHEN.
Valoarea coloanei este setata la nuul daca conditia este
adevarata, astfel ramine neschimbata.

NULLIF conditie
Clauza NULLIF poate referi coloana pe care o contine de
exemplu:
COLUMN1 POSITION(11:17) CHAR NULLIF (COLUMN1 = unknown)
Aceasta specificare poate fi folosita daca se doreste ca
anumite date sa fie inlocuite cu null. Valoarea coloanei este
determinata prima data din fisierul de date. Aceasta este
setata la null inainte ce inserarea sa aiba loc.
Nota: Acelasi efect se obtine din sir SQL si functia NVL.
Coloana null la sfirsitul inregistrarii
Cind fisierul de control specifica mai multe cimpuri pentru o
inregistrare decit sunt prezente in inregistrare, SQL*Loader
trebuie sa determine daca coloanele (specificate) ramase pot
fi considerate null sau daca se genereaza eroare.
Incarcarea cimpurilor in intregime blank
Cimpurile in intregime blank pentru cimpuri numerice sau
cimpuri data determina refuzarea (reject) a inregistrarii.
Penru a incarca unele din aceste cimpuri ca null, se foloseste
clauza NULLIF cu cuvintul cheie BLANKS. Daca toate cimpurile
CHAR
care
sunt
in
intregime
blank
dar
marginile
de
delimitatori, atunci sunt incarcate toate blank-urile. Altfel
cimpul este incarcat ca null.
Eliminarea blank-urilor si tab-urilor
Blank-urile si tab-urile constituie WHITESPACE. Depinzind de
cum este specificat cimpul WHITESPACE de la inceputul cimpului
(leading whitespace) sunt incluse sau nu cind cimpul este
inserat in baza de date.
Tipuri de date
tipul CHAR
tipul DATE
tipul numeric EXTERNAL
- INTEGER EXTERNAL
- FLOAT EXTERNAL
- DECIMAL EXTERNAL (impachetat)
- ZONED (zecimal) EXTERNAL
Cimpurile VARCHAR
Cu toate ca cimpurile VARCHAR contin date caracter, aceste
cimpuri nu sunt niciodata trunchiate. Un cimp VARCHAR include
toate WHITESPACE care sunt parte a cimpului in fisierul de
date.
Specificatii ale lungimii cimpurilor
Sunt doua cai de a specifica lungimea cimpului. Daca un cimp
are o lungime constanta care este definita in fisierul de
control, aceasta este o dimensiune predeterminata. Daca
lungimea unui cimp nu este cunoscuta dinainte, dar depinde de
indicatori in inregistrare, cimpul este delimitat.
Dimensiunea cimpurilor predeterminate
Cimpurile care au o dimensiune predeterminata sunt specificate
cu pozitia de start si pozitia de sfirsit, sau cu o lungime,
de exemplu:
loc POSITION(19:31)
loc CHAR(14)

In al doilea caz chiar daca pozitia exacta a cimpului nu s-a


specificat, lungimea cimpului este predeterminata.
Cimpurile delimitate
Delimitatorii
sunt
caractere
care
marcheaza
marginile
cimpului. Delimitattorii de inchidere marginesc un cimp cum ar
fi ghilimelele in
_aa_
unde reprezinta blank sau tab.
Delimitatorii de terminare semnaleaza sfirsitul unui cimp, cum
ar fi virgula in
_ _a _ _,
Delimitatorii sunt specificati cu clauzele TERMINATED BY si
ENCLOSED BY, ca de exemplu:
loc POSITION(19) TERMINATED BY
loc POSITION(19) ENCLOSED BY
loc TERMINATED BY . OPTIONALLY ENCLOSED BY |
Combinarea delimitatorilor cu dimensiunea predeterminata
Daca este specificata dimensiunea predeterminata pentru un
cimp delimitat, si delimitatorul nu este gasit intre marginile
indicate prin specificarea dimensiunii, atunci se genereaza o
eroare. De exemplu, daca se specifica:
loc POSITION(19:31) CHAR TERMINATED BY ,
si nu este gasita o virgula intre pozitiile 19 si 31 in
inregistrarea de intrare, inregistrarea este refuzata. Daca
este gasita o virgula, aceasta delimiteaza cimpul.
Pozitionarea relativa a cimpurilor
Cind nu este specificata pozitia de start pentru un cimp,
aceasta incepe imediat dupa sfirsitul cimpului anterior.
Figura arata situatia cind cimpul anterior are o dimensiune
predeterminata.
Pozitionerea relativa dupa un cimp fix
Cimpul 1 CHAR(9) Cimpul 2 TERMINATED BY ,
|---------------|-------------------|
|_|_|_|_|_|a|a|a|_|_|_|_|_|b|b|b|b|,|
Daca cimpul anterior este determinat de un delimitator, atunci
cimpul urmator incepe imediat dupa delimitator.

Pozitionarea relativa dupa un cimp delimitat


Cimp 1
Cimp 2
TERMINATED BY ,
TERMINATED BY ,
|---------------------| |-----------------|
|_|_|_|_|_|_|_|a|a|a|a|,|_|_|_|_|_|b|b|b|b|,|
Cind un cimp este specificat in ambele moduri delimitatori de
inchidere si de terminare, cimpul urmator incepe dupa

delimitatorul de terminare. Daca s-a gasit un caracter non


WHITESPACE dupa delimitatorul de inchidere, dar inainte de
terminator SQL*Loader genereaza o eroare.
Pozitionarea relativa dupa un cimp delimitat
Cimp 1
Cimp 2
TERMINATED BY ,
TERMINATED BY ,
ENCLOSED BY
|-----------------|
|-----------------|
|_|_||_|_|_|_|a|a|a||_|_|,|_|_|_|_|_|b|b|b|b|,|

WHITESPACE la inceputul cimpului


Cimpul nu include WHITESPACE de la inceput in urmatoarele
cazuri:
cind cimpul anterior s-a terminat cu WHITESPACE si pentru
cimpul curent nu s-a specificat o pozitie de start
cind s-a specificat delimitatori de inchidere optional
pentru un cimp si delimitatorii de inchidere nu sunt
prezenti
Cimpul anterior terminat cu WHITESPACE
Daca cimpul anterior este TERMINATED BY WHITESPACE, atunci
toate WHITESPACE care urmeaza dupa un cimp actioneaza ca
delimitatori. Cimpul urmator starteaza cu urmatorul caracter
non WHITESPACE.
Cimpuri terminate prin WHITESPACE
Cimp 1
Cimp 2
TERMINATED BY
TERMINATED BY
WHITESPACE
WHITESPACE
|-----------------|
|-------------|
|_|_|_|_|_|_|_|a|a|a|_|_|_|_|_|_|_|_|_|b|b|b|_|_|
Aceasta situatie are
specificat explicit cu
intimpla deasemenea in
clauza FIELDS TERMINATED

loc cind cimpul anterior a fost


clauza TERMINATED BY WHITESPACE. Se
cazul in care se foloseste global
BY WHITESPACE.

Delimitatori de inchidere optionali


WHITESPACE de la inceput sunt eliminate dintr-un cimp cind
este specificat optional delimitatorul de inchidere dar nu
este prezent.
Ori de cite ori este specificat delimitatorul de inchidere,
SQL*Loader face o scanare inapoi, pentru gasirea primului
delimitator. Daca nu s-a gasit nici unul, atunci primul
caracter
non
WHITESPACE
semnaleaza
inceputul
cimpului.
SQL*Loader scrie peste WHITESPACE eliminindu-le din cimp.
Cimpuri terminate prin delimitatori de inchidere optionali

Cimp 1
Cimp 2
TERMINATED BY ,
TERMINATED BY ,
OPTIONALLY ENCLOSED BY OPTIONALLY ENCLOSED BY
|-----------------|
|-----|
|_||_|_|_|_|_|a|a|a|_||,|_|_|_|_|_|_|b|b|b|,|_|
Spre deosebire de cazul in care cimpul anterior este
TERMINATED
BY
WHITESPACE,
aceasta
specificare
elimina
WHITESPACE de la inceput chiar daca este specificata o pozitie
de start pentru cimpul curent.
Nota:
Daca
sunt
prezenti
delimitatorii
de
inchidere,
WHITESPACE de la inceput dupa delimitatorul initial de
inchidere
sunt
retinuti,
dar
WHITESPACE
dinaintea
delimitatorului se elimina.
WHITESPACE de la sfirsitul cimpului
WHITESPACE de la sfirsitul cimpului sunt suprimati numai
dintr-un cimp caracter care are dimensiunea predeterminata.
Sunt suprimati intotdeauna pentru aceste cimpuri.
Cimpuri inchise
Daca un cimp este inchis sau terminat si inchis, atunci orice
WHITESPACE din afara delimitatorilor de inchidere nu este
parte a cimpului. Orice WHITESPACE intre delimitatorii de
inchidere apartin cimpului, indiferent daca sunt la inceput
sau la sfirsit.

Specificarea

Data

Rezultat

Dimensiune
predeterminata
Terminat
Inchis
Terminat si inchis

_aa_

_aa_,
_aa_
_aa_
,
Inchidere
_aa_
,
optionala(prezenta)
Inchidere
optionala _aa_,
(absenta)
Cimpul anterior
_aa_
terminat cu
WHITESPACE

_aa

WHITESPACE
de inceput
prezent
Da

WHITESPACE
de sfirsit
Prezent
Nu

_aa_
_aa_
_aa_

Da
Da
Da

Da(2)
Da
Da

_aa_

Da

Da

aa_

Nu

Da

aa(3)

Nu

(3)

1. Cind este permis trunchierea unui cimp blank, valoarea lui


este null.
2. Exceptie cind cimpul este TERMINATED BY WHITESPACE.
3. Prezenta WHITESPACE de sfirsit depinde de specificatia
cimpului curent.

Pastrarea WHITESPACE
Pentru a impiedica eliminarea WHITESPACE din toate cimpurile
CHAR, DATE, NUMERIC EXTERNAL, se specifica in fisierul de
control PRESERVE BLANKS.
Cuvintul cheie PRESERVE BLANKS
PRESERVE BLANKS retine WHITESPACE de la inceputul cimpului
cind delimitatorul de inchidere optional nu este prezent. Lasa
deasemenea WHITESPACE de la sfirsit intacte cind cimpul este
specificat cu dimensiune predeterminata. Acest cuvint cheie
pastreaza tab-urile si blank-urile; de exemplu, daca cimpul
_aa_,
(unde- reprezinta blank) este incarcat cu urmatoarea clauza in
fisierul de control:
TERMINATED BY , OPTIONALLY ENCLOSED BY
Atunci sunt retinute WHITESPACE de la inceput si de la sfirsit
daca este specificat PRESERVE BLANKS, altfel WHITESPACE de la
inceput sunt eliminate.
Nota: Cuvintul BLANKS nu este optional, trebuie specificate
ambele cuvinte.
Terminated by WHITESPACE
Cind cimpul anterior este terminat cu WHITESPACE, PRESERVE
BLANKS nu pastreaza spatiile de la inceputul cimpului urmator
decit daca cimpul este specificat cu clauza POSITION care
include aceste WHITESPASCE. Altfel, SQL*Loader scaneaza mai
departe la sfirsitul cimpului anterior pina gaseste un
caracter non blank sau non tab.
Aplicarea operatorilor SQL la cimp
O mare varietate de operatori SQL pot fi aplicati la cimpuri
de date cu siruri SQL. Acest sir poate contine orice
combinatie de expresii SQL care sunt recunoscute de Oracle ca
valoare pentru clauza VALUE sau comanda INSERT. In general
orice functie SQL care returneaza o singura valoare poate fi
folosita. Numele coloanei si numele coloanei in sirul SQL
trebuie sa corespunde exact, ca in exemplul urmator:
LOAD DATA
INFILE *
APPEND INTO TABLE XXX
(LAST position(1:7) char UPPER(:\LAST\),
FIRST position(8:15) char UPPER(:FIRST)
)
BEGINDATA
Phil Locke
Jason Durbin
Sirul SQL trebuie sa fie cuprins intre ghilimele. In exemplu,
LAST trebuie cuprins intre ghilimele pentru ca este un cuvint
cheie SQL*Loader. FIRST nu este cuvint cheie SQL*Loader si de
aceea nu necesita ghilimele.
Sirul SQL apare dupa orice alte specificari ale coloanei date.
Este evaluat dupa clauza NULLIF sau DEFAULTIF dar inainte de
masca DATE. Nu poate fi folosit in cimpuri RECNUM, SEQUENCE,
CONSTANT sau SYSDATE. Daca RDBMS nu recunoaste sirul,
incarcarea se termina cu eroare. Daca sirul este recunoscut

dar determina o eroare a bazei de date, rindul care a generat


eroarea este refuzat.
Referirea cimpurilor
Pentru a referi un cimp intr-o inregistrare, se precede numele
cimpului cu(:). Valorile cimpurilor din inregistrarea curenta
sunt substituite. Exemplu:
field1 POSITION(1:6) CHAR LOWER(:field1)
field1 CHAR TERMINATED BY ,
NULLIF ((1) = a) DEFAULTIF ((1) = b)
RTRIM(:field1)
field1 CHAR(7) TRANSLATE(:field1, field1, :1)
Numai:field1 care nu este intre apostroafe este interpretat ca
nume de coloana.
field1 POSITION(1:4) INTEGER EXTERNAL
decode(:field2, 22, 34, :field1)
Referirea cimpurilor care sunt cuvinte cheie SQL*Loader
Alte cimpuri din aceeasi inregistrare pot fi referite ca in
exemplu:
field1 position(1:4) INTEGER EXTERNAL
decode(:field2, 22, 34, :field1)
Utilizari comune
Incarcarea datelor cu punct zecimal:
field1 POSITION(1:9) DECIMAL EXTERNAL(8) :field1, 1, 1000)
Trunchierea cimpurilor care sunt prea lungi:
field1 CHAR TERMINATED BY , SUBSTR(:field1, 1, 10)
Combinarea operatorilor
field1 POSITION(*+3) INTEGER EXTERNAL
TRUNC(RPAD(:field1, 6, 0), -2)
field1 POSITION(1:8) INTEGER EXTERNAL
TRANSLATE(RTRIM(:field1), N/A, 0)
field1 CHARACTER(10)
NVL( LTRIM(RTRIM(:field1)), unknown)
Utilizarea cu masca de data
Cind se foloseste o masca de date, masca de date este evaluata
dupa sirul SQL. Un cimp specifficat ca:
field1 DATE dd-mon-yy RTRIM(:field1)
Va fi inserat ca:
TO_DATE(RTRIM(<field1_value>), dd-mon-yyyy)
Interpretarea cimpurilor formatate
Este posibil folosirea operatorului TO_CAHR pentru a memora
date formatate si numere. Exemplu:
field1 ... TO_CHAR(:field1, $09999.99)
poate memora date numerice de intrare intr-o forma formatata,
unde field1 este o coloana a bazei de date. Acest cimp va fi
memorat cu caractere formatate(semnul dolar, punct, etc). Este
mai mare flexibilitate daca se memoreaza aceste valori ca
valori numerice sau data. Se pot aplica functii aritmetice
asupra acestor valori din baza de date pentru a aparea ca
valori formatate in raport.

Linia de comanda SQL*Loader

Se poate lansa SQL*Loader din linia de comanda folosind


anumite cuvinte cheie. Lansarea SQL*Loader din linia de
comanda este specifica fiecarui sistem de operare. Daca se
lanseaza SQL*Loader fara cuvinte cheie, SQL*Loader afiseaza un
ecran
cu
cuvintele
cheie
disponibile
si
valorile
lor
implicite.
Sqlldr
...
valid Keywords:
userid - Oracle username/password
control - Control file name
log - Log file name
bad - Bad file name
data - Data file name
discard - Discard file name
discardmax - Number of discards to allow
(Default all)
skip - Number of logical records to skip
(Default 0)
load - Number of logical records to load
(Default all)
errors - Number of errors to allow
(Default 50)
rows - Number of rows in conventional path bind array
or between direct path data saves
(Default: Conventional Path 64, Direct path
all)
bindsize - Size of conventional path bind array in bytes
(System-depoendent dafault)
silent - Suppress massages during run
(header,
feedback,
errors,
discards,
partitions,
all)
direct - Use direct path
(Default FALSE)
parfile - Parameter file: name of file that contains
parameter specifications
parallel - Perform parallel load
(Default FALSE)
file - File to allocate extens from
Folosirea cuvintelor cheie
Cuvintele cheie sunt separate optional prin virgula. Se pot
introduce in orice ordine si sunt urmate de un argument valid.
Exemplu:
SQLLDR CONTROL=foo.ctl, LOG=bar.log, BAD=baz.bad, DATA=etc.dat
USERID=scott/tiger, ERRORS=999, LOAD=2000, DISCARD=toss.dis,
DISCARDMAX=5
Specificarea cuvintelor cheie in fisierul de control
Daca linia de comanda depaseste dimensiunea maxima a liniei de
comanda din sistemul de operare, se pot introduce unele din
cuvintele cheie ale liniei de comanda in fisierul de control
folosind cuvintul cheie OPTIONS.

Acestea pot fi specificate intr-un fisier separat specificind


cuvintul cheie PARFILE. Aceasta metoda alternativa este
folosita cind cuvintele cheie se schimba rar. Cuvintele
specificate in aceasta maniera pot fi suprascrise din linia de
comanda.
Cuvintele cheie
BAD (fisierul bad)
Bad specifica numele fisierului bad creat de SQL*Loader pentru
a memora inregistrarile care genereaza erori la inserare sau
nu sunt formatate corespunzator. Daca nu este specificat in
numele fisierului, numele fisierului este folosit cu extensia
implicita BAD. Fisierul are acelasi format cu al fisierului de
date de intrare astfel ca poate fi incarcat cu acelasi fisier
de control dupa ce se fac actualizari si corectii. Un fisier
bad specificat in linia de comanda devine fisierul bad asociat
cu prima comanda INFILE din fisierul de control. Daca numele
fisierului bad a fost specificat si in fisierul de control,
linia de coamnda il suprascrie.
BINDSIZE(dimensiunea maxima)
BINDSIZE specifica dimensiunea maxima (in BYTES) a vectorului
de legatura. Dimensiunea data prin BINDSIZE, suprascrie
dimensiunea implicita(dependenta de sistemul de operare) si
orice alta dimensiune stabilita de ROWS.
CONTROL(fisierul de control)
CONTROL specifica numele fisierului de control care descrie
cum se incarca datele. Daca nu s-a specificat extensia,
implicit este CTL. Daca lipseste numele, SQL*Loader il
solicita.
Nota: Daca numele fisierului de control contine caractere
speciale, sistemul de operare va cere ca acestea sa fie
escape. Daca sistemul de operare foloseste backslash in cale,
se remarca urmatoarele:
Un backslash urmat de un non backslash va fi tratat normal.
Doua backslash consecutive vor fi tratate cu un backslash.
Trei backslash consecutive vor fi tratate ca doua backslash.
Plasarea caii in ghilimele va elimina necesitatea saririi
backslash-urilor multiple.
DATA(fisierul de date)
DATA specifica numele fisierului care contine date care
trebuie incarcate. Daca nu se specifica un nume de fisier,
este folosit implicit numele fisierului de control. Daca nu se
specifica o extensie, extensia implicita va fi DAT.
DIRECT(modul de incarcara)
Direct specifica metoda folosita la incarcare, conventionala
sau directa. TRUE specifica incarcarea directa. FALSE,
implicit, specifica incarcarea conventionala.
DISCARD(fisierul discard)
Discard specifica un fisier de respingere (optional) care va
fi creat de SQL*Loader pentru inregistrarile care, sau nu au
fost inserate in tabela, sau au fost respinse. Daca nu se
specifica altfel, numele va fi DSC. Fisierul are acelasi
format cu fisierul de date incit poate fi incarcat cu acelasi

fisier
de
control
dupa
ce
s-au
facut
corectii
sau
actualizarile corespunzatoare. Un nume de fisier de respingere
specificat in linia de comanda devine fisierul de respingere
asociat cu prima comanda INFILE din fisierul de control. Daca
fisierul de respingere este specificat si in fisierul de
control, valoarea din linia de comanda il suprascrie.
DISCARDMAX(respingeri pina la abandonare)
DISCARDMAX specifica numarul de inregistrari respinse pina
cind se termina incarcarea. Valoarea implicita este ca toate
respingerile sunt permise. Pentru a opri incarcarea la prima
inregistrare respinsa se specifica unu.
ERRORS(erori permise)
ERRORS specifica numarul maxim de erori de inserare admise.
Daca numarul de erori depaseste valoarea parametrului ERRORS,
SQL*Loader termina incarcarea. Implicit este 50. Pentru a nu
se permite erori se specifica ERRORS=0. Pentru a permite toate
erorile se specifica un numar mare.
Intr-o singura tabela incarcata SQL*Loader termina incarcarea
cind erorile depasesc limita. Toate datele inserate pina la
acest punct sunt realizate.
SQL*Loader mentine consistenta inregistrarilor intre toate
tabelele. Prin urmare, incarcarea in mai multe tabele nu se
termina imediat daca erorile depasesc limita. Cind SQL*Loader
intilneste numarul maxim de erori intr-o incarcare in mai
multe tabele, continua sa incarce rinduri pentru a asigura ca
toate rindurile valide incarcate anterior in tabele sunt
incarcate in toate tabelele si/sau rindurile refuzate sunt
eliminate din toate tabelele. In toate cazurile, SQL*Loader
scrie rindurile eronate in fisierul bad.
FILE(fisierul in care se incarca)
FILE specifica fisierul bazei de date in care se aloca extent.
Este folosit numai pentru incarcare in mod paralel. Prin
modificarea valorii parametrului FILE pentru diferite procese
SQL*Loader, datele pot fi incarcate intr-un sistem cu o minima
folosire a discului.
LOAD(inregistrari de incarcat)
LOAD specifica numarul maxim de inregistrari logice care se
incarca(dupa sarirea unui numar specificat de inregistrari).
Implicit sunt incarcate toate inregistrarile. Nu sunt erori
daca sunt mai putine inregistrari decit numarul maxim
specificat.
LOG(fisierul log)
LOG specifica fisierul log pe cae SQL*Loader il creeaza ca sa
memoreze informatiile despre procesul de incarcare. Daca nu sa specificat numele fisierului, este folosit implicit numele
fisierului de control cu extensia LOG.
PARFILE(fisier de parametri)
PARFILE specifica un fisier care contine cei mai folositi
parametri in linia de comanda. De exemplu linia de comanda
poate fi:
SQLLDR PARFILE=example.par
Si fisierul de parametrii poate avea urmatorul continut:
userid=scott/tiger

control=example.ctl
errors=9999
log=example.log
PARALLEL(incarcare paralel)
PARALLEL specifica daca incarcarea directa poate opera in
sesiuni multiple concurente pentru a incarca date in aceeasi
tabela.
ROWS(rinduri per realizare)
Numai pentru incarcare conventionala: ROWS specifica numarul
de rinduri in vectorul de legatura. Implicit este 64.
Numai pentru incarcarea directa: ROWS identifica numarul de
rinduri care se citesc din fisierul de date inainte de a salva
datele. Implicit datele sunt salvate o data la sfirsitul
incarcarii.
Deoarece incarcarea directa este optimizata din punct de
vedere al performantei, aceasta foloseste buffere care au
aceeasi dimensiune si format ca si blocurile I/O ale
sistemului. Numai buffer-ele pline sunt scrise in baza de date
astfel ca ROWS este aproximativ.
SILENT
Cind incepe SQL*Loader, apare pe ecran si este inregistrat in
fisierul log un mesaj de antet:
SQL*Loader:
Production on Wed Feb 24 15:07:23...
Copyright (c) Oracle Corporation...
Pe masura ce se executa SQL*Loader apar mesaje de raspuns pe
ecran, ca de exemplu:
Commit point reached - logical record count 20
SQL*Loader poate afisa mesaje de eroare cum ar fi:
Record 4: Rejected - Error on table EMP
ORA-00001: unique constraint <name> violated
Pentru a suprima aceste mesaje se specifica SILENT cu un
argument.
De exemplu, se poate suprima aparitia mesajului antet si de
raspuns care in mod normal apar pe ecran cu urmatorul argument
in linia de comanda:
DILENT=(HEADER, FEEDBACK)
Cuvintele cheie corespunzatoare:
HEADER - Suprima aparitia mesajelor de tip header care in mod
normal apar pe ecran. Mesajul header apare in fisierul log.
FEEDBACK - Suprima mesajul "commit point reached..." care in
mod normal apare pe ecran.
ERRORS - Suprima mesajele de eroare care apar in fisierul log
se intilnesc cind o inregistrare genereaza o eroare Oracle
care determina sa fie scrisa in fisierul bad. Apare numai
numarul erorilor respinse.
DISCARDS - Suprima masajul din fisierul log pentru fiecare
inregistrare scrisa in fisierul de respinse.
PARTITIONS - Aceasta optiune a lui Oracle8 pentru incarcarea
directa
a
unei
tabele
partitionate
suprima
scrierea
statisticilor per partitie in fisierul log.
ALL - Implementeaza toate cuvintele cheie.
SKIP(inregistrari de sarit)

SKIP specifica numarul de inregistrari logice de la inceputul


fisierului care nu vor fi incarcate. Implicit nu sunt sarite
inregistrari.
Acest parametru continua incarcarea care a fost intrerupta din
diferite motive. Este folosit pentru incarcare conventionala,
pentru incarcare directa intr-o singura tabela sau pentru
incarcare directa in mai multe tabele cind s-a incarcat
acelasi numar de inregistrari in fiecare tabela. Nu se
foloseste pentru incarcari directe multiple cind s-au incarcat
in tabele diferite numere de inregistrari.
USERID(nume-utilizator/parola)
USERID furnizeaza la Oracle numele si parola. Daca se omite se
solicita. Daca este folosit numai un slash(/) USERID foloseste
conectarea specifica sistemului. Poate fi folosita o legatura
Net8 pentru incarcare conventionala intr-o baza de date la
distanta.
Optiuni de intretinere a indecsilor
SKIP_UNUSABLE_INDEXES=(TRUE/FALSE)
Optiunea
SKIP_UNUSABLE_INDEXES
se
aplica
la
incarcarea
conventionala si la incarcarea directa.
SKIP_UNUSABLE_INDEXES=TRUE permite SQL*Loader sa incarce o
tabela cu indexul in starea Unusable(IU) inainte de inceperea
incarcarii. Indecsii care nu sunt in starea IU la momentul
incarcarii nu vor fi intretinuti, dar ramin in starea IU la
incarcarea completa.
Indecsii care sunt UNIQUE si marcati IU nu sunt disponibile
pentru sarirea intretinerii. Aceasta regula este fortata de
operatiile DML si fortata de incarcarea directa ca sa fie
consistenta cu DML.
Comportamentul
incarcarii
cu
SKIP_UNUSABLE_INDEXES=FALSE
difera putin intre incarcarea conventionala si incarcarea
directa.
In incarcarea conventionala, inregistrarile care sunt
inserate vor fi rejectate daca inserarea lor solicita
actualizarea unui index.
In incarcarea directa, incarcarea se termina dupa intilnirea
unei inregistrari care va solicita ca intretinerea unui
index sa fie facuta intr-un index care este in starea in.
SKIP_INDEX_MAINTENANCE={TRUE|FALSE}
SKIP_INDEX_MAINTENANCE={TRUE|FALSE}opreste
intretinerea
indecsilor pentru incarcarea directa dar nu se aplica la
incarcarea conventionala.
Optiunile SKIP_INDEX_MAINTENANCE:
Se aplica si la indecsii globali si la locali.
Poate fi folosita(cu optiunea PARALLEL) pentru a face
incarcarea paralela la un obiect care are index.
Poate fi folosita(cu cuvintul cheie PARTITION in clauza INTO
TABLE) pentru a face incararea unei singure partitii la o
tabela care are index global.

Scrie o lista(in fisierul log) a indecsilor si partitiilor


index care sunt setati la incarcare la starea index
Unusable.

SQL*Loader Fisierul log


Cind se incepe executia SQL*Loader, acesta creeaza un fisier
log. Fisierul log contine un sumar detaliat al incarcarii.
Cele mai multe intrari sunt inregistrari ale executiei cu
succs. Totusi, erorile pot genera intrari in fisierul log. De
exemplu, erorile gasite la analiza fisierului de control apar
in fisierul log.
Informatii din antet
Scrierea header contine urmatoarele intrari:
data rularii
numarul de versiune al soft-ului
De exemplu:
SQL*Loader: Version 8.0.2.0.0 - Produsction on Mon Nov 26...
Copyright (c) Oracle Corporation
Informatii globale
Sectiunea de informatii globale contine urmatoarele intrari:
numele fisierelor de intrare/iesire
iesirea argumentelor linia de comanda
caractere de continuare
Daca datele sunt in fisierul de control, fisierul de date este
aratat ca "*".
De exemplu:
Control file: LOAD.CTL
Data File:
LOAD.DAT
Bad file:
LOAD.BAD
Discard File: LOAD.DSC
(Allow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:
64 rows, maximum of 65536 bytes
Continuation:
1:1 = '*', in current physical record
Path used:
Conventional
Informatii despre tabela
In Sectiunea Informatii despre tabele furnizeaza informatii
despre fiecare tabela care se incarca:
numele tabelei
conditia de incarcare, daca exista. Daca exista, aceasta
inseamna ca toate inregistrarile se incarca, sau numai
acelea catre satisfac conditia din clauza WHERE
specificatiile INSERT, APPEND sau REPLACE
informatii despre coloane
daca sunt in fisierul de date, pozitia, lungimea, tipul si
delimitatorul

daca este specificat RECNUM, SEQUENCE sau CONSTANT


daca este specificat, DEFAULT sau NULLIF
Exemplu:
Table EMP, loaded from every logical record.
Insert option in effect for this table: REPLACE
Column Name
Position
----------------------------EMPNO
1:4
ENAME
6:15
JOB
17:25
MGR
27:30
SAL
32:39
COMN
41:48
DEPTNO
50:51

Len
-----4
10
9
4
8
8
2

Term Encl Datatype


---- ---- --------CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER
CHARACTER

Column EMPNO is NULL if EMPNO = BLANKS


Column MGR is NULL if MGR = BLANKS
Column SAL is NULL if SAL = BLANKS
Column COMM is NULL if COMM = BLANKS
Column DEPTNO is NULL if DEPTNO = BLANKS
Informatii despre fisierul de date
In sectiunea informatii despre fisierul de date apar numai
fisiere cu date eronate si are urmatoarele intrari:
erorile datelor determinate de SQL*Loader
inregistrarile respinse
Exemplu:
Record 2: Rejected Error on table EMP.
ORA-00001: unique constraint <name> violated
Record 8: Rejected Error on table EMP, column DEPTNO.
ORA-01722: invalid number
Record 3: Rejected Error on table PROJ, column PROJNO.
ORA-01722: invalid number
Informatii despre incarcarea tabelelor
Sectiunea informatii despre incarcarea tabelelor furnizeaza,
pentru fiecare tabela care se incarca, urmatoarele informatii:
numarul de rinduri incarcate
numarul de rinduri pentru incarcat dar refuzate in timpul
incarcarii
rindurile refuzate pentru ca nu indeplinesc testul clauzei
WHERE
numarul de rinduri ale caror cimpuri relevante au fost toate
null
Exemplu:
The following indexes on table EMP wew processed:
Index EMPIX was left in Direct Load State due to
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found
Table EMP:
7 Rows successfully loaded.
2 Rows not loaded due to data errors.|
0 Rows not loaded because all WHEN clauses werw failed.

0 Rows not loaded because all fields were null.


Statistica sumara
Sectiunea statistica sumara afiseaza urmatoarele:
cantitatea de spatiu folosita:
pentru vectorul de legatura (care a fost folosit bazat pe
ce s-a specificat prin BINDSIZE)
statistici
cumulative
de
incarcare;
pentru
toate
fisierele de date inregistrarile care au fost:
sarite
citite
refuzate
timpul de inceput si sfirsit al rularii
timpul total scurs
total timp CPU(include toate operatiile I/O dar nu include
timpul CPU background Oracle)
Exemplu:
Space allocated for bind array:
65336
bytes
(64
rows)
Space allocated for memory less bind array: 6470 bytes
Total
Total
Total
Total

logical
logical
logical
logical

records
records
records
records

skipped:
read:
rejected:
discarded:

0
7
0
0

Run began on Mon Nov 26 10:46:53 1990


Run ended on Mon Nov 26 10:47:17 1990
Elapsed time was:
00:00:15.62
CPU time was:
00:00:07.76
Statisticile Oracle8 in log
Statisticile Oracle8 sunt diferite pentru diferite moduri de
incarcare:
Pentru incarcare conventionala si directa a unei tabele
nepartitionate, raportul statisticilor este neschimbat fata
de Oracle7.
Pentru incarcarea directa a unei tabele partitionate, o
sectiune de statistica per partitie va fi inclusa in
fisierul log dupa sectiunea de statistica la nivel tabela.
Pentru incarcarea unei singure partitii, numele partitiei va
fi inclus in sectiunea de statistica la nivelul tabelei.
Statistica despre incarcarea unei singure partitii
Descrierea coloanelor tabelei include si numele partitiei.
Mesajele de eroare includ numele partitiei.
Lista statisticilor include numele partitiei.
Statistici pentru incarcarea tabelei
Incarcarea directa si conventionala raporteaza statistici
per partitie.
Incarcarea conventionala nu raporteaza statistici per
partitie.

Statisticile
pentru
tabelele
nemodificate fata de Oracle7.

nepartitionate

sunt

Optiune noua in linia de comanda


Optiunea din linia de comanda:
silent=partitions,
dezactiveaza
iesirea
sectiunii
de
statistici pentru partitii in fisierul log pentru incarcarea
directa a unei tabele partitionate.
In oracle8, optiunea silent=all include flag-ul partitions si
suprima statisticile per partitie.

Analiza
comparativa
conventionala

incarcare

directa

si

incarcare

Metode de incarcare a datelor


SQL*Loader furnizeaza doua metode de incarcare a datelor:
Incarcarea conventionala
Incarcarea directa
Incarcarea conventionala executa comenzile SQL INSERT pentru a
popula tabele in baza de date Oracle.
Incarcarea directa elimina multe din scrierile bazei de date
prin formatarea blocurilor de date si scrierea blocurilor de
date direct in fisierele bazei de date.
Incarcarea conventionala
Incarcarea conventionala foloseste (implicit) comenzi SQL
INSERT si un buffer de legatura pentru a incarca date intr-o
baza de date. Aceasta metoda este folosita de toate
utilitarele Oracle si aplicatii.
Cind SQL*Loader executa o incarcare conventionala intre
competitia egala cu alte procese pentru obtinerea resurselor
buffer-ului. Aceasta poate duce la o scadere semnificativa a
vitezei incarcarii.
Oracle verifica blocurile umplute partial si incearca sa le
incarce pe acestea la fiecare inserare.
Incarcarea conventionala a unei singure partitii
Prin definitie, incarcarea conventionala foloseste comenzi SQL
INSERT. In timpul incarcarii conventionale a unei partitii,
SQL*Loader foloseste o sintaxa extinsa a comenzii INSERT care
are urmatoarea forma:
INSERT INTO TABLE T partition (P) VALUES...
Nivelul SQL al kernel-ului ORACLE determina daca rindurile
care se insereaza se potrivesc cu partitia specificata. Daca
nu se potrivesc cu partitia specificata, rindurile sunt
refuzate si SQL*Loader inregistreaza in fisierul log mesajul
de eroare corespunzator.
Cind se foloseste incarcarea conventionala
Daca viteza de incarcare este foarte importanta, se poate
folosi metoda directa deoarece este mai rapida decit metoda
conventionala. Totusi, sunt anumite restrictii la incarcarea
directa care solicita folosirea incarcarii conventionale. Se
foloseste incarcarea conventionala in urmatoarele cazuri:

Cind se acceseaza o tabela indexata concurent cu incarcarea,


sau cind se fac inserari sau actualizari intr-o tabela
neindexata concurent cu incarcarea.
Pentru a folosi incarcarea directa (exceptind incarcarea
paralela) SQL*Loader trebuie sa aiba acces de scriere
exclusiv in tabela si acces de citire-scriere exclusiva la
orice index.
Cind se incarca date prin SQL*Net pe platforme heterogene.
Nu se pot incarca date folosind incarcarea directa prin Net8
daca cele doua sisteme nu fac parte din aceeasi familie si
daca nu folosesc acelasi set de caractere. Cu acestea
performanta incarcarii este afectata simtitor de actiunile
retelei.
Cind se incarca date intr-o tabela cluster incarcarea
directa nu suporta incarcarea unei tabele cluster.
Cind se incarca un numar relativ mic de rinduri intr-o
tabela mare indexata.
Cind se face incarcarea directa, indexul existent este
copiat cind este combinat cu o noua cheie a indexului. Daca
indexul existent este foarte mare si numarul de chei noi
este foarte mic, timpul pentru copierea indexului poate
compensa timpul salvat prin incarcarea directa.
Cind se incarca un numar de rinduri relativ mic intr-o
tabela cu constringeri referentiale si de verificari de
coloane.
Deoarece constringerile nu se aplica la rindurile incarcate
direct, acestea sunt dezactivate pe durata incarcarii.
Acestea se aplica la tabela intreaga cind tabela se incarca
complet.
Cind se aplica functii SQL la cimpuri de date.
Functiile SQL nu sunt disponobile cind se face incarcarea
directa.
Incarcarea directa
In loc sa umple un vector de legatura si a-l transmite pe
acesta la Oracle cu o comanda SQL INSERT, incarcarea directa
analizeaza datele pentru fiecare cimp de intrare cu coloana
corespunzatoare Oracle si creaza un vector de structura
coloanelor.
SQL*Loader foloseste vectorul de structura coloanelor pentru a
forma blocurile de date Oracle si a crea cheile index.
Blocurile de date non formatate sunt scrise direct in baza de
date (mai multe blocuri per cererea I/O folosind scrieri
asincrone daca platforma gazda suporta I/O asincrone).
Scrierile
bazei
conventionala

de

date

in

incarcarea

directa

si

SQL*Loader
Scrierile bazei de
date

SQL*Loader

Procese utilizator

Genereaza comenzi
SQL

Genereaza comenzi
SQL

Serverul Oracle
Procesarea comenzilor SQL
Gestiunea spatiului
Citeste extenturi noi
Ajusteaza high
watermark

Gaseste blocuri partiale


Umple blocuri partiale

Gestiunea bufferului cache


-gestiunea sirurilor
-rezolvarea conflictelor

Buffer cache

Citeste blocurile bazei de date

Scrie blocurile bazei de date

Baza de date

Incarcarea directa a unei tabele partitionate


Cind
se
incarca
o
tabela
partitionata,
SQL*Loader
partitioneaza
rindurile
si
intretine
indecsii
(care
deasemenea, sunt partitionati). De notat, ca o incarcare
directa a unei tabele partitionate poate elibera intensiv
resurse pentru tabele cu multe partitii.
Incarcarea directa a unei partitii singure
Cind se incarca o singura partitie a unei tabele partitionate,
SQL*Loader partitioneaza rindurile si refuza rindurile care nu
se potrivesc la partitia specificata in fisierul de control.
Indecsii
locali
partitionati
care
corespund
datelor
partitionate
incarcate
sunt
intretinuti
de
SQL*Loader.
Indecsii globali nu sunt intretinuti la incarcarea directa a
unei singure partitii.
Cind se incarca o partitie a unei tabele partitionate,
operatiile DML si incarcari directe ale altor partitii din
tabela sunt permise.

Cu toate ca incarcarea directa minimizeaza procesarea bazei de


date, anumite apeluri la severul Oracle sunt cerute la
inceputul si sfirsitul incarcarii pentru a initializa si
finaliza incarcarea. Deasemenea, unele blocari DML sunt cerute
pe timpul initializarii incarcarii si eliberate la incarcarea
completa. De notat, ca pe timpul incarcarii se intilnesc
urmatoarele operatii: cheile index sunt constituite si puse
intr-o sortare, rutinele de gestiune a spatiului sunt folosite
sa citeasca extenturi noi cind este necesar sa se ajusteze
high-water mark pentru un punct de salvare a datelor.
Avantaje ale incarcarii directe
Incarcarea
directa
este
mai
rapida
decit
incarcarea
conventionala din urmatoarele motive:
Nu sunt folosite blocuri partiale astfel ca nu sunt necesare
citiri pentru a le gasi si sunt efectuate putine scrieri.
SQL*Loader nu trebuie sa execute nici o comanda SQL INSERT
si prin aceasta procesarea incarcarii in baza de date este
redusa.
SQL*Loader nu foloseste un vector de legatura blocurile
formatate ale bazei de date sunt scrise direct.
Incarcarea directa apeleaza la Oracle pentru blocarea
tabelelor si indecsilor la inceputul incarcariii si le
elibereaza
cind
este
gata
incarcarea.
Incarcarea
conventionala apeleaza Oracle o data pentru fiecare rind
pentru procesarea comenzii SQL INSERT.
Incarcarea directa foloseste I/O asincrone multi-bloc pentru
a scrie fisierele bazei de date.
Pe timpul incarcarii directe procesele efectueaza proprile
scrieri I/O in loc de a folosi buffer-ele cache Oracle
minimizind conflictul cu alti utilizatori Oracle.
Optiunea de sortare a indecsilor disponibila pe timpul
incarcarii directe permite presortarea datelor folosind
rutine de mare performanta care sunt native in sistem.
Cind tabela care se incarca este goala, optiunea de
presortare elimina sortarea si faza de constructie a
indexului.
Protectia impotriva esuarii instantei nu solicita intrari in
fisierele redo log. Deci, nu se solicita timp pentru
scrierea logului cind:
- Oracle opereaza in mod NOARCHIVELOG
- optiunea UNRECOVERABLE a incarcarii este setata pe Y
- un obiect care se incarca are setat atributul NOLOG
Cind se foloseste incarcarea directa
Daca nu se aplica nici una din restrictiile de mai sus, se
poate folosi incarcarea directa cind:
este o cantitate mare de data care trebuie sa se incarce
repede. Incarcarea directa poate incarca si indexa o
cantitate mare de date repede. Poate incarca deasemenea date
intr-o tabela goala sau incarcata.
se doreste incarcarea datelor in mod PARALLEL pentru maximum
de performanta.

se doreste incarcarea datelor intr-un set de caractere care


nu este suportat de sesiunea curenta sau cind conversia
conventionala a setului de caractere al bazei de date
genereaza erori.
Restrictii la folosirea incarcarii directe
In plus fata de conditiile descrise in paragraful--- pentru
folosirea metodei directe trebuie satisfacute urmatoarele
conditii:
tabelele nu sunt clusterizate
tabelele care se incarca nu au tranzactii active dependente
Pentru verificarea acestor conditii se foloseste comanda
MONITOR TABLE a utilitarului ENTREPRISE MANAGER pentru a gasi
ID-ul tabelelor care se incarca. Se foloseste comanda MONITOR
LOCK pentru a vedea daca sunt blocari pe tabela.
Nu sunt siruri SQL in fisierul de control.
Restrictii la incarcarea directa a unei singure partitii
In plus fata de restrictiile prezentate, incarcarea unei
singure partitii are urmatoarele restrictii:
Tabela la care partitia este membru nu poate avea un index
global definit pe ea.
Nu sunt active constringeri referentiale si de integritate
in tabela la care partitia este membru.
Nu sunt permisi tiggeri activi.
Restrictii de integritate
In timpul incarcarii directe toate restrictiile de integritate
sunt impuse chiar daca nu sunt necesare la acel moment.
Restrictia NOT NULL este impusa in timpul incarcarii. Toate
rindurile care nu o respecta sunt refuzate.
Restrictiile UNIQUE sunt impuse in timpul si dupa efectuarea
incarcarii. O inregistrare care incalca restrictia UNIQUE nu
este refuzata(inregistrarea nu este disponibila in memorie
cind este detectata incalcarea restrictiei).
Restrictiile de integritate care depind de alte rinduri din
tabela, cum ar fi restrictiile referentiale, sunt dezactivate
inainte de incarcarea directa si trebuie reactivate dupa
incarcare. Daca este specificat REENABLE, SQL*Loader poate
reactiva automat restrictia la sfirsitul incarcarii. Cind este
reactivata restrictia este verificata intreaga tabela. Oricare
rind care incalca aceasta restrictie este raportat in fisierul
log.
Cimpuri implicite in incarcarea directa
Specificarea coloanei DEFAULT definita in baza de date nu este
disponibila cind se incarca direct. Cimpurile a caror valoare
se doreste a fi implicita trebuie specificate cu clauza
DEFAULTIF. Daca nu s-a specificat clauza DEFAULTIF si cimpul
este NULL, valoarea NULL este inserata in baza de date.
Incarcarea in sinonime
Se pot incarca date intr-un sinonim pe timpul incarcarii
directe, dar sinonimul trebuie sa puncteze direct o tabela.
Aceasta nu poate fi un sinonum al unui view sau sinonim pentru
alt sinonim.
Cerinte de versiune exacta

Se poate efectua incarcare directa numai daca SQL*Loader are


aceeasi versiune cu baza de date. De exemplu, nu se poate face
incarcare directa cu SQL*Loader versiunea 7.1.2 intr-o baza de
date versiune 7.1.3.
Folosirea incarcarii directe
Pregatirea pentru incarcarea directa
Pentru a pregati baza de date pentru incarcarea directa,
trebuie rulat scriptul CATLDR.SQL pentru a crea view-urile
necesare. Trebuie rulat scriptul o singura data pentru fiecare
baza de date. Scriptul poate fi rulat la instalarea bazei de
date daca se stie ca se va efectua incarcare directa.
Specificarea incarcarii directe
Pentru a starta incarcarea directa, parametrul DIRECT trebuie
setat pe TRUE in linia de comanda sau in fisierul de
parametrii
DIRECT=TRUE
Crearea indecsilor
Pe timpul incarcarii directe, performanta este crescuta
folosind memorarea temporara. Dupa ce este formatat fiecare
bloc, cheile index noi sunt puse intr-un segment temporar de
sortare. Indexul vechi si cheile noi sunt intercalate la
sfirsitul incarcarii pentru a crea un index nou. Indexul
vechi,segmentul temporar de sortare si segmentul noului index
solicita memorarea pina cind intercalarea este completa.
Indexul vechi si toate segmentele temporare sunt sterse.
De notat, ca in timpul incarcarii conventionale, in fiecare
moment cind este inserat un rind, este actualizat indexul.
Aceasta metoda nu necesita spatiu temporar de memorare, dar
creste timpul de procesare.
Optiunea SINGLEROW
In sistemele cu memorie putina, performanta poate fi crescuta
folosind optiunea SINGLEROW.
Nota: Daca, in timpul incarcarii directe, s-a specificat ca
datele sunt presortate si indexul existent este gol, nu este
necesar un segment temporar si nu se efectueaza combinarea
cheile sunt scrise direct in index.
Cind sunt creati indecsi multipli, exista segmente temporare
simultan corespunzind la fiecare index, in plus fata de
indexul vechi. Pe masura ce cheile noi sunt create, sunt
combinate cu indexul vechi un index la un moment. Pe masura ce
s-a creat fiecare index nou, indexul vechi si segmentul
temporar corespunzator sunt sterse.
Cerinte de memorare a indecsilor
Formula de calcul a cantitatii de spatiu folosita pentru
memorarea indecsilor este:
1.3 * cheia_de_memorare
unde:
cheia_de_memorare= (numarul_de_rinduri)*
(10 + suma_dimensiunii_coloanelor+numarul_de_coloane)
Coloanele incluse in aceasta formula sunt coloanele din index.
Aceasta inseamna un byte lungime per coloana, 10 bytes per
rind folositi de ROWID si suplimentar.

Constanta 1.3 reflecta media de spatiu suplimentar necesar


pentru sortare. Aceasta valoare este corespunzatoare datelor
neordonate. Daca datele ajung exact in ordinea inversa decit
cea dorita, se solicita spatiu dublu pentru memorare si
sortare si valoarea constantei va fi 2.0.
Daca datele sunt sortate, este solicitat spatiu numai pentru
memorarea intrarilor indexului si valoarea constantei se
reduce la 1.0.
Indecsi in starea UNUSABLE
Orice comanda SQL care incearca sa foloseasca un index care
este in starea UNUSABLE returneaza o eroare. Urmatoarele
conditii determina ca optiunea de incarcare directa sa lase un
index sau o partitie a unui index partitionat in starea
UNUSABLE:
SQL*Loader ruleaza in afara spatiului indexului si nu poate
actualiza indexul.
Datele nu sunt in ordinea specificata prin clauza SORTED
INDEXES.
Este o eroare de instanta sau procesele Oracle esueaza la
constructia indexului.
Sunt chei duble intr-un index unic.
Sunt folosite puncte de salvare a datelor si incarcarea
esueaza sau se termina la interventia utilizatorului dupa
ce s-a intilnit un punct de intrerupere.
Pentru a determina daca un index se afla in starea UNUSABLE se
executa interogarea:
SELECT INDEX_NAME, STATUS
FROM USER_INDEXES
WHERE TABLE_NAME = tablename;
Pentru a determina daca un index al unei partitii se afla in
starea UNUSABLE:
SELECT INDEX_NAME,
PARTITION_NAME,
STATUS FROM USER_IND_PARTITIONS
WHERE STATUS != VALID;
Daca utilizatorul nu este proprietarul tabelei se foloseste
ALL_INDEXES sau DBA_INDEXES in loc de USER_INDEXES. Pentru
indecsii
partitiilor
se
foloseste
ALL_IND_PARTITIONS
si
DBA_IND_PARTITIONS in loc de USER_IND_PARTITIONS.
Salvarea datelor
Se pot folosi salvarile datelor pentru a le proteja pierderile
fata de esuarea instantei. Toate datele incarcate pina la
ultima salvare de date sunt protejate fata de esuarea
instantei.
Pentru
a
continua
incarcarea
dupa
esuarea
instantei, se foloseste optiunea SKIP pentru a sari rindurile
procesate. Daca sunt indecsi in tabela, se sterg inainte de a
continua incarcarea si se recreaza dupa incarcare.
Nota: Indecsii nu sunt protejati prin salvarile de date
eoarece SQL*Loader nu creeaza indecsii pina dupa incarcarea
completa a datelor.
Folosirea parametrului ROWS

Parametrul ROWS determina cind sunt salvate datele pe timpul


incarcarii directe. Valoarea specificata pentru ROWS este
numarul de rinduri care se doreste a fi citite de SQL*Loader
din fisierul de intrare inainte de a le salva in baza de date.
Numarul de rinduri care se specifica pentru o salvare de date
este un numar aproximativ. Incarcarea directa actioneaza
intotdeauna asupra unui buffer de date plin care este similar
blocurilor de date a bazei de date Oracle. Deci, numarul de
rinduri salvate este o rotunjire la un multiplu de rinduri din
blocul bazei de date.
SQL*Loader intotdeauna citeste numarul de rinduri necesare sa
umple in bloc date. Inregistrarile refuzate sunt eliminate si
inregistrarile ramase sunt inserate in baza de date. Deci
numarul de rinduri inserate inainte de salvare care s-a
specificat, este rotunjit la numarul de rinduri dintr-un bloc
de date, minus numarul de rinduri refuzate.
Salvarea datelor este o operatiune costisitoare. Valoarea ROWS
trebuie setata astfel incit salvarea sa fie o data la 15
minute sau mai mult.
Scopul este sa furnizeze o margine superioara a cantitatii de
lucru care se pierde cind esueaza instanta in timpul
incarcarii directe. Setarea valorii ROWS la o valoare mica are
un efect advers asupra performantei.
Salvarile de date fata de commit
Intr-o incarcare conventionala, ROWS este numarul de rinduri
citite inainte de commit. O salvare de date intr-o incarcare
directa este similara cu commit in incarcarea conventionala
dar nu identica.
Similaritatile sunt:
Salvarea datelor face rindurile vizibile altor utilizatori
Rindurile nu pot fi anulate (Rollback) dupa se s-au salvat
datele
Diferenta majora este ca indecsii sunt in setarea UNSABLE pina
la incarcarea completa.
Refacerea
SQL*Loader furnizeaza un suport intreg pentru refacere cind se
foloseste incarcarea directa. Sunt doua tipuri principale de
refacere:
Refacerea mediului refacere din pierderea fisierelor de
date. Trebuie sa se opereze in mod ARCHIVELOG pentru refacere
dupa pierderea fisierului bazei de date.
Refacerea instantei refacere dintr-o eroare sistem in care
datele din memorie au fost schimbate dar pierdute in urma
erorii inainte de a fi scrise pe disc. Oracle poate efectua
intotdeauna refacerea chiar daca fisierele redo log nu au fost
arhivate.
Refacerea instantei
Deoarece SQL*Loader scrie direct in fisierele bazei de date,
toate rindurile inserate pina la ultima salvare sunt prezente
in baza de date cind este restartata instanta. Schimbarile nu
sunt necesare sa fie inregistrate in fisiere redo log pentru a
face posibila refacerea instantei.

Daca se intimpla o esuare a instantei, indecsii care trebuie


creati sunt in starea UNUSABLE. Indecsii care sunt in starea
UNUSABLE trebuie recreati inainte de a folosi tabela sau
partitia.
Refacerea mediului
Daca sunt disponibile fisierele redo log arhivate(daca s-a
operat in mod ARCHIVELOG) SQL*Loader incarca fisierele log
cind se foloseste incarcarea directa facind posibila refacerea
mediului. Daca arhivarea redo log nu este disponibila(s-a
operat in mod NOARCHIVELOG) refacerea mediului nu este
posibila.
Pentru refacerea fisierelor bazei de date care au fost
pierdute cind s-au incarcat, se foloseste aceeasi metoda care
se foloseste la refacerea datelor incarcate cu metoda
conventionala:
1. Se restaureaza cea mai recenta salvare a fisierelor bazei de
date afectate.
2. Se reface tablespace folosind comanda RECOVER.
Incarcarea cimpurilor de date LONG
Datele care sunt mai mari decit maximul dimensiunii bufferului pot fi incarcate direct sau folosind optiunea PIECED sau
specificind un numar READBUFFERS.
Incarcarea datelor cu optiunea PIECED
Datele pot fi incarcate pe sectiuni cu optiunea PIECED daca
sunt ultima coloana a inregistrarii logice.
Declarind o coloana ca PIECED se informeaza incarcarea directa
si cimpul poate fi procesat pe bucati, un buffer o data.
Cind se declara o coloana PIECED se aplica urmatoarele
restrictii:
Optiunea este valida numai la incarcarea directa.
Numai un cimo pe tabela poate fi PIECED.
Cimpul PIECED trebuie sa fie ultimul cimp al inregistrarii
logice.
Cimpul PIECED nu poate fi folosit in clauzele WHEN, NUL sau
DEFAULTIF.
Zona cimpurilor PIECED in inregistrarea logica nu se
suprapune cu alte cimpuri.
Cimpurile PIECED care corespund unei coloane din baza de
date nu pot fi parte a unui index.
Nu este posibil incarcarea unei inregistrari refuzate
dintr-un fisier bad daca acesta contine cimpuri PIECED.
De exemplu, un cimp PIECED poate acoperi trei inregistrari.
SQL*Loader incarca bucati din prima inregistrare si apoi
reutilizeaza buffer-ul pentru al doilea buffer. Dupa ce
incarca a doua bucata, buffer-ul este refolosit pentru a treia
inregistrare. Daca aici se descopera o eroare, numai a treia
inregistrare este plasata in fisierul bad, deoarece primele
doua inregistrari nu mai exista in buffer. Ca rezultat,
inregistrarea din fisierul bad nu mai este valida.
Folosirea cuvintului cheie READBUFFERS
Pentru datele care nu sunt impartite in sectiuni separate, sau
nu sunt in ultima coloana, se poate specifica READBUFFERS.

Cu READBUFFERS, este alocata o zona de transfer care este atit


de mare incit sa retina o inregistrare logica la un moment de
timp.
READBUFFERS
specifica
numarul
de
buffere
folosite
la
incarcarea directa. (un LONG poate acoperi mai multe buffere).
Valoarea implicita este patru buffere. Daca numarul de buffere
de citire este prea mic, rezulta urmatoarea eroare:
ORA-02374...No more slots for read buffer queue
Nota: Nu se specifica o valoarea pentru READBUFFERS decit daca
devine necesara asa cum se indica in ORA-2374. Valoarea
READBUFFERS care este mai mare decit cea necesara nu creste
performanta. Valoarea mare care nu este necesara creste
incarcarea sistemului.
Maximizarea performantelor incarcarii directe
In timpul incarcarii directe se poate controla timpul si
utilizarea spatiului temporar de memorare.
Pentru minimizarea timpului:
Se prealoca spatiu de memorare.
Se presorteaza datele.
Nu se efectueaza salvari frecvente.
Se dezactiveaza fisierele redo log.
Pentru minimizarea spatiului:
Cind se sorteaza datele inainte de a fi incarcate, se
sorteaza datele in indecsi care necesita mai putin spatiu
de memorare.
Se amina intretinerea indecsilor pina dupa incarcarea
tabelelor.
Prealocarea spatiului de memorare pentru o incarcare rapida
SQL*Loader adauga automat extenturi la tabela, daca este
necesar, dar procesul este consumator de timp. Pentru
incarcare rapida intr-o tabela noua, se aloca extenturile
necesare cind se creeaza tabela.
Se foloseste clauza INITIAL sau MINEXTENTS in comanda SQL
CREATE TABLE pentru a aloca spatiul cerut.
Alta propunere este de a stabili dimensiunea extentului in asa
fel ca alocarile sa nu fie frecvente.
Presortarea datelor
Se
poate
creste
performanta
incarcarii
directe
prin
presortarea
datelor
din
coloanele
index.
Presortarea
minimizeaza
cerintele
de
memorare
temporara
pe
timpul
incarcarii.
Presortarea
benefeciaza
si
de
avantajele
performantelor inalte ale rutinelor de sortare care sunt
optimizate pentru sistemul de operare sau pentru aplicatii.
Daca datele sunt presortate si indexul existent nu este gol,
presortarea minimizeaza cantitatea de spatiu a segmentului
temporar necesara pentru cheile noi. Rutina de sortare adauga
fiecare cheie noua la lista cheilor. In loc sa solicite spatiu
suplimentar pentru sortare, este necesar numai spatiu pentru
chei. Pentru a calcula cantitatea de spatiu necesara se
foloseste un factor de sortare de 1.0 in loc de 1.3.
Daca este specificata presortarea si indexul existent este
gol, este obtinut maximum de performanta. Rutinele de sortare

sunt evitate complet, cu faza de combinare a creerii


indexului. Cheile noi sunt inserate simplu in index. In loc de
a avea simultan un segment temporar si un index nou cu un
indesx vechi gol, exista numai indexul nou. Astfel, nu este
cerut spatiu suplimentar de memnorare si este salvat la timp.
Comanda SORTED INDEXES
Comanda SORTED INDEXES identifica indecsii in care datele sunt
presortate. Comanda este disponibila numai pentru incarcarea
directa.
In general, se specifica numai un index in comanda SORTED
INDEXES deoarece datele care sunt sortate pentru un index nu
sunt in mod curent in ordinea corecta pentru un alt index.
Cind datele sunt in aceeasi ordine pentru mai multi indecsi,
toti indecsii pot fi specificati o data.
Toti indecsii din comanda SORTED INDEXES trebuie creati
inainte de a incepe incarcarea directa.
Datele nesortate
Daca se specifica un index in comanda SORTED INDEXES si datele
nu sunt sortate pentru acest index, indexul este adus in
starea UNUSABLE la sfirsitul incarcarii. Datele sunt prezente,
dar orice incarcare de a folosi indexul genereaza o eroare.
Orice index care este in starea UNUSABLE trebuie reconstruit
dupa incarcare.
Coloane index multiple
Daca se specifica mai multe coloane index in comanda SORTED
INDEXES, datele trebuie sortate astfel incit sa fie ordonate
prima in prima coloana a indexului, a doua in a doua coloana a
indexului, s.a.m.d.
De exemplu, daca prima coloana a indexului este orasul, a doua
este numele, datele trebuie ordonate dupa nume in fiecare
oras:
Arad
Aurel
Arad
Dorel
Arad
Eugen
Cluj
Mihai
Cluj
Nicolae
Cluj
Ovidiu
Timisoara
Dorin
Timisoara
Eugen
Timisoara
Vasile
Alegerea celei mai bune ordini de sortare
Pentru obtinerea unei performante marite a incarcarii directe,
trebuie presortate datele pe baza indexului care cere cel mai
putin spatiu in segmentul temporar. De exemplu, daca cheia
primara este o coloana numerica si a doua cheie consta din
trei coloane text, se poate minimiza timpul de sortare si
cerintele de memorare prin presortarea celei de-a doua chei.
Pentru a determina indexul care solicita cel mai putin spatiu
de memorare, se foloseste urmatoarea procedura:
1. Pentru
fiecare
index
se
adauga
dimensiunea
tuturor
coloanelor din index.
2. Pentru o singura tabela, se alege indexul cu cea mai mare
dimensiune.

3. Pentru incarcarea in mai multe tabele se identifica indexul


cu dimensiunea cea mai mare pentru fiecare tabela. Daca in
fiecare tabela se incarca acelasi numar de rinduri, se alege
din nou indexul cu cea mai mare dimensiune. In mod obisnuit,
in fiecare tabela sunt incarcate acelasi numar de rinduri.
4. Dace se incarca numar de rinduri diferite in tabele indexate
intr-o
incarcare
multipla
de
tabela,
se
multiplica
dimensiunea fiecarui index identificat in pasul 3 cu numarul
de rinduri care se incarca in index. Se multiplica numarul
de rinduri de incarcat in fiecare index cu marimea indexului
si se alege indexul cu cel mai mare rezultat.
Salvari de date cu frecventa mica
Salvarile frecvente de date care rezulta dintr-o valoare mica
a ROWS are efect advers fata de performantele salvarii
directe. Deoarece incarcarea directa poate fi de mai multe ori
mai rapida decit incarcarea conventionala, valoarea ROWS este
considerabil mai mare pentru incarcarea directa decit este
pentru incarcarea conventionala.
Pe timpul salvarii, incarcarea este oprita pina cind toate
buffer-ele SQL*Loader sunt scrise. Se poate selecta o valoare
mare pentru ROWS cae este consistenta cu siguranta. Este o
solutie sa se determine media de timp de incarcare prin
incarcarea citorva rinduri. Se poate folosi aceasta valoare
pentru a selecta o valoare buna pentru ROWS.
De exemplu, daca se incarca 20.000 de rinduri pe minut si se
doreste lucrul fara intrerupere timp de 10 minute, se seteaza
ROWS la 200.000 (20.000 rinduri/minut * 10 minute).
Minimizarea folosirii redo log
O cale de a modifica viteza incarcarii este minimizarea
folosirii redo log. Sunt trei moduri prin care se face
aceasta: dezactivarea arhivarii, specificarea faptului ca
incarcarea este UNRECOVERABLE sau se seteaza atributul
obiectelor care se incarca la NOLOG.
Dezactivarea arhivarii
Daca refacerea mediului este dezactivata, incarcarea directa
nu genereaza imagine redo.
Specificarea UNRECOVERABLE
Specificarea UNRECOVERABLE salveaza timp si spatiu in fisierul
redo log. O incarcare directa UNRECOVERABLE nu inregistreaza
date in fisierul redo log, in loc, genereaza redo invalide.
UNRECOVERABLE se aplica la toate obiectele incarcate in timpul
sesiunii de incarcare (ambele segmente de date si index).
Daca refacerea mediului este dezactivata pentru tabelele
incarcate,
modificarile
bazei
de
date
facute
de
alti
utilizatori continua sa fie inregistrate in log.
Nota: Deoarece datele nu sunt inregistrate in fisiere log, nu
se poate face backup a datelor dupa incarcare.
Daca refacerea mediului devine necesara pentru datele care au
fost incarcate cu faza UNRECOVERABLE, blocurile de date care
au fost incarate sunt marcate logic corupte.
Pentru refacerea datelor se sterg si se recreaza datele. Ideea
este de a face un backup imediat dupa incarcare pentru a
prezerva date care nu se pot reface.

Implicit, incarcarea directa este RECOVERABLE.


Atributul NOLOG
Daca segmentul de date sau index are setat atributul NOLOG,
imaginea inregistrarilor redo este dezactivata pentru acest
segment. Utilizarea atributului NOLOG furnizeaza un grad de
finete a controlului asupra obiectelor care nu sunt urmarite
in log.
Evitarea intretinerii indecsilor
Pentru
incarcarea
directa
si
incarcarea
conventionala
SQL*Loader intretine toti indecsii existenti pentru o tabela.
Intretinerea indecsilor poate fi evitata prin una din
urmatoarele metode:
Stergerea indexului inainte de inceperea incarcarii
Se marcheaza indecsii sau partitiile index ca INDEX
UNUSABLE inainte de inceperea incarcarii si se foloseste
optiunea SKIP_UNUSABLE_INDEXES.
Se foloseste optiunea SKIP_INDEX_MAINTENANCE (la incarcarea
directa se foloseste cu atentie).
Evitarea intretinerii indecsilor salveaza spatiu de memorare
temporar cind se foloseste incarcarea directa. Evitarea
intretinerii indecsilor minimizeaza cantitatea de spatiu
solicitat la incarcare pentru urmatoarele motive:
Se poate crea indexul la un alt moment, reducind cantitatea
de spatiu in segmentul temporar de sortare care altfel ar
fi necesara pentru fiecare index.
Cind se creeaza indexul, exista numai un segment in loc de
trei segmente temporare care exista cind cheile noi sunt
intercalate cu indexul vechi si se creeaza indexul nou.
Evitarea intretinerii indecsilor este cit se poate de
rezolvabila cind numarul de rinduri care se incarca este mai
mare comparat cu dimensiunea tabelei. Dar daca sunt incarcate
relativ putine rinduri intr-o tabela mare, atunci timpul
necesar pentru resortarea indecsilor poate fi excesiv. In
acest caz, este facuta incarcarea conventionala de obicei sau
se foloseste optiunea SINGLEROW.
Incarcarea directa, restrictiile de integritate si trigger-ele
Cu incarcarea conventionala, vectorii de rinduri sunt inserati
cu comanda standard SQL INSERT restrictiile de integritate
si trigger-ele sunt aplicate automat. Cind se incarca cu
incarcarea directa, unele restrictii de integritate si
triggere sunt dezactivate.
Restringerile de integritate
Pe timpul incarcarii directe unele constringeri de integritate
sunt dezactivate automat, altele nu.
Constringerile active
Constringerile care ramin active sunt:
not null
unique
cheile primare (coloane unice si not null)
Constringerile Not null sunt verificate la momentul creerii
vectorului pentru coloana.

Oricare
rind
care
incarca
restrictia
este
refuzat.
Constringerea Unique este verificata cind este refacut indexul
dupa incarcarea completa. Daca s-a gasit o incalcae a
restrictiei indexul este adus in starea INDEX UNUSABLE.
Constringerile dezactivate
constringerile de verificare
constringere de referinta (chei straine)
Reactivarea restrictiilor
Cind este completa incarcarea, consringerile de integritate
vor fi reactivate automat daca este specificata clauza
REENABLE.
Sintaxa este urmatoarea:
Cuvintul cheie optional DISABLED_CONSTRAINTS este furnizat
pentru o citire mai facila.
Daca este inclusa clauza EXCEPTIONS, tabela trebuie sa existe
si trebuie sa se poata insera in ea. Aceasta tabela contine
ROWID a tuturor rindurilor care incalca constringerea de
integritate.
Contine
deasemenea
numele
constringerii
de
integritate.
Daca nu se foloseste clauza REENABLE constringerea poate fi
reactivata manual. Toate rindurile din tabela sunt verificate.
Daca Oracle gaseste erori in datele noi genereaza mesaj de
eroare. Numele constringerii incalcate si ROWID-ul datei
eronate sunt scrise in tabela exceptie, daca este specificata
vreuna.
Fisierul log SQL*Loader descrie constringerea care a fost
incalcata, unele care au fost reactivate si ce erori,
impiedicarea reactivarii oricarei constringeri contine si
numele tabelei exceptie care a fost specificata pentru fiecare
tabela incarcata.
Atentie: Atit timp cit in tabela ramin date eronate,
constringerea de integritate nu poate fi reactivata.
Sugestie:
Deoarece
restrictiile
de
integritate
trebuie
reverificate pentru tabela intreaga, performanta poate fi
crescuta daca se foloseste incarcarea conventionala, cind se
incarca un numar mic de rinduri intr-o tabela mare.
Triggere de inserare
Trigger-ele de inserare sunt dezactivate cind incepe o
incarcare directa. Dupa ce s-au incarcat rindurile si recreat
indecsii, toate trigger-ele care au fost dezactivate sunt
automat reactivate. Fisierul log inregistreaza toate triggerele care au fost dezactivate pentru incarcare. Aceasta permite
urmarirea erorilor la reactivare.
Spre deosebire de constringerile de integritate, trigger-ele
de inserare nu se reaplica la tabela intreaga cind sunt
reactivate. Ca rezultat, trigger-ele de inserare nu actioneaza
pentru orice rind incarcat in incarcarea directa. Cind se
aplica incarcarea directa, aplicatia trebuie sa se asigure ca
orice comportament asociat cu trigger-ele de inserare este
anulat pentru rindurile noi.
Inlocuirea triggere-lor de inserare cu constringere de
integritate

Aplicatiile folosesc in mod obisnuit triggere pentru a


implementa constringeri de integritate. Cele mai multe
aplicatii ale trigere-lor de inserare sunt simple, asa ca pot
fi inlocuite cu restrictii de integritate.
Cind nu pot fi folosite restrictiile automate
Uneori un trigger nu poate fi inlocuit cu o constringere de
integritate. De exemplu, daca este implementata o restrictie
de verificare cu o tabela care se uita intr-un trigger de
inserare, atunci constringerea de integritate automata nu se
poate folosi deoarece constringerile automate de integritate
pot referi numai constante si coloane din rindul curent.
Sunt doua metode de a duplica efectele acestor triggere.
Pregatirea
Pentru ambele metode care se folosesc, tabela trebuie
pregatita. Pentru pregatirea tabelei:
1. Inainte de incarcare se adauga o coloana caracter la tabela
care marcheaza rindurile ca vechi sau noi.
2. Valorile null din aceste coloane semnifica date vechi
deoarece valorile null nu ocupa spatiu.
3. Cind se incarca, se marcheaza toate rindurile incarcate ca
date noi cu clauza SQL*Loader CONSTANT. Dupa aceasta
procedura toate rindurile noi incarcate sunt identificate,
facind posibila operarea datelor noi fara a afecta datele
vechi.
Folosirea unui trigger de actualizare
In general se poate folosi un trigger de actualizare pentru a
duplica efectul unui trigger de inserare. Se poate folosi si
de cite ori trigger-ul de inserare nu intilneste o exceptie.
1. Se creeaza sau e actualizeaza un trigger care duplica
efectul trigger-ului de inserare.
Se copiaza trigger-ul. Se schimba nou nume_coloana cu
vechi nume_coloana.
2. Se inlocuieste trigger-ul de actualizare curent daca exista,
cu unul nou.
3. Se actualizeaza tabela, schimbind starea data noua la null,
prin aceasta activind trigeer-ul de actualizare.
4. Se restaureaza trigger-ul initial de actualizare, daca a
existat.
Nota: depinzind de comportamentul triggere-lor, este necesar
acces exclusiv de actualizare a tabelei astfel ca alti
utilizatori sa nu poata aplica triggere necorespunzatoare la
rindurile care se modifica.
Duplicarea efectelor conditiilor de exceptie
Trigger-ele de inserare pot intilni o exceptie si atunci este
necesar lucru pentru a duplica efectele. Atingerea unei
exceptii poate implica rindurile sa fie inserate intr-o
tabela. Pentru a duplica acest efect al unui trigger de
actualizare, este necesara marcarea rindurilor incarcate
pentru stergere.
Coloana data noua nu poate fi folosita ca un indicator pentru
stergere deoarece un trigger de actualizare nu poate modifica
coloane care determina sa se declanseze, astfel ca trebuie
adaugate la tabela alte coloane. Aceste coloane marcheaza

rindurile pentru stergere. O valoare null este modul prin care


rindul este valid. Ori de cite ori un trigger de inserare
intilneste o exceptie, trigger-ul de actualizare poate marca
rindul ca invalid setind starea in coloana suplimentara.
Sumar: Cind un trigger de inserare poate atinge o conditie de
exceptie, efectele lui pot fi duplicate de un trigger de
actualizare, furnizind:
doua coloane (uzual sunt null) care sunt adaugate la tabela
tabela poate fi actualizata exclusa (daca e necesar)
Folosirea procedurilor memorate
Procedurile urmatoare lucreaza intotdeauna, dar sunt mai
complexe de implementat. Ele nu necesita o a doua coloana
suplimentara si deoarece nu trebuie sa inlocuiasca trigger-ul
de actualizare, pot fi folosite fara acces exclusiv la tabela.
1. Se creeaza o procedura memorata care duplica efectele
trigger-ului de inserare.
se declara un cursor pentru tabela selectind toate
rindurile noi
se deschide si se aduc rindurile, unul la un moment dat,
intr-o procesare in bucla
se efectueaza operatiile continute in trigger-ul de
inserare
daca operatia reuseste se schimba stare data noua la null
daca operatia esueaza se schimba
data noua cu
data
eronata
2.Se executa procedura memorata folosind un utilitar de
administrare cum ar fi Server Manager.
3.Dupa rularea procedurii se verifica tabela pentru gasirea
rindurilor data eronata.
4.Se elimina sau se actualizeaza rindurile eronate.
5.Se reactiveaza trigger-ul de inserare.
Dezactivarea permanenta a triggere-lor si constringerilor
SQL*Loader trebuie sa realizeze unele blocuri ale tabelelor
care se incarca pentru a dezactiva triggere si constringeri.
Daca un alt proces activeaza triggere sau constringeri in
acelasi moment in care SQL*Loader incearca sa-i dezactiveze
pentru tabela, SQL*Loader nu poate obtine acces exclusiv la
tabela.
SQL*Loader incearca sa manipuleze aceste situatii pe cit este
posibil. Incearca sa reactiveze trigger-ele si constringerile
inainte de a se termina. Cu toate acestea, aceleasi probleme
de blocare a tabelei care fac imposibila continuarea executiei
SQL*Loader fac imposibil pentru SQL*Loader sa finalizeze
activarea triggere-lor si constringerilor. In aceste conditii,
trigger-ele si constringerile ramin dezactivate permanent pina
cind sunt reactivate manual. Pentru a preveni aceste situatii,
trebuie sa se asigure ca nu sunt alte aplicatii care sa ruleze
si sa incerce sa activeze triggere sau constringeri pentru
tabela cind se desfasoara incarcarea directa.
Daca o incarcare directa este stopata datorita erorii la
obtinerea blocarii necesare, se verifica fisierul log. Acesta
arata fiecare trigger sau constringere care a fost dezactivata

si fiecare incarcare de a o reactiva. Oricare trigger sau


constringere care nu a fost reactivata de SQL*Loader trebuie
activata manual.
Alternativa: Incarcari conventionale concurente
Daca trigger-ele sau constringerile de integritate pune
probleme, dar se doreste o incarcare rapida, se pot lua in
considerare
incarcari
conventionale
concurente.
Aceasta
inseamna ca se pot folosi mai multe sesiuni de incarcare
concurente intr-un sistem cu mai multe CPU. Se imparte
fisierul
de
date
de
intrare
in
fisiere
separate
a
inregistrarilor logice si se incarca fiecare ca fisier de date
de intrare cu o sesiune de incarcare conventionala. Rezultatul
incarcarii are urmatoarele atribute:
Este mai rapida decit o incarcare conventionala intr-un
sistem cu CPU multiple, dar probabil nu asa rapida ca
incarcarea directa.
Trigger-ele si constringerile de integritate se aplica la
toate rindurile nou incarcate si indecsii sunt intretinuti
prin executarea operatiilor DML.
Modele de incarcare paralela
Incarcarea paralela este disponibila numai cu Enteprise
Edition.
Se analizeaza trei modele de baza de incarcare concurenta care
pot fi folosite pentru reducerea timpului necesar incarcarii
datelor:
incarcari conventionale concurente
concurenta inter-segmente cu metoda incarcarii directe
concurenta intra-segmente u metoda incarcarii directe
Concurenta inter-segment cu incarcarea directa
Concurenta inter-segment poate fi folosita pentru incarcarea
concurenta a diferitelor obiecte. Tehnica se aplica pentru
incarcarea concurenta directa a tabelelor diferite sau la
incarcarea concurenta directa a diferitelor partitii ale
aceleiasi tabele. Cind se incarca direct o singura partitie se
iau in considerare urmatoarele elemente:
indecsii locali pot fi intretinuti prin incarcare
indecsii globali nu pot fi intretinuti prin incarcare
constringerile
referentiale
si
de
integitate
trebuie
dezactivate
trigger-ele trebuie dezactivate
datele de intrare trebuie partitionate (altfel mai multe
inregistrari vor fi refuzate cu efecte negative asupra
performantei)
Concurenta intra-segment cu incarcarea directa
SQL*Loader permite sesiunii multiple, concurente pentru a
efectua incarcarea directa in aceeasi tabela sau in aceeasi
partitie a unei tabele partitionate. Mai multe sesiuni
SQL*Loader cresc performanta incarcarii directe date de
resursele disponibile ale sistemului .

Aceasta metoda de incarcare este disponibila setind dublele


optiunii DIRECT si PARALLEL la TRUE, si este adesea referita
ca incarcare paralela.
Este important de realizat ca paralelismul este gestiunea
utilizatorului, setind optiunea PARALLEL la TRUE permite numai
sesiuni de incarcare concurenta directa multiple.
Restrictii la incarcarea paralela directa
nici un index global sau local nu sunt intretinuti prin
incarcarea paralela directa
constringerile referentiale si de integritate trebuie
dezactivate
trigger-ele trebuie dezactivate
rindurile pot fi numai adaugate. REPLACE, TRUNCATE sau
INSERT nu pot fi folosite. Daca trebuie sters continutul
unei tabele inainte de incarcarea paralela, trebuie facuta
manual.
Daca o incarcare paralela directa se aplica la o singura
partitie datele sunt pre-partitionate.
Initierea mai multor sesiuni SQL*Loader
Fiecare sesiune SQL*Loader ia un fisier de date de intrare
diferit. In toate sesiunile care fac o incarcare directa in
aceeasi tabela trebuie setat PARALLEL la TRUE.
PARALLEL poate fi specificat in linia de comanda sau in
fisierul de parametri. De exempplu, daca se invoca trei
sesiuni de incarcare directa SQL*Loader in aceeasi tabela se
executa urmatoarele comenzi de la prompt-ul sistemului de
operare:
SQLLOAD
USERID=SCOTT/TIGER
CONTROL=LOAD1.CTL
DIRECT=TRUE
PARALLEL=TRUE
SQLLOAD
USERID=SCOTT/TIGER
CONTROL=LOAD2.CTL
DIRECT=TRUE
PARALLEL=TRUE
SQLLOAD
USERID=SCOTT/TIGER
CONTROL=LOAD3.CTL
DIRECT=TRUE
PARALLEL=TRUE
Cele trei comenzi trebuie sa fie executate in sesiuni separate
sau daca permite sistemul de operare cu lucrari separate
background. De notat ca se folosesc fisiere de control
multiple. Aceasta permite o flexibilitate in specificarea
fisierelor de folosit pentru incarcarea directa.
Nota: Indecsii nu sunt intretinuti in timpul incarcarii
directe. Orice index trebuie recreat sau reconstruit manual
dupa incarcarea completa. Se poate folosi caracteristica de
recreare paralela a indecsilor pentru cresterea vitezei cu
care se creeaza indecsii mari dupa o incarcare paralela. Cind
se efectueaza o incarcare paralela, SQL*Loader creeaza
segmente temporare pentru fiecare sesiune concurenta si
contopeste segmentele dupa completare. Segmentul creat dupa
contopire este adaugat la segmentul din baza de date dupa
marcajul high water mark al segmentului. Ultimul extent
folosit de fiecare segment pentru fiecare sesiune de incarcare
este...cu orice spatiu liber inainte de a fi combinat cu alt
extent al sesiunii SQL*Loader.
Optiuni ale cuvintelor cheie in incarcarea directa paralela

Cind
se
foloseste
incarcarea
directa
paralela,
sunt
disponibile
optiuni
pentru
specificarea
atributelor
segmentelor temporare care sa fie alocate loader-uli.
Specificarea segmentelor temporare
Este recomandat ca fiecare sesiune de incarcare directa
concurenta sa foloseasca fisiere localizate pe discuri
diferite pentru a permite maximum I/O...
Folosind cuvintul cheie FILE a clauzei OPTIONS se poate
specifica numele fisierului oricarui fisier valid de date in
tablespace a obiectului (tabela sau partitie) care se incarca.
Exemplul urmator arata o portiune a unui fisier de control
folosit de sesiunea SQL*Loader:
LOAD DATA
INFILE load1.dat
INSERT INTO TABLE emp
OPTIONS(FILE=/dat/data1.dat)
(empno POSITION(01:04) INTEGER EXTERNAL NULLIF empno=BLANKS
...
Se poate specifica fisierul bazei de date in care este alocat
segmentul temporar cu cuvintul cheie FILE in clauza OPTIONS
pentru fiecare obiect (tabela sau partitie) in fisierul de
control. Se poate specifica deasemenea parametrul FILE in
linia de comanda a oricarei sesiuni concurente SQL*Loader, dar
acesta va fi aplicat global la toate obiectele care se incarca
cu aceasta sesiune.
Folosirea cuvintului cheie FILE
Cuvintul cheie FILE in Oracle8 are urmatoarele restrictii cu
incarcarea directa:
1.Pentru tabele nepartitionate, se incarca o singura partitie:
fisierul specificat trebuie sa fie in tablespace al tabelei
care se incarca.
2. Pentru tabele partitionate, se incarca o singura partitie:
fisierul specificat trebuie sa fie in tablespace a partitiei
care se incarca.
3. Pentru tabele partitionate, incarcarea completa a tabelei:
fisierul specificat trebuie sa fie in tablespace a
partitiilor care se incarca, asta insemnind ca toate
partitiile trebuie sa fie in acelasi tablespace.
Folosirea cuvintului cheie STORAGE
Cuvintul cheie STORAGE poate fi folosit pentru a specifica
atributele de memorare ale segmentelor temporare alocate
pentru o incarcare paralela. Daca nu se foloseste cuvintul
cheie STORAGE, sunt folosite atributele de memorare ale
segmentului care contine obiectul care se incarca.
OPTIONS(STORAGE=(MINEXTENTS n1 MAXEXTENTS n2 INITIAL n3[KIM]
NEXT n4[KIM] PCTINCREASE n5)
OPTIONS (STORAGE=(INITIAL 100M PCTINCREASE 0))
Cuvintul cheie STORAGE poate fi folosit numai in fisierul de
control si nu in linia de comanda. Utilizarea cuvintului cheie
STORAGE pentru a specifica altceva decit PCTINCREASE 0,
INITIAL sau NEXT nu este recomandata.
Activarea constringerilor dupa o incarcare directa paralela

Constringerile si trigger-ele trebuie activate manual dupa ce


incarcarea tuturor datelor este completa.
Sugestii pentru crestere performantei:
1. Se face mai eficienta procesarea inregistrarilor:
se
mapeaza
unu
la
unu
inregistrarile
fizice
la
inregistrarile logice (se evita continueif, concatenarea)
se face mai usor pentru soft sa figureze marginile
inregistrarilor fizice. Se foloseste optiunea de procesare
a fisierului FIX nnn sau VAR. Pe cele mai multe
platforme (UNIX,NT) loader scaneaza fiecare inregistrare
fizica pentru terminatorul de inregistrare (caracterul
linie noua)
2. Se face setarea cimpurilor mai eficienta.
Setarea cimpurilor este procesul de mapare a cimpurilor in
fisierul de date la coloanele corespunzatoare ale tabelei
care se incarca. Functia de mapare este controlata de
descrierea cimpurilor in fisierul de control. Setarea
cimpurilor (impreuna cu conversia datelor) este mare
consumatoare de timp CPU pentru cele mai multe incarcari.
se
evita
delimitarea
cimpurilor;
se
foloseste
pozitionarea cimpurilor. Daca se foloseste delimitarea
cimpurilor, loader-ul trebuie sa scaneze datele de
intrare pentru a gasi delimitatorii. Daca se foloseste
cimpul pozitional setarea cimpurilor devine aritmetica
simpla.
nu se elimina spatiile daca nu este necesar (se foloseste
PRESERVE BLANKS)
3. Se face conversia mai eficienta. Sunt citeva conversii pe
care le executa loader-ul. Se evita pe cit se poate
efectuarea de conversii. Loader-ul suporta patru seturi de
caractere:
a. setul de caractere client (NLS_LANG al procesului client
sqlldr)
b. setul de caractere al fisierului de date (uzual acelasi cu
setul de caractere client dar poate fi si diferit)
c. setul de caractere al serverului
d. setul national de caractere al serverului
Performanta este optima cind toate seturile de caractere sunt
aceleasi. Pentru incarcarea directa, cel mai bine este daca
setul de caractere al fisierului de date si setul de caractere
al serverului sunt aceleasi. Daca seturile de caractere sunt
aceleasi, nu se aloca buffer pentru conversia setului de
caractere.
Daca este posibil se foloseste set de caractere pe un
singur byte.
4. Se foloseste incarcarea directa.
5. Se foloseste clauza sorted indexes.
6. Se evita clauzele NULLIF si DEFAULTIF daca nu sunt necesare.
Fiecare clauza trebuie evaluata in fiecare coloana care are
asociata o clauza pentru fiecare rind incarcat.
7. Se foloseste incarcarea paralela directa si creerea paralela
a indecsilor, cind se poate.

SQL*Loader-00100 Syntax error on command-line


Cauza: Posibile cauze ale acestei erori:
-pozitionarea unui argument pozitional dupa argumentele
cuvintului cheie
-sintaxa gresita a unui cuvint cheie
-nu s-au inchis paranteze sau apostraofe
-spatii intre operator,"-", si un argument
Actiune: Se verificasintaza si se reia
SQL*Loader-00101 Invalid argument for username/password
Cauza: Nume utilizator/parola specificat in linia de comanda
nu sint recunoscute. Un alt argument (neidentificat prin
cuvint cheie), poate fi in pozitia in care trebuie sa fie
utilizator/parola. Eroarea poate proveni dintr-o scriere
gresita. Parola, daca esete prezenta, trebuie separata prin
slash (/). Nu pot apare spatii intre nume utilizator/(slash)
si parola. Altfel, SQLL*Loader le considera ca argumente
multiple.
Actiune:
Se
verifica
formatul
argumentului
nume_utilizator/parola, care trebuie sa fie primul in linia de
comanda, daca argumentele sint date fara cuvinte cheie.
SQL*Loader-00102 Invalid control file name on command line
Cauza: Numele fisierului de control specificat in linia de
comanda nu este recunoscut. Poate este scris gresit, sau alt
argument (neidentificat prin cuvint cheie) poate fi in locul
lui. O cauza posibila poate fi existenta unui spatiu intre
nume_utilizator si parola.
Actiune: Se verifica scrierea comenzii si pozitia argumentelor
in linia de comanda.
SQL*Loader-00103 Invalid log file name on command line
Cauza: Numele fisierului log specificat in linia de comanda nu
este recunoscut sau este scris gresit sau in locul lui este
plasat alt argument neidentificat prin cuvint cheie.
Actiune: Se verifica scrierea comenzii si pozitia argumentelor
in linia de comanda.
SQL*Loader-00104 Invalid bad file name on command line
Cauza: Numele fisierului bad specificat in linia de comanda nu
este recunoscut sau este scris gresit sau in locul lui este
plasat alt argument neidentificat prin cuvint cheie.
Actiune: Se verifica scrierea comenzii si pozitia argumentelor
in linia de comanda.
SQL*Loader-00105 Invalid data file name on command line
Cauza: Numele fisierului de date specificat in linia de
comanda nu este recunoscut sau este scris gresit sau in locul
lui este plasat alt argument neidentificat prin cuvint cheie.
Actiune: Se verifica scrierea comenzii si pozitia argumentelor
in linia de comanda.
SQL*Loader-00106 Invalid discard file name on command line
Cauza: Numele fisierului discard specificat in linia de
comanda nu este recunoscut sau este scris gresit sau in locul
lui este plasat alt argument neidentificat prin cuvint cheie.
Actiune: Se verifica scrierea comenzii si pozitia argumentelor
in linia de comanda.
SQL*Loader-00107 Invalid maximum number of discards

Cauza: Valoarea argumentului nu este corespunzatoare sau in


locul lui este alt argument (neidentificat prin cuvint cheie).
Actiune: Se verifica linia de comanda si se reia
SQL*Loader-00108 Invalid number of logical records to load
Cauza: Valoarea argumentului nu este corespunzatoare sau in
locul lui este alt argument (neidentificat prin cuvint cheie).
Actiune: Se verifica linia de comanda si se reia
SQL*Loader-00109 Invalid number of logical records to skip
Cauza: Valoarea argumentului nu este corespunzatoare sau in
locul lui este alt argument (neidentificat prin cuvint cheie).
Actiune: Se verifica linia de comanda si se reia
SQL*Loader-00110 Invalid maximum number of errors
Cauza: Valoarea argumentului nu este corespunzatoare sau in
locul lui este alt argument (neidentificat prin cuvint cheie).
Actiune: Se verifica linia de comanda si se reia
SQL*Loader-00111 Invalid number of rows for bind array or data
saves
Cauza: Valoarea argumentului nu este corespunzatoare sau in
locul lui este alt argument (neidentificat prin cuvint cheie).
Actiune: Se verifica linia de comanda si se reia
SQL*Loader-00112 Invalid maximum bind array size
Cauza: Valoarea argumentului nu este corespunzatoare sau in
locul lui este alt argument (neidentificat prin cuvint cheie).
Actiune: Se verifica linia de comanda si se reia
SQL*Loader-00113 Invalid silent mode option
Cauza: In linia de comanda sini valide numai optiunile ALL,
ERROR, FEEDBACK sau HEADER pentru comanda SILENT. Argumentul
poate fi scris gresit sau in locul lui este un alt argument
(neidentificat prin cuvint cheie).
Actiune: Se verifica comanda si se reia.
SQL*Loader-00114 Error in OPTIONS statement
Cauza: Optiunile liniei de comanda specficate in fisierul de
control cu clauza OPTIONS sint incorecte.
Actiune: Se verifica formatul clauzei OPTIONS in fisierul de
control.
SQL*Loader-00115 Invalid direct path option
Cauza: Pentru argumentul DIRECT din linia de comanda sint
valide numai optiunile TRUE sau FALSE. Argumentul poate fi
scris gresit sau in lucul lui este un alt argument
(neidentificat prin cuvint cheie).
Actiune: Se verifica linia de comanda si se reia.
SQL*Loader-00116 Error prompting for password
Cauza : Eroare interna.
Actiune : Se contacteaza Oracle.
SQL*Loader-00118 Invalid parallel load option
Cauza: Argument incorect in linia de comanda folosit pentru
incarcarea paralela.
Actiune: Se foloseste numai valoare TRUE sau FALSE pentru
optiunea incarcare paralela.
SQL*Loader-00119 Invalid parallel file (data file) name on
command line
Cauza: Argumentele liniei de comanda pentru pentru un fisier
paralel au fost introduse gresit.
Actiune: Se verifica comanda si se reia.

SQL*Loader-00120 invalid_syncro option string


Cauza: Argumentele liniei de comanda SYNCRO sint incorecte.
Actiune: Se folosesc numai modurile permise; se va vedea
ullmiv[].
SQL*Loader-00121 Invalid skip_unusable_indexes option
Cauza:
Argumentele
liniei
de
comanda
pentru
SKIP_UNUSABLE_INDEXES sint incorecte.
Actiune: Se folosesc numai valorile TRUE sau FALSE pentru
optiunea SKIP_UNUSABLE_INDEXES.
SQL*Loader-00122 Invalid skip_index_maintenance option
Cauza:
Argumentele
liniei
de
comanda
pentru
SKIP_UNUSABLE_MAINTENANCE sint incorecte.
Actiune: Se folosesc numai valorile TRUE sau FALSE pentru
optiunea SKIP_UNUSABLE_MAINTENANCE.
SQL*Loader-00200 FORMAT clause should not be present - flat
data files only
Cauza: Nu este suportata clauza SQL/DS FORMAT
Actiune: Se elimina clauza FORMAT din fisierul de control sau
se comenteaza.
SQL*Loader-00250 Work data sets are not used by SQL*Loader
Cauza: Fisierul de control contine clauza WRKDDN. SQL*Loader
ignora cauza.
Actiune: Nu cere actiune. Este un mesaj de informare.
SQL*Loader-00251 Sort devices are not used by SQL*Loader
Cauza: Fisierul de control contine clauza SORTDEV. SQL*Loader
ignora cauza.
Actiune: Nu cere actiune. Este un mesaj de informare.
SQL*Loader-00252 Sort data sets are not used by SQL*Loader
Cauza: Fisierul de control contine clauza SORTNUM. SQL*Loader
ignora cauza.
Actiune: Nu cere actiune. Este un mesaj de informare.
SQL*Loader-00253 DB2 partition number has no significance -ignored
Cauza: Fisierul de control contine clauza PART. SQL*Loader
ignora cauza.
Actiune: Nu cere actiune. Este un mesaj de informare.
SQL*Loader-00254 Cannot have DISCARDFILE specs here when
multiple data
files
Cauza: Fisierul de comenzi contine mai multe comenzi INFILE si
o comanda DISCARD FILE sub clauza RESUME.
Actiune: Se muta comanda DISCARD inainte de RESUME astfel ca
sa fie adiacenta comenzii INFILE.
SQL*Loader-00255 Log file for error recovery not used by
SQL*Loader
Cauza: Fisierul de control contine clauza LOG. SQL*Loader
ignora cauza.
Actiune: Nu cere actiune. Este un mesaj de informare.
SQL*Loader-00256 SORTED INDEXES option allowed only for direct
path
Cauza: Fisierul de control contine comanda SORTED INDEX dar nu
foloseste incarcarea directa.

Actiune:
Se
specifica
incarcarea
directa
cu
comanda
DIRECT=TRUE in linia de comanda, se sterge comanda din
fisierul de control sau se comenteaza.
SQL*Loader-00258 Maximum number of SORTED INDEXES (number)
exceeded
on table string
Cauza:Sint prea multi indecsi in clauza SORTED INDEX. Mesajul
afiseaza numarul maxim permis.
Actiune: Se reduce numarul de indecsi in clauza SORTED INDEX
sau sau se foloseste incarcarea conventionala in locul
incarcarii directe.
SQL*Loader-00259 Could not escalate DDL share lock to
exclusive on table string
Cauza: Eroarea se intilneste cin un alt utilizator face o
blocare a tabelei, de exemplu un utilizator face un select pe
tabela. Faza de blocare trebuie elininata momentan.
Actiune: Se da o sansa fazei de blocare sa se termine si se
reia sau se foloseste incarcarea conventionala.
SQL*Loader-00262 PIECED keyword (on column string) allowed
only when path
is direct
Cauza: Cuvintul cheie PIECED nu poate fi folosit intr-o
incarcare conventionala.
Actiune: Se elimina PIECED sau se foloseste calea directa.
SQL*Loader-00263 PIECED column string must be last specified
column in table
string
Cauza: O coloana care nu este ultima coloana din tabela a fost
specificata ca PIECED.
Actiune: Se elimina cuvintul cheie PIECED sau se plasesza
coloana ultima.
SQL*Loader-00264 File mode token string parsed but ignored
Cauza: In fisierul de control s-a folosit un mod invechit. La
procesarea fiserului de control este folosit un sir de optiuni
mai degraba decit cuvinte cheie cum ar fi STREAM, RECORD,
FIXED si VARIABLE.
Actiune: Nu cere actiune. Este un mesaj de informare. Se
elimina cuvintele cheie invechite pentru a elimina mesajele
fara a schimba modul in care sint procesate datele din
fisierul de date.
SQL*Loader-00265 Unable to get default character set name.
Cauza: SQLL*Loader nu poate localiza setul implicit de
caractere pentru mediul de lucru.
Actiune: Se furnizeaza numele setului de caractere cu cuvintul
cheie CHARACTERSET.
SQL*Loader-00266 Unable to locate character set handle for
string.
Cauza: SQLL*Loader nu poate gasi setul de caractere pentru
setul numit.
Actiune: Se corecteaza numele setului de caractere.
SQL*Loader-00267 Control file must be first data file.
Cauza: Fisereul de control este specificat ca si continind
date folosind clauza INFILE "*" dar alt fisier de data a fost
denumit primul.

Actiune: Se muta clauza INFILE "*" in asa fel incit acesta sa


fie primul fisier de date declarat in fisierul de control.
SQL*Loader-00268 UNRECOVERABLE keyword may be used only in
direct path.
Cauza: Cuvintul cheie UNRECOVERABLE poate fi specificat numai
in incarcarea directa.
Actiune: Se foloseste incarcarea directa sau se elimina
cuvintul cheie.
SQL*Loader-00269 Null string not allowed as clause comparison
text.
Cauza: O clauza este comparata cu un sir null.
Actiune: Se modifica clauza in asa fel incit sa se compare cu
cel putin un caracter.
SQL*Loader-00270 TERMINATED BY EOF valid only for CHAR or RAW
datatypes
SQL*Loader-00271 Not a Parallel load. Table level OPTIONS
statement ignored.
Cauza: S-a specificat comanda OPTIONS la nivel tabele pentru o
incarcare non paralela.
Actiune: Se elimina comanda OPTIONS din fisierul de control.
SQL*Loader-00272 Table level OPTIONS statement ignored.
Cauza: In optiunea de incarcare paralela, fisierul specificat
suprascrie fiserul specificat in fiserul de control.
Actiune: Se elimina comanda OPTIONS din fisierul de control.
SQL*Loader-00273 READBUFFERS may be used only in direct path.
Cauza: Specificatia READBUFFERS nu a fost introdusa ca parte a
incarcarii directe.
Actiune: Se foloseste incarcarea directa sau se elimina
specificarea READBUFFERS din fisierul de control.
SQL*Loader-00274 At least 2 read buffers have to be specified.
Cauza: S-au specificat mai putin de doua buffere.
Actiune: Se specifica cel putin doua buffere in comanda
READBUFFERS din fiserul de control.
SQL*Loader-00275 Data is in control file but "INFILE *" has
not been specified.
Cauza: Specificatia INFILE nu a fost introdusa in fisierul de
control.
Actiune: Daca datele din fisierul de control trebuie citite,
se specifica INFILE "*" in fisierul de control.
SQL*Loader-00276
Local
storage
option
overrides
global
storage.
Cauza: In optiunea nivel tabela s-a specificat o clauza de
memorare si alta in optiunea globala.
Actiune: Este numai un mesaj de atentionare. Optiunile la
nivel tabela au intiietate fata de optiunile glabale. Se sterg
comenzile cu optiuni la nivel tabela.
SQL*Loader-00277 Local file specification overrides global
file specification.
Cauza: Un nume de fisier s-a specificat in optiunea la nivel
tabela si altul in optiunea globala.
Actiune: Este numai un mesaj de atentionare. Optiunile la
nivel tabela au intiietate fata de optiunile glabale. Se sterg
comenzile cu optiuni la nivel tabela.

SQL*Loader-00278 Incorrect file specification for parallel


load.
Cauza: Numele fisierului folosit la efectuarea incarcarii
paralele este incorect.
Actiune: Se corecteaza numele fisierului si se reia incarcarea
paralela.
SQL*Loader-00279 Only APPEND mode allowed when parallel load
specified.
Cauza: In incarcarea paralela s-a folosit specificarea INSERT,
REPLACE sau TRUNCATE.
Actiune: Se modifica fisierul de control sa foloseasca
cuvintul cheie APPEND si se reia incarcarea paralela.
SQL*Loader-00281 Warning: ROWS parameter ignored in parallel
mode.
Cauza: Specificarea unui punct de salvare folosind parametrul
ROWS nu este suportata in incarcarea directa.
Actiune: Se elimina parametrul ROWS din argumentale liniei de
comanda sau se specifica incarcarea non paralela pentru a
efectua incarcarea cu puncte de salvare.
SQL*Loader-00282 Unable to locate character set handle for
character set ID
(number).
Cauza: SQL*Loader nu gaseste setul de caractere pentru ID-ul
setului de caractere dat.
Actiune: ID-ul setului de caractere a fost obtinut de la
serverul bazei de date, clientul SQL*Loader nu poate sti ID-ul
setului de caractere dat. Posibil lipseste NLS pe client sau
server.
SQL*Loader-00303 Non-hex character encountered where hex char
expected
Cauza: Intr_un sir hexazecimal a fost gasit un caracter non
hexazecimal.
Actiune: Se schimba caracterul la un caracter hexazecimal.
SQL*Loader-00304
Illegal
combination
of
non-alphanumeric
characters
Cauza: Fisierul de control contine o combinatie de caractere
alfanumerice pe care SQL*Loader nu le recunoaste. De exemplu
combinatia != este recunoscuta ca "nu este egal" dar
combinatia =! nu este valida.
Actiune: Se elimina caracterele nerecunoscute din fisierul de
control.
SQL*Loader-00305
More
than
one
end
of
file
character
encountered
Cauza: Fisierul contine mai multe marcaje end-of-file.
Actiune: Se elimina marcajele end-of-file in exces.
SQL*Loader-00306 Token longer than max allowable length of
number chars
Cauza: Fisierul de control contine un cuvint sau o combinatie
de caractere care este mai lunga decit valoarea maxima
posibila. Valoare maxima posibila este indicata. Aceasta
eroare poate proveni din lipsa spatiilor incit sint legate mai
multe inele.
Actiune: Se verifica fisierul de control. Se separa inelele
daca sint legate sau se scurteaza.

SQL*Loader-00307 Warning: conflicting lengths number and


number specified for
column string table string
Actiune: Fisierul de control specifica doua lungimi diferite
ale coloanei. Sint trei moduri de a specifica lungimea unui
cimp:
-prin cuvintul cheie POSITION POSITION (1:3)
-prin specificarea lungimii CHAR(6)
-cu lungimea implicita a tipului de data (ex. INTEGER)
Se
intilneste
un
conflict
intre
oricare
aceste
doua
specificatii. O cauza comuna a acvesto erori este cind se
specifica un tip de data numeric, cum ar fi INTEGER, pe cind
intentia este de a specifica o forma numerica externa (INTEGER
EXTERNAL). Forma externa contine date caracter, incit este
considerabil mai lunga decit forma numerica, care contine date
binare.
Actiune: Ne este necesara o actiune deoarece SQL*Loader
foloseste numai o lungime. Se verifica in fisierul log sub
antetul "Len" in sectiunea de descriere a tabelei pentru a
vedea ce lungime a fost folosita. Ajustarea fisierului de
control pentru o specificatie uniforma a lungimii va evita
aparitia mesajului.
SQL*Loader-00308 string SQL string of column string must be in
double quotes
Cauza: S-a gasit un sir SQL nemarcat de ghilimele sau intre
apostroafe.
Actiune: Se folosesc ghilimelele in loc de apostraoafe.
SQL*Loader-00350 Syntax error at line number.
Cauza: num identifica linia din fisierul de control la care sa intilnit eroarea. Mesajul este urmat de altul de forma
Expecting sir1 found sir2
Unde sir1 este descrierea a ceea ce SQL*Loader asteapta sa
gaseasca in fisierul de control si sir2 este ceea ce a gasit.
Atunci SQL*Loader afiseaza linia cu probleme din fisierul de
control indicind locul erorii.
SQL*Loader er-350: Syntax error at line 28
Expecting column name, found keyword CHAR
Col3 ENCLOSE BY '"', CHAR ENCLOSED "'",
Actiune: Se compara sintaxa DDL si se fac corectiile necesare.
SQL*Loader-00401 End field position number must be greater
than or equal to
start number
Cauza: Cimpul denumit contine o clauza (start:end) in care end
este mai mic decit start.
Actiune: Se modifica clauza incit end sa fie mai mare sau egal
cu start.
SQL*Loader-00402 Unable to determine length of column string
fromspecificationCauza: Tipul de data specificat nu are o
lungime implicita (de exemplu un tip numeric extern sau RAW),
nu estespecificat cu delimitatori, nu s-a specificat lungimes
si lungimea nu poate fi determnata din clausa POSITION.
Actiune: Daca este specificata clauza POSITION se adauga
locatia de sfirsit pentru a genera lungimea. Clauza are forma
POSITION (start:end)

Lungimea poate fi deasemenea specificata dupa tipul de data ca


in INTEGER EXTERNAL (6). Cimpul poate fi specificat cu
delimitatori sau tipul de data schimbat cu unul care are o
lungime implicita.
SQL*Loader-00403 Referenced column string not present in table
string.
Cauza: Coloana nu este in tabela denumita.
Actiune: Se corecteaza numele coloanei din tabela.SQL*Loader00404 Column string present more than once in string's
INTOTABLE block.
Cauza: S-a specificat mai mult decit o data un nume de coloana
intr-o singura comanda INTO TABLE.
Actiune: Se elimina specificarile coloanei in plus.
SQL*Loader-00405
Need
termination
delim
with
optional
enclosure delim:column string table stringCauza: Coloana a
fost specificata cu un delimitator optional dar nu cu un
delimitator terminator. Delimitatorii de inchidere pot fi
optionali numai cin sint prezenti delimitatorii terminali.
Actiune: Se specifica un delimitator terminal sau se fac
delimitatorii de inchidere ne optionali.
SQL*Loader-00406 If data is all generated, number to load
cannot be ALL
Cauza: Cind sint incarcate numai date generate, trebuie dat un
numar de incarcare, in asa fel ca SQL*Loader sa stie cind se
opreste.
Actiune: Se specifica un numar de incarcare.SQL*Loader-00407
If data is all generated, number to skip is meaningless
Cauza: Cind sint generate toate datele, nu este un fisier de
citit si nu sint inregistrari de sarit.
Actiune: Se elimina numarul de salt.SQL*Loader-00408 Physical
record stack overflow
Cauza: Eroare interna.
Actiune: Se contacteaza Oracle.
SQL*Loader-00409 Number to skip must be table-level, not loadlevel on
continued loads
Cauza: In linia de comanda sau in comanda OPTIONS s-a
specificat parametrul SKIP dar incarcarea a fost specificata
continua cu CONTINUE_LOAD.
Cind se intrerupe incarcarea directa in mai multe tabele este
posibil ca in fiecare tabela sa se fi incarcat un numar
diferit de inregistrari. Ca rezultat, numarul de inregistrari
care se sar trebuie specificat pentru fiecare tabela cind se
continua incarcarea. In acest caz incarcarea este specificata
ca si continua cu comanda CONTINUE_LOAD si numarul de
inregistrari de sarit este dat in comanda INTO TABLE.
Actiune: Se verifica fisierul log pentru a determina numarul
de inregistrari de sarit pentru fiecare tabela si se specifica
acest numar incomanda INTO TABLE pentru feicare tabela intr-o
incarcare continua sau cu parametru SKIP in linia de comanda
pentru o incarcare standard.
SQL*Loader-00410 Number to skip must be load-level, not tablelevelCauza: In comanda INTO TABLE a unei incarcari standard sa specificat clauza SKIP.

Intr-o incarcare standard, specificata cu LOAD DATA, nu este


posibil sa se sara inregistrari diferite pentru fiecare
tabela. Numarul de inregistrari care sint sarite trebuie sa
fie specificat pentru intreaga incarcarefolosind parametrul
SKIP in linia de comanda sau in clauza OPTIONS.
Daca ete cerut un salt la nivelul tabelei deoarece a fost
incarcat un numar diferit de inregistrari in fiecare tabela
(posibil numai cind s-a efectuat incarcarea directa in mai
multe tabele), atunci se scpecifica o incarcare continua cu
comanda CONTINUE_LOAD.
Actiune: Daca incarcarea nu a fost in mai multe tabele,
incarcare directa, atunci se muta clauza SKIP din comanda INTO
TABLE in linia de comanda sau clauza OPTIONS. Altfel, se
specifica incarcarea ca si continua cu CONTINUE_LOAD.
SQL*Loader-00411
Only
a
direct
path
load
may
be
continuedCauza: Incarcarea este specificata cu CONTINUE_LOAD
dar DIRECT=FALSE. CONTINUE_LOAD este posibila doar pentru
incarcarea directa si este necesara numai pentru mai multe
tabele, incarcarea directa cind au fost incarcate in fiecare
tabela un numar diferit de inregistrari.
Actiune: Daca este necesar CONTINUE_LOAD, se specifica
incarcarea directa si se da numarul de inregistrari sarite in
fiecare comanda INTO TABLE. Altfel, se foloseste clauza
OPTIONS in linia de comanda pentru a specifica numarul de
inregistrari de sarit si se foloseste comanda LOAD DATA in loc
de CONTINUE_LOAD.
SQL*Loader-00412 More columns specified for table string than
the maximum
(number)
Cauza: S-au specificat mai multe coloane decit numarul maxim
permis pentru baza de date.Actiune: Se sterg coloanele in
plus.
SQL*Loader-00417 SQL string (on column string) not allowed in
direct path.
Cauza: Deorece incarcarea directa evita precesarea SQL, sirul
SQL nu este folosit.
Actiune: Se elimina sirul SQL sau se foloseste incarcarea
conventionala.
SQL*Loader-00457 Comparison text of CONTINUEIF LAST must have
length 1
not number
Cauza: Textul de comparat este prea lung. Poate fi numai de un
caracter.
Actiune: Se reduce textul la un caracter.
SQL*Loader-00458 Comparison text ('string') of CONTINUEIF LAST
must be
non-whitespace
Cauza: Textul de comparat este blank sau tab.
Actiune: Se schimba textul.
SQL*Loader-00459 error fetching numeric value for sequence on
column (string)
Cauza: S-a incercat trimiterea unei valori nenemerice pentru
o coloana secventiala.

Actiune: Se verifica daca datele pentru coloana secventiala


sint numerice. Se reia operatia.
SQL*Loader-00460 Column (string), form of use (number) does
not match char set
id of (number)
Cauza: Coloana data cu o forma data de folosire nu au acelasi
ID de caractere ca si coloana anterioare cu aceeasi forma de
utilizare.
Actiune: Aceasta situatie nu se poate intilni. Se contacteaza
Oracle si se trimite DDL pentru tabela care trebuie incarcata
si fisierul de control.
SQL*Loader-00500 Unable to open file (string)
Cauza: SQL*Loader nu poate deschde fisierul specificat.
Actiune: Se verifica mesajele sistemului de operare care
urmeaza in fisierul log.
SQL*Loader-00501 Unable to read file (string)
Cauza: SQL*Loader nu poate citi fisierul specificat.
Actiune: Se verifica mesajele sistemului de operare care
urmeaza in fisierul log.
SQL*Loader-00503 Error appending extension to file (string)
Cauza: SQL*Loader nu poate adauga extensia implicita pentru a
crea numele fisierului. Numele este prea lung sau contine
caractere ilegale.
Actiune: Se verifica numele fisierului.
SQL*Loader-00504 Error skipping records in file (string)
Cauza: SQL*Loader nu poate deschide fisierul sau nu poate
citi din el.
Actiune: Se verifica daca fisierul este cel asteptat si daca
exista drepturi pentru a-l accesa.
SQL*Loader-00510 Physical record in data file (string) is
longer than the
maximum(number)
Cauza: Fisierul de date are o inregistrare fizica prea lunga.
Actiune: Se foloseste CONCATENATE sau CONTINUEIF.
SQL*Loader-00511 Unable to initialize read functions
Cauza: SQL*Loader nu poate initializa functia de citire.
Actiune: Se vor vedea mesajele din fisierul log.
SQL*Loader-00512 Unable to free read buffer
Cauza: Eroare interna.
Actiune: Se contacteaza Oracle.
SQL*Loader-00513 Unable to close file (string)
Cauza: SQL*Loader nu poate inchide fisierul specificat.
Actiune: Se vor vedea mesajele din fisierul log.
SQL*Loader-00514 Error getting elapsed time
Cauza: SQL*Loader nu poate citi timpul scurs da la sistem.
Actiune: Nu cere actiune.
SQL*Loader-00515 Error getting CPU time
Cauza: SQL*Loader nu poate citi timpul CPU.
Actiune: Nu cere actiune.
SQL*Loader-00516 Control file (string) has no contents
Cauza: Fisierul specificat e gol.
Actiune: Se verifica daca acesta este fisierul dorit si daca
este gol.
SQL*Loader-00517 Error decomposing file name (string)

Cauza: SQL*Loader nu poate separa numele fisierului in


partile sale componente.
Actiune: Se verifica numele fisierului pentru depistarea
eventualelor caractere ilegale.
SQL*Loader-00518 Error reassembling file name (string)
Cauza: SQL*Loader nu poate reface numele fisierului din
componente.
Actiune: Se verifica numele fisierului pentru depistarea
eventualelor caractere ilegale.
SQL*Loader-00520 lfimknam failed for file (string)
Cauza: LFI esueaza sa creeze un nume de obiect pentru fisier.
Actiune: Se contacteaza Oracle.
SQL*Loader-00521 lfilini failed for file (string)
Cauza: LFI esueaza sa creeze sau sa initializeze un fisier
obiect pentru fisierul specificat.
Actiune: Se contacteaza Oracle.
SQL*Loader-00522 lfiopn failed for file (string)
Cauza: LFI esueaza sa deschida fisierul.
Actiune: Se verifica unele potentiale erori de sistem de
operare sau de memorie.
SQL*Loader-00523 error number writing to file (string)
Cauza: Nu se poate scrie fisierul specificat.
Actiune: Se verifica:
-fisierul este in locatia specificata
-exista privilegii de scrierea fisierului
-exista suficient spatiu pe disc
-nu se depaseste cota de spatiu alocata
Daca sint indeplinite toate conditiile se reia operatia.
SQL*Loader-00600 Bind size of number bytes increased to number
bytes to hold 1
row.
Cauza: Spatiul necesar sa contina un rind este mai mic decit
marimea de legatura.
Actiune: O solutie este cresterea spatiuliui perms pentru
vectorul de legatura folosinf=d cuvintul cheie BINDSIZE in
linia de comanda sau comanda OPTIONS in fisierul de control.
Daca rindul contine date VARCHAR sau VARGRAPHIC, specificarea
unei lungime maxime pentru aceste rinduri poate reduce
deasemenea cantitatea de memorie necesara bufferului.
SQL*Loader-00601 For INSERT option, table must be empty. Error
on table string
Cauza: Este incarcata o tabele care nu este goala cu optiunea
INSERT.
Actiune: Se foloseste cuvintul cheie REPLACE pentru a goli
tabela si a memora date noi in loc. Se foloseste cuvintul
cheie APPEND pentru a lasa neschimbat continutul tabelei si a
adauga date noi la ea.
SQL*Loader-00602 Maximum converted length number of column
string is too big
for bind array
Cauza: Coloana denumita nu poate fi adusa la setul de
caractere specificat pentru conversie si ramine intr-o zona
contigua de memorie in sistem

Actiune: Se specifica o coloana mai scurta sau se elimina


conversia.
SQL*Loader-00603 Maximum length number of column string is too
big for bind
array
Cauza: Coloana numita nu poate fi pusa intr-o zona contigua
de memorie a sistemului.
Actiune: Se specifica o coloana mai scurta.
SQL*Loader-00604 Error occurred on an attempt to commit
Cauza: S-a intilnit o eroare cind s-a incercat realizarea
modificarilor in baza de date.
Actiune: Se vor vedea mesajele din fisierul log pentru
informatii detaliate.
SQL*Loader-00605 Non-data dependent ORACLE error occurred -load
discontinued.
Cauza: S-a intilnit o eroare care este independenta de date.
De exemplu, o conditie out-of-space. Deoarece toate rindurile
cere urmeaza vor fi refuzate, incarcarea este discontiunua.
(Daca erorile sint dependente de date, alte rinduri vor fi
introduse).
Actiune: Se vor vedea informatiile din fisierul log pentru
detalii.
SQL*Loader-00606 Object string in INTO TABLE clause is not a
local table
Cauza: Sinonimul specificat in clauza INTO TABLE a fisierului
de control specifica un obiect la distanta intr-o baza de date
legata. In clauza INTO TABLE poate fi specificat numai un
sinonim pentru o tabela locala.
Actiune: Se va asigura ca numele tabelei locale sau sinonimul
pentru tabela locala este corect specificat in clauza INTO
TABLE. Tabela trebuie sa existe.
SQL*Loader-00607 partition not empty for INSERT option; table
string, partition
string
Actiune: S-a incercat folosirea optiunii INSERT pentru o
partitie care nu e goala.
Actiune: Se goleste partitia sau se foloseste optiunea
REPLACE sau TRUNCATE.
SQL*Loader-00620 Initial enclosure character not found
Cauza: Nu este prezent un delimitator de inchidere initial
obligatoriu. Sau lipsaste din cimpul curent sau din cimpul
anterior lipseste un delimitator de inchidere identic.
Actiune: Se intoduce delimitatorul lipsa.
SQL*Loader-00621 Field in data file exceeds maximum length
Cauza: Un cimp depaseste dimensiunea maxima permisa. Lungimea
maxima permisa este lungimea specificata in fisierul de
control, sau, pentru cimpurile delimitate fara sa li se
specifice lungimea, dimensiunea coloanei din baza de date
(pentru coloane CHAR, VARCHAR).
Actiune: Se verifica delimitatoarele si/sau se scurteaza
cimpul.
SQL*Loader-00622 Column not found before end of logical record
(use

TRAILING NULLCOLS)
Cauza: Inregistrarea logica se termina inainte de a se gasi
toate cimpurile specificate.
Actiune: Daca cimpurile lipsa pot fi incarcate ca null, se
foloseste clauza TRAILING NULLCOLS. Altfel, se corecteaza
datele.
SQL*Loader-00623 second enclosure string not present
Cauza: S-a gasit sfirsitul unei inregistrari logice fara sa
fie gasit al doilea element de inchidere.
Actiune: Se introduce delimitatorul lipsa.
SQL*Loader-00624 no terminator found after TERMINATED and
ENCLOSED
field
Cauza: Nu s-a gasit delimitatorul de inchidere dupa ce s-a
terminat cimpul delimitat.
Actiune: Se introduce delimitatorul lipsa.
SQL*Loader-00625 Multibyte character error in control file.
Cauza: In fiserul de control s-a gasit un sir de caractere
incomplet.
Actiune: Se verifica fisierul de control si se corecteaza
daca e cazul.
SQL*Loader-00626 Character set conversion buffer overflow.
Cauza: Conversia de la setul de caractere af fisierului de
date la setul de caractere al clientului necesita mai mult
spatiu decit este in bufferul de conversie. Dimensiunea
bufferului de conversie este limitata de de dimensiunea
coloanelor VARCHAR2.
Actiune: Inregistrarile sint respinse. Datele nu incap in
coloana.
SQL*Loader-00627 Character set conversion graph not available.
Cauza: Converaia de la setul de caractere al fisierului de
date la setul de caractere client esueaza pentru ca nu e
disponibil graficul de conversie.
Actiune: Se contacteaza Oracle. Se verifica instalarea
NLSRTL.
SQL*Loader-00628 Character set conversion error.
Cauza: Eroare la conversia setului de caractere.
Actiune: Se contacteaza Oracle. Se verifica instalarea
NLSRTL.
SQL*Loader-00640 Variable length field was truncated.
Cauza: S-a intilnit sfirsitul unei inregistrari logice
inaintea terminarii unui cimp de lungime variabila. Lungimea
fiecarui cimp de lungime variabila este inclusa in cimp astfel
incit SQL*Loader stie cite date trebuie sa fie prezente.
Actiune:
Se
verifica
datele
pentru
o
trunchiere
necorespunzatoare si se verifica fisierul de control si
fisierul log cimpul poate incepe intr-un loc gresit.
SQL*Loader-00641 Invalid packed decimal nibble.
Cauza:
Fiecare
byte
(caracter)
dintr-un
cimp
zecimal
impachetat contine doua jumatati de octet. Fiecare jumatate de
octet trebuie sa aiba o valoare valida.
Actiune: Se verifica specificarile din fisierul de control si
fisierul log pentru a se asigura ca locatia s-a specificat
corect. Se verifica si contunutul cimpului.

SQL*Loader-00642 Relative start position > absolute field end


position.
Cauza: Un cimp specificat cu POSITION (*+n:y) are inceputul
dupa pozitia absoluta.
Actiune: Se verifica daca nu lipsesc delimitatorii si daca
valorile n si y sint corecte.
SQL*Loader-00700 Out of memory while performing essential
allocations
[number]
Cauza: SQL*Loader nu poate aloca memoria necesara.
Actiune: Se verifica sistemul de operare si
procesele din
memorie. Se creste memoria disponibila la cit e posibil.
Altfel, se asteapta pina cind memoria devine disponibila.
SQL*Loader-00702 Internal error - string
Cauza : Eroare interna.
Actiune: Se transmite numarul erorii la Oracle.
SQL*Loader-00703 Internal error: argument number
Cauza : Eroare interna.
Actiune: Se transmite numarul erorii la Oracle.
SQL*Loader-00704 Internal error: string [number]
Cauza : Eroare interna.
Actiune: Se transmite numarul erorii la Oracle.
SQL*Loader-00705 Internal error
Cauza : Eroare interna.
Actiune: Se transmite numarul erorii la Oracle.
SQL*Loader-00706 Bad argument to ulerr [number].
Cauza : Eroare interna.
Actiune: Se transmite numarul erorii la Oracle.
SQL*Loader-00707 Sql*Loader exiting with return code=[number].
Cauza : Eroare interna.
Actiune: Se transmite numarul erorii la Oracle.
SQL*Loader-00901 Error logging on to ORACLE:
Cauza: S-a facut o incercare de conectare la Oracle in mod
incarcare directa.
Actiune: Se asigura ca instanta este activa si ruleaza.
Pentru mai multe informatii, se verifica mesajele Oracle care
urmeaza acestuia in fisierul log.
SQL*Loader-00902 Error opening cursor: [number]
Cauza: Eroare interna.
Actiune: Se verifica mesajele Oracle din fisierul log si se
contacteaza Oracle.
SQL*Loader-00903 Database must be at least version
number.number.number.number.number for direct path
Cauza: Modul de incarcare directa sete folosit cu o baza de
date incompatibila.
Actiune: Se upgradeaza baze de date la versiunea specificata
sau se foloseste incarcarea directa.
SQL*Loader-00904 You cannot used the direct path when linked
with v5 of the
database
Este folosit modul incarcare directa dupa ce SQL*Loader a
fost laget cu o baza de date Versiune 5.
Actiune: Se foloseste incarcarea conventionala.
SQL*Loader-00905 Error parsing SQL statement for upi: [number]

Cauza: Este un mesaj din header.


Actiune: Se verifica mesajele care urmaza in fisierul log.
SQL*Loader-00906 Error executing SQL statement for upi:
[number]
Cauza: S-a intilnit o eroare interna.
Actiune: Se verifica mesajele care urmeaza in fisierul log.
SQL*Loader-00908 Unable to lock table string due to ORACLE
error number
Cauza: SQL*Loadr nu poate obtine o blocare DML exclusiva pe
tabela necasara.
Actiune: Se verifica mesajele care urmeaza in fisierul log.
Se verifica numele obiectului tabela in view-ul USER_OBJECTS.
Se foloseste comanda SQL*DBA MONITOR LOCK pentru a afisa toate
precesele cu blocari. Se identifica procesul care blocheaza
tabela. Se foloseste comanda MONITOR PRECESS pentru a gasi
cine este conectat la procesul Oracle care blocheaza, sau
simplu se asteapta si se reaia.
SQL*Loader-00909 Loader views must be loaded (as SYS) for
direct path to be
used
Cauza: Wiev-urile bazei de date necesare incarcarii directe
nu sint prezente.
Actiune: Se ruleaza ca utilizator SYS scripturile necesare.
SQL*Loader-00910 Error binding input variables for upi:
[number]
Cauza: Este un mesaj din header.
Actiune: Se verifica mesajele care urmeaza in fisierul log.
SQL*Loader-00911 Error defining output variable(s) for upi:
[number]
Cauza: Este un mesaj din header.
Actiune: Se verifica mesajele care urmaza in fisierul log.
SQL*Loader-00913 Error fetching results of select statement
(upi): [number]
Cauza: Este un mesaj din header.
Actiune: Se verifica mesajele care urmaza in fisierul log.
SQL*Loader-00914 Error locking table string in exclusive mode.
Cauza: Incarcarea directa nu poate bloca tabela.
Actiune: Se verifica mesajele caru urmeaza acestuia in
fisierul log. Se verifica drepturile si privilegiile necesare.
SQL*Loader-00915 Error closing cursor: [number]
Cauza: Este un mesaj din header.
Actiune: Se verifica mesajele care urmaza in fisierul log.
SQL*Loader-00916 Error checking path homogeneity
Cauza: Pentru o incarcare directa, cind front-end ul si
back-end ul bazei de date au sisteme hard separate,
sistemele trebuie sa fie identice, sa foloseasca aceeasi
masina, acelasi sistem de operare si set de caractere. Aceasta
se intilneste cind SQL*Loader detecteaza o diferenta intre
sisteme si impiedica incarcarea directa.
Actiune: Pentru aceasta configuratie se foloseste incarcarea
conventionala.
SQL*Loader-00918 The catalog must be loaded (as SYS) for
SQL*Loader to be
used

Cauza: Nu s-a incarcat catalogul.


Actiune: Se coecteaza ca utilizator SYS si se incarca
catalogul si view-urile din scriptul ULVIEW.sql.
SQL*Loader-00919 Error during upi fetch: [number]
Cauza: S-a intilnit o eroare interna.
Actiune: Se verifica mesajele care urmeaza in fisierul log.
SQL*Loader-00925 Error while string
Cauza: S-a intilnit o eroare interna.
Actiune: Se verifica mesajele care urmeaza in fisierul log.
Tabela sau coloana referita s-ar putea sa nu fie accesibile.
SQL*Loader-00926 OCI error while string for table string
Cauza: S-a intilnit o eroare OCI.
Actiune: Se verifica mesajele care urmeaza in fisierul log.
Tabela sau coloana referita s-ar putea sa nu fie accesibile.
SQL*Loader-00927 Table string does not exist
Cauza: SQL*Loader nu gaseste tabela specificata. Tabele
specificata s-ar putea sa nu existe. In unele sisteme, acest
mesaj poate apare cind nu sint acordate privilegiile necasare.
Actiune: Se verifica daca tabela exista, numele este scris
corect si s-au acordat privilegiile necesare.
SQL*Loader-00929 Error parsing insert statement for table
string.
Cauza: Fraza de inserare genereaza o eroare de analiza.
Actiune: Se verifica sirul QSL care a fost folosit.
SQL*Loader-00930 Error parsing insert statement for table
string column string.
Cauza: Fraza de inserare INSERT intr-o coloana genereaza o
eroare de analiza.
Actiune: Se verifica mesajele care urmeaza in fisierul log.
Se verifica sirul SQL folosit pentru acesata coloana.
SQL*Loader-00931 OCI error while binding variable for column
string in table
string
Cauza: S-a intilnit o erorra OCI.
Actiune: Se verifica erorile care urmeaza pentru mai multe
informatii. In sirul SQL penru aceasta coloana poate fi o
eroare.
SQL*Loader-00932 Could not truncate table string.
Cauza: S-a incercat trunchierea tabelei si a esuat.
Actiune: Se verifica erorile care urmeaza. Nu se intilneste
trunchierea
facuta
de
o
restrictie
referentiala
de
integritate.
SQL*Loader-00933 Specified file string not part of database
Cauza: Numele fisierului de date specificat sa incarce tabela
nu este un fisier baza de date.
Actiune: Se specifica un fisier de date valid.
SQL*Loader-00934 Incorrect data file string specified for
table string
Cauza: Un nume de fisier de date specificat sa incarce tabela
nu este un fiser din spatiul pentru tabela (tablespace) in
care rezida tabela.
Actiune: Se specifica un fisier de date valid.
SQL*Loader-00935 Error verifying required option for parallel
load.

Cauza: S-a intilnit o eroare deoarece o optiune ceruta nu a


fost gasita sau este invalida.
Actiune: Se corecteaza problema asa cum este descris in
mesajele Oracle insotitoare.
SQL*Loader-00936
Unable
to
lock
table
string
partition/subpartition string due to ORACLE error number
Cauze: SQL*Loader nu poate bloca partitia care ii este
necesara.
Actiune: Se solicita deblocarea partitiei de catre cel care o
tine blocata sau se asteapta si se reia.
SQL*Loader-00937 parallel load requested and string has
enabled triggers or
constraints
Cauza: S-a facut o cerere de incarcare paralela dar obiectele
care
se
incarca
au
active
restrictii
(de
verificare,
referentiale) si/sau declansatoare active.
Actiune: Sedezactiveaza restrictiile si/sau declansatoarele
si se reia incarcarea paralela.
SQL*Loader-00938 partition load requested and string has
enabled triggers or
constraints
Cauza: S-a facut o cerere de incarcare paralela a unei singure
partirtii, dar obiectele care se incarca au active restrictii
(de verificare, referentiale) si/sau declansatoare active.
Actiune: Sedezactiveaza restrictiile si/sau declansatoarele
si se reia incarcarea paralela.
SQL*Loader-00938 partition load requested and string has
enabled triggers or
constraints
SQL*Loader-00939 OCI error while string for table string
partition string
Cauza: Este o eroare header.
Actiune: Se verifica mesajele care urmeaza. Tabela sau
partitia referita poate sa nu fie accesibila.
SQL*Loader-00940 UPI error while setting NCHAR bind attributes
for column
string table string
Cauza: S-a intilnit o eroare cind s-a setat atributul
CHARSETFORM al unei coloane NCHAR.
Actiune: Eroare interna. Se raporteaza la Oracle.
SQL*Loader-00941 Error during describe of table string
Cauza: S-a intilnit o eroare cind s-a executat DESCRIBE sau
SELECT pe tabela data. Se verifica erorile cera preced aceasta
eroare.
Actiune: Se verifica daca numele tabelei si numele coloanelor
specificate in fisierul de control sint corecte.
SQL*Loader-00942 partition string not part of table string
Cauza:
Partitia
specificata
nu
este
parte
a
tabelei
specificate.
Actiune: Se verifica daca partitia specificata este corecta
(este o partitie interna a a tabelei).
SQL*Loader-00943 incorrect datafile string specified for table
string partition
string

Cauza: Fisierul de date specificat nu este in spatiul pentru


tabela (tablespace) al partitiei specificate. Aceasta erorare
se
intilneste
cel
mai
adesea
cind
se
foloseste
FILE=cuvint_cheie intr-o tabela partitionata. Cind se incarca
toate partitiile unei tabele partitionate, partitiile trebuie
sa fie in acelasi spatiu pentru tabele (tablespace). Cind se
incarca o singura partitie, spatiul pentru tabela (tablespace)
al partitiei care se incarca trebuie sa fie acelasi cu spatiul
pentru tabela in care rezida fiserul de date specificat.
Actiune: Se verifica daca fiserul de date specificat prin
FILE=cuvint_cheie este in spatiul pentru tabela al partitiei
care se incarca.

S-ar putea să vă placă și