الأربعاء، 8 أبريل 2009

درس عن الـ SQL LOADER



الـ SQL LOADER أداة تقوم بإحضار بيانات من ملف خارجي موجود على القرص الصلب إلى جدول موجود في قاعدة البيانات.
ما يلزمنا فعليا هو ملف يحوي البيانات التي نريد تحميلها إلى الجدول
data file , يجب أن يكون بصيغة معينة :
مثلا : نعتبر أن كل حقل مفصول عن الاخر بإشارة (,)
و ننعتبر كل سجل مفصول عن الاخر بواسطة سطر جديد
new line
مثال عن ملف
data file يحوي معلومات (رقم,اسم,البلد) :


كود

1,hussam,syr
2,
ahmad,KSA
3,
humam,UAE
4,
malek,syr

الملف الاخر الذي يلزمنا هو الـ control file الذي يخبر الـ oracle كيف سيقوم بتحميل هذه البيانات .
بعد ذلك سيقوم الـ
SQL Loader بإنشاء عمليات الـ insert اللازمة لتحميل البيانات إلى الجدول .

بعد التنفيذ سيقوم الـ
SQL Loader بإنشاء ملفين إضافيين هما الـ bad file الذي سيحوي بيانات عن الحقول التي لم يستطع الـ SQL Loader تحميلها إلى الجدول
الملف الثانس هو الـ
log file سيحوي على معلومات الحالة كعدد السجلات التي تمت معالجتها و عدد السجلات التي تم تحميلها إلى الجدول.

كتابة الـ control file :

كود

Load Data
Infile 'c:\emp01.dat'
TRUNCATE
Into table emp01
FIELDS TERMINATED BY ","
(
id,name,city)

الشرح :
Load data تعليمة ثابتة في كل control file
Infile ملف الذي يحوي البيانات
Badfile أين سينشئ الـ bad file
Into table اسم الجدول الهدف الذي سيخزن فيه بيانات الـ datafile
Fields TERMINATED BY “,” نخبر الـ SQL LOADER أن الحقول مفصولة عن بعضها بإشارة “,”

بالطبع يجب أن يكون لدينا الجدول
emp01 مسبقا الذي يملكه المستخدم scott مثلا ..

مراحل التشغيل :
نسجل الدخول إلى المستخدم
scott مثلا و ننشئ الجدول emp01

create table emp01(id number,name varchar(20),city varchar(20) ;

نقوم في البداية بإنشاء الـ datafile وليكن اسمه emp01.dat على القرص c و نضع فيه البيانات التالية :

كود

1,hussam,syr
2,
ahmad,KSA
3,
humam,UAE
4,
malek,syr

بعد ذلك ننشئ الـ control file و نسميه emp01.ctr مثلا و نكتب بداخه التعليمات :

كود

Load Data
Infile 'c:\emp01.dat'
TRUNCATE

Into table emp01

FIELDS TERMINATED BY ","
(
id,name,city)


نفتح محرر أوامر dos و نكتب :

كود

sqlldr scott/oracle control=c:\emp01.dat


إذا جرت الأمور على ما يرام سنرى الخرج التالي :


كود

C:\>sqlldr scott/oracle control=c:\emp01.ctr

SQL*Loader: Release 10.1.0.2.0 - Production on Mon Nov 27 21:08:17 2006

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Commit point reached - logical record count 3

Commit point reached - logical record count 4

C:\>


و نرى أنه قد تم إنشاء ملف
emp01.log الذي تحدثنا عنه سابقا .. و إذا حدثت أخطاء يتم إنشاء ملف الـ bad

نعود إلى الـ
sqlplus و نستعلم عن الجدول emp01

كود

Select * from emp01


سنرى البيانات السابقة أصبحت موجودة في الجدول ..


إذا طبقنا المثال السابق نلاحظ أنه بعد كل تنفيذ لـ
sqlldr سوف يتم حذف بيانات الجدول و تحميل البيانات الجديدة من الملف ..

يمكننا الابقاء على البيانات القديمة و ذلك باستخدام
append بدلا ً من Truncate في ملف الـ control
أي يصبح بالشكل :

كود

LOAD DATA
INFILE ‘emp01.dat
APPEND
INTO TABLE EMP01
FIELD TERMINATED BY “,”
(
id,name,city)


أعد تنفيذ المثال و استعلم عن اجدول emp01 .. ستلاحظ اضافة البيانات الجديدة مع الإحتفاظ بالبيانات القديمة ..
سأقوم بعرض بعض الأمثلة عن الـ
control file :

مثلا :

كود

load data
infile *
replace
into table departments
( dept position (02:05) char(4),
deptname position (08:27) char(20)

)
begindata
COSC COMPUTER SCIENCE
ENGL ENGLISH LITERATURE
MATH MATHEMATICS
POLY POLITICAL SCIENCE

وضعنا هنا الـ infile * لأن البيانات موجودة في نفس الـ control file بعد الـ begin data .

حددنا له أن يقرأ المحارف من 2 لى 5 للحقل
dept
و من 8 إلى 27 للحقل
deptname

بعد التنفيذ و الاستعلام عن الجدول departments يجب أن نرى الخرج التالي:

كود

DEPT DEPTNAME
---- --------------------
OSC MPUTER SCIENCE
NGL GLISH LITERATURE
ATH THEMATICS
OLY LITICAL SCIENCE


مثال عن تحميل البيانات من أكثر من
data file

كود

LOAD DATA
INFILE file1.dat
INFILE file2.dat
INFILE file3.dat
APPEND
NTO TABLE emp
(
empno POSITION(1:4) INTEGER,
ename POSITION(6:15) CHAR,
deptno POSITION(17:18) CHAR,
mgr POSITION(20:23) INTEGER
)


مثال عن اختيار أسطر التي تحقق شرط معين لتحميلها إلى الجدول :


كود

LOAD DATA
INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'
APPEND
INTO TABLE my_selective_table
WHEN (01) <> 'H' and (01) <> 'T' and (30:37) = '20031217'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)


إذا كان الحرف الأول ليس H و ليس T و المحارف من 30 إلى 37 لا تساوي '20031217'

مثال عن تحميل البيانات إلى أكثر من جدول :

كود

LOAD DATA
INFILE *
REPLACE
INTO TABLE emp
WHEN empno != ' '
(
empno POSITION(1:4) INTEGER EXTERNAL,
ename POSITION(6:15) CHAR,
deptno POSITION(17:18) CHAR,
mgr POSITION(20:23) INTEGER EXTERNAL
)
INTO TABLE proj
WHEN projno != ' '
(
projno POSITION(25:27) INTEGER EXTERNAL,
empno POSITION(1:4) INTEGER EXTERNAL
)

هنا نكتب البيانات في الجدول emp إذا لم نترك مكان الـ empno فارغ.(المحارف من 1 إلى 4)
و نكتب البيانات إلى الجدول
proj إذا لم نترك مكان الـ projno فارغ المحارف من (25 : 27)

يمكننا معالجة الأسطر في الـ
control file قبل أن تدخل هذه الأسطر إلى الجدول

مثال :

كود

LOAD DATA
INFILE *
INTO TABLE modified_data
(
rec_no "my_db_sequence.nextval",
region CONSTANT '31',
time_loaded [b]"to_char(SYSDATE, 'HH24:MI')",
data1 POSITION(1:5) ":data1/100",
data2 POSITION(6:15) "upper(:data2)",
data3 POSITION(16:22)"to_date(:data3, 'YYMMDD')"
)
BEGINDATA
11111
aaaaaaaaaa991201
22222
bbbbbbbbbb990112


عند إدخال السطر الجديد سوف يأخذ الـحقل
rec_no قيمته من الـ sequence اسمه my_db_sequence في حال عدم وجوده يولّد خطأ
في حقل الـ
region سوف نخزن قيمة ثابتة CONSTANT هي 31 لكل الحقول
الـ
time_load سوف نخزت الوقت الحالي SYSDATوغيرنا الـ format إلى الشكل 'HH24:MI'
الـ
data1 سوف تأخذ أول خمس محارف كرقم و تقسم الحقل على 100 قبل إدخاله إلى الجدول :data1/100
(لاحظ أننا استخدمنا نقطتين : بالإضافة إلى اسم الحقل عندما نريد التعامل مع هذه القيمة)
الـ
data2 تقرأ المحارف من 6 إلى 15 و تحولها إلى UPPERCASE قبل إدخالها upper(:data2)
أيضا الـ
data3 سوف تقرأ المحارف من 16 إلى 22 و تحولها إلى تاريخ to_date غيرنا تنسيقها إلى 'YYMMDD'


بقي أمر أخير ..
لاحظنا في الـ
control file أننا استخدمنا للإدخال أحد الأوامر :TRUNCATE,APPEND,INSERT
إليكم الفرق بين كل عبارة

TRUNCATE تقوم بعمل TRUNCATE للجدول قبل أن تدخل البيانات إليه ... يب أن نكون حذرين مع هذا الخيار لكي لا نخسر بيانات الجدول . لأن تعليمةTable TRUNCATE لا نستطيع التراجع عنها أي لا نستطيع عمل Rollback
Append : تقوم بإضافة البيانات إلى الجدول .
INSERT : تضيف البيانات إذا كان الجدول فارغ فقط ... , إلا عملية التحميل سوف تلغى
Replace : إزالة بيانات الجدول و إضافة البيانات الجديدة ... المستخدم يجب أن يكون لديه صلاحية الحذف .

هذا ما استطعت أن أشرحه لكم ... أتمنى من المشرف التدقيق و توضيح الأمور الغامضة و إضافة على الدرس إذا كان هنا نقص ..

و أتمنى من كل قلبي تفاعل الأعضاء و إغناء الموضوع لأن الموضوع و الله أعلم يعتبر من الأمور الهامة في أوراكل ..

تخيل لو أن لديك آلة لتسجيل دوام الموظفين أو آلة لقراءة البار كود ... هذه الآلة لن تكتب إلى قاعدة المعطيات فورا ... سوف تكتب لملف بصيغة معينة ... بواسطة الـ
SQL LOADER سوف نتمكن من تحميل هذه البيانات إلى الجدول المناسب .

ليست هناك تعليقات:

إرسال تعليق

Powered By Blogger