الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس عن ال SQL LOADER

مثبّت
بدأه malek_sa في 27 نوفمبر 2006 · 12 رد · 12,983 مشاهدة · في قسم إدارة قاعدة البيانات أوراكل
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الـ 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;

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

اتمنى أن تكون الفكرة واضحة …

SCJP 5.0

#2

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

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

أي يصبح بالشكل :

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

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

SCJP 5.0

#3

* جــــــزاك الله خيـــــرا

* بس أحتمال يكون سؤال غبي ما هـــــــــو append

خطوة ..نحو نهضة تقنية

congfrance%20banner.gif

#4

أهلا أخي Kharboush و شكرا على اهتمامك ..

كما ذكرت أن TRUNCATE تقوم بحذف البيانات من الجدول و استبدالها بالبيانات الموجودة في الملف data

أما APPEND فتقوم بإضافة البيانات الموجودة في الملف data إلى الجدول دون أن تحذف البيانات القديمة ...

يمكنك أن تقول أن append تعني (إلحاق,إضافة) .....

SCJP 5.0

#5

الله يعطيك العافية أخي malek .. بإنتظار الإكمال ...

#6

أخواني ... أتمنى أن لا تكونوا قد مللتم من هذا الدرس ..

سأقوم بعرض بعض الأمثلة عن الـ 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)

يتبع إن شاء الله

تم تعديل هذه المشاركة بواسطة malek_sa في 29 نوفمبر 2006 في 00:50

SCJP 5.0

#7

أخيرا ً وليس آخرا ً ..

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

مثال :

LOAD DATA
INFILE *
INTO TABLE modified_data
( rec_no "my_db_sequence.nextval",
region CONSTANT '31'</FONT>,
time_loaded "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
11111aaaaaaaaaa991201
22222bbbbbbbbbb990112

عند إدخال السطر الجديد سوف يأخذ الـحقل 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 سوف نتمكن من تحميل هذه البيانات إلى الجدول المناسب .

ملاحظة : لم أضع هذا الدرس في دورة قواعد البيانات لأن المشرف مقدرته أفضل بكثير لتقديم هذا الدرس بطريقة أفضل ...

SCJP 5.0

#9

يعطيك العافية

شرح رائع

اللهم اني اسألك

علما نافعا

وعملا متقبلا

ورزقا طيبا

12.gif

4.gif

#10

مشكوووووووووووووووووووووووووووور

ويعطيك العـــــــــــــــــــــــــــــــافية

#11

Replication

مشكووووووووووووووووووووووووووور

#12

,,Hi dude

sorry for English typing, but currently i am in India

..and i don't have arabic keyboadr

thank you so much for this topic

I have now Oracle 10G course here in India

:My question is

what does rplace do in this part of code

load data"

infile *

replace

"into table departments

Thanks and regards

,,Abo Thabet

تم تعديل هذه المشاركة بواسطة شيخ البرمجة في 30 ديسمبر 2007 في 20:36

#13

اشكرك على هذا الموضوع واتمنى االاستمرار في دروس الاوراكل وخاصة انني مبتدا به ارجو ارسال المزيد من اساسيات وطرق برمجة بالاوراكل

كل الاحترام والتقدير لك

مواضيع مشابهة