Φορτώνοντας ογκώδη δεδομένα στην Oracle



Γενικά

Για να φορτώσουμε ογκώδη δεδομένα στην Oracle, χρειαζόμαστε ένα αρχείο ελέγχου, το οποίο καθορίζει τον τρόπο με τον οποίοι τα δεδομένα θα φορτωθούν, ένα αρχείο δεδομένων, το οποίο καθορίζει ποια δεδομένα θα φορτωθούν.


Κατασκευάζοντας το αρχείο ελέγχου

Ένα απλό αρχείο ελέγου έχει την ακόλουθη μορφή:

LOAD DATA
INFILE <dataFile>
APPEND INTO TABLE <tableName>
FIELDS TERMINATED BY '<separator>'
(<list of all attribute names to load>)

Παρακάτω παρουσιάζουμε ένα παράδειγμα αρχείου ελέγχου (test.ctl):

LOAD DATA
INFILE test.dat
INTO TABLE test
FIELDS TERMINATED BY '|'
(i, s)


Κατασκευάζοντας το αρχείο δεδομένων

Κάθε γραμμή στο αρχείο δεδομένων αντιστοιχεί σε μια ν-άδα που θα αποθηκευτεί στον πίνακα <tablename>. Η κάθε γραμμή περιέχει δεδομένα, για την αντίστοιχη στήλη του΄πίνακα <tablename>, με τη σειρά που αυτά ορίζονται στο αρχείο ελέγχου, και τα οποία χωρίζονται μεταξύ τους με τον χαρακτήρα <seperator>. Για παράδειγμα για το αρχείο test.dat που είδαμε παραπάνω :

1|foo
2|bar
3| baz

Η λίστα ιδιοτήτων του αρχείου test.ctl είναι η (i, s) όπου i είναι τύπου int και s είναι τύπου char(10). Στον πίνακα test θα αποθηκευτούν οι δυάδες :

(1, 'foo')
(2, 'bar')
(3, ' baz')

Προσοχή:  Η τρίτη γραμμή του αρχείου test.dat έχει ένα κενό μετά τον χαρτακτήρα  "|". Αυτό το κενό δεν αγνοείται και η τιμή που αποθηκευτεί στον πίνακα για την στήλη s θα είναι η ' baz', ένα string με 4 χαρακτήρες με  πρώτο χαρακτήρα το κενό. Είναι κοινό λάθος να νομίζουμε ότι η Oracle θα αγνοήσει το κενό και θα εισάγει στον πίνακα το 'baz', ένα string με 3 χαρακτήρες. Αυτό μπορεί να οδηγήσει σε πολλά προβλήματα αργότερα που θα τα αντιληφθούμε όταν κάνουμε ερώτηση στη βάση γιατί ' baz' και 'baz' είναι διαφορετικά string.

Προσοχή: Η Oracle θεωρεί ότι κάθε γραμμή του αρχείου είναι και μια ν-άδα. Ακόμη και μια κενή γραμμή. Παρόλα αυτά όμως, όταν προσπαθήσει να ανακτήσει δεδομένα από μια κενή γραμμή, τότε εμφανίζει μήνυμα λάθους. Μερικοί κειμενογράφοι έχουν την ιδιότητα να προσθέτουν κενές γραμμές στο τέλος ενός αρχείου, γεγονός που πρέπει να αποφύγουμε.


Φορτώνοντας τα δεδομένα

Το πρόγραμμα που χρησιμοποιεί η Oracle για να εισάγει μαζικά δεδομένα με τον τρόπο που περιγράψαμε παραπάνω λέγεται sqlldr. H εντολή αυτή είναι επιπέδου UNIX και θα είναι προτιμότερο να την εκτελούμε από το UNIX shell του συστήματος μας, παρά μέσα από την sqlplus. Μια τέτοια εντολή έχει την ακόλουθη σύνταξη:

sqlldr userid=<yourName>/<yourPasswd> control=<ctlFile> log=<logFile>

Στην παραπάνω σύνταξη <yourName> είναι το login που έχετε για να συνδέεστε με την Oracle και <yourPasswd> είναι το password. Ο πιο ασφαλής τρόπος για να χρησιμοποιήσετε την sqlldr είναι να αφήσετε το σύστημα να ζητήσει το password και να μη το δώσετε αρχικά με το login. <ctlFile> είναι το όνομα του αρχείου ελέγχου. Αν δε δοθεί προέκταση του αρχείου τότε το σύστημα θα υποθέσει ότι έχει την προέκταση ".ctl". Το όνομα του αρχείου δεδομένων δε δίνεται από τη γραμμή διαταγών, αφού προσδιορίζεται στο αρχείο ελέγχου. Τέλος μπορούμε να καθορίσουμε για αρχείο log το <logFile>. Αν δε δόσουμε προέκταση του αρχείου θα υποτεθεί ότι είναι ".log". Το πρόγραμμα sqlldr θα γεμίσει το αρχείο με πληροφορίες σχετικά με τη διαδικασία της φόρτωσης, όπως ο αριθμός των ν-άδων που αντιγράφηκαν και ο αριθμός των λαθών που έγιναν.

Για παράδειγμα έστω ότι ο χρήστης group20 με password qwerty θέλει να εκτελέσει το αρχείο ελέγχου test.ctl και να αποθηκεύσει τις πληροφορίες σχετικά με την φόρτωση στο αρχείο test.log. O χρήστης αυτός πρέπει να γράψει:

sqlldr userid=group20/qwerty control=test.ctl log=test.log

Υπενθύμιση: Πριν εκτελέσετε κάποια από τις εντολές της Οracle slplus ή sqlldr πρέπει πρώτα να εγκαταστήσετε το κατάλληλο περιβάλλον με τις εντολές:

setenv ORACLE_HOME /opt/Oracle8i
setenv PATH ${PATH}:ORACLE_HOME/bin
source .coraenv


Φορτώνοντας χωρίς ξεχωριστό αρχείο δεδομένων

Είναι δυνατόν να χρησιμοποιείσετε μόνο το αρχείο ελέγχου για να φορτώσετε δεδομένα, αντί να χρησιμοποιείτε ξεχωριστό αρχείο δεδομένων. Εδώ δίνεται ένα παράδειγμα:

LOAD DATA
INFILE *
INTO TABLE test
FIELDS TERMINATED BY '|'
(i, s)
BEGINDATA
1|foo
2|bar
3| baz

Το κόλπο είναι να καθορίσετε ως όνομα αρχείου δεδομένων το "*", και να χρησιμοποιείσετε τον όρο BEGINDATA για να ξεκινήσει το κομμάτι δεδομένων στο αρχείο ελέγχου.


Φορτώνοντας δεδομένα τύπου ημερομηνίας

Τα δεδομένα τύπου DATE μπορούν να έχουν φορτωμένα τα δεδομένα τους σε ένα format που θα καθορίσετε εσείς και θα έχει την απαιτούμενη ευελιξία. Πρώτα, υποθέστε ότι έχετε να δημιουργήσετε μια σχέση μα μια ιδιότητα τύπου DATE:

CREATE TABLE foo (
i int,
d date
);

Στο αρχείο ελέγχου, όταν περιγράφετε τισ ιδιότητες της foo που φορτώνεται, πρέπει να ακολουθείται η ιδιότητα d από τον τύπο της DATE και μια date mask. Η date mask καθορίζει την μορφή που θα χρησιμοποιήσουν τα δεδομένα τύπου ημερομηνίας. Είναι μια συμβολοσειρά που περικλείεται από εισαγωγικά (quotes) με τους ακόλουθους συμβιβασμούς:

Εδώ είναι ένα παράδειγμα αρχείου ελέγχου:

LOAD DATA
INFILE *
INTO TABLE foo
FIELDS SEPARATED BY '|'
(i, d DATE 'dd-mm-yyyy')
BEGINDATA
1|01-01-1990
2|4-1-1998

Παρατηρείστε ότι όπως φαίνεται από τη δεύτερη ν-αδα παραπάνω, ένα πεδίο μπορεί να είναι πιο μικρό από το αντίστοιχο πεδίο στη μάσκα δεδομένων (data mask). Η στίξη "-" λέει στον φορτωτή ότι τα πεδία ημέρας και μήνα της δεύτερης ν-αδας τερματίζονται νωρίτερα.