الانتقال إلى المحتوى

الحل الأمثل والبديل الكامل لاستخدام Sql Loader بإنشاء Dynamic Table


Ahmad.Hasan

Recommended Posts

السلام عليكم ورحمة الله وبركاته،،،

بعد البحث المطول في حل مشكلة قراءة Sqlldr.exe من الـ Client على السيرفر توصلت لحل أفضل وهو كالتالي:

1- الملف الموجود فيه البيانات لدي من نوع Csv.

2- قمت بإنشاء Directory على السيرفر كالتالي:

Create Or Replace Directory Ora_Dir As 'D:\'



3- قمت بإنشاء External Table، حيث يتم تحديد اسم الـ Directory وإسم الـ File ليقوم بإدخال بيانات الملف في الجدول بعمود واحد فقط ويفصل بين البيانات فاصلة منقوطة كالتالي:



Create Table Staging
  (Col1  Varchar2(4000))
Organization External
(
  Type Oracle_Loader
  Default Directory Ora_Dir
  Access Parameters
  (
	 Records Delimited By NewLine
	Logfile 'staging.log'
	Fields Ldrtrim
	Missing Field Values Are Null
	Reject Rows With All Null Fields
	("COL1" Char(4000))
 )
 Location ('Stc_File.Csv')
  )Reject Limit Unlimited
  /



4- قمت بإنشاء Procedure يقوم على أخذ الـ Column Heading من الملف ويناءا على أسماء الأعمدة يتم إنشاء جدول ويأخذ إسم الجدول المراد انشاؤه و إسم الملف ونوع Delimiter وأي Parameters أخرى تلزمك في الكود، حيث أن الجدول الذي سيتم إنشاؤه اسمه

Import_Stc_Daily_Reports_Tbl



كالتالي:



Create Or Replace Procedure Sale.Create_Source_Tab (P_Filename    In Varchar2,
                                                   P_Delim       In Varchar2,
                                                   P_Tablename   In Varchar2,
                                                   P_Import_Id   In Number,
                                                   P_Import_Date In Date,
                                                   P_User_Id     In Varchar2)
   As
     V_Sql        Varchar2 (32767);
     V_Inser      Varchar2 (32767);
     V_Count      Number;
     Vn_Counter   Number := 1;
     Vn_Col_Count Number := 0;
  Begin
   If Upper(P_Tablename) = Upper('Import_Stc_Daily_Reports_Tbl') Then
    Execute Immediate 'alter table staging location (''' || P_Filename || ''')';

    Select 'create table ' || P_Tablename || '(rn,'
            || Replace (Col1, P_Delim, ',')
            || ') as select * from (select rownum rn'
     Into   V_Sql
     From   Staging
    Where  Rownum = 1;

    Select Length(Col1) - Length(Replace(Col1, P_Delim, '')) + 1
      Into V_Count
      From Staging
     Where Rownum = 1;

    For I In 1 .. V_Count Loop      
       V_Sql := V_Sql ||
         ',substr
            (''' || P_Delim || ''' || col1 || ''' || P_Delim || ''',
             instr (''' || P_Delim || ''' || col1 || ''' || P_Delim || ''', '''
           || P_Delim || ''', 1, ' || I || ') + ' || Length (P_Delim) || ',
             instr (''' || P_Delim || ''' || col1 || ''' || P_Delim
           || ''', ''' || P_Delim || ''', 1, ' || To_Char (I + 1) || ')
             - instr (''' || P_Delim || ''' || col1 || ''' || P_Delim || ''', '''
           || P_Delim || ''', 1, ' || I || ')
             - ' || Length (P_Delim) || ')';
    End Loop;

    V_Sql := V_Sql || ' from staging) where rn > 1';

    Execute Immediate V_Sql;
   
     V_Inser:=  'Insert Into  Import_Stc_Daily_Reports_Dtl (Serial_No, Import_Id, Import_Date, Employee_Name, Employee_Login, Employee_Position,
                                                            Division_Organization_Name, Product_Line, Product, Parent_Product, Product_Alias_Name,
                                                            Device_Product, Product_Atm_Type, Service_Type, Order_Number, Order_Type_I, Order_Sub_Type_I,
                                                            Order_Date, Sim_Number, Serial_Number, Primary_Multiline_Number, Status_I, Order_Status_I,
                                                            Order_Status, Order_Type, Order_Sub_Type, Account_Number, Account_Type_I, Company_Id_Type_I,
                                                            Account_Sub_Type_I, Account_Sub_Type, Tamayoz_Type, Tamayoz_Type_I,
                                                            Commercial_Registration_Number, Avg_Usage, Customer_Value, Account_Type, Company_Id_Type,
                                                            Customer_Age_Value, City, Payment_Value, Net_Price, Start_Price, Action_Type_I, Action_Type,
                                                            Current_Billing_Account_Number, Nationality, Full_Name, Middle_Name, First_Name, Last_Name)'||
                                                    'Select Rn'|| ',' || P_Import_Id || ',''' || P_Import_Date || ''',' ||'Employee_Name, Employee_Login, Employee_Position,
                                                            Division_Organization_Name, Product_Line, Product, Parent_Product, Product_Alias_Name,
                                                            Device_Product, Product_Atm_Type, Service_Type, Order_Number, Order_Type_I, Order_Sub_Type_I,
                                                            Order_Date, Sim_Number, Serial_Number, Primary_Multiline_Number, Status_I, Order_Status_I,
                                                            Order_Status, Order_Type, Order_Sub_Type, Account_Number, Account_Type_I, Company_Id_Type_I,
                                                            Account_Sub_Type_I, Account_Sub_Type, Tamayoz_Type, Tamayoz_Type_I,
                                                            Commercial_Registration_Number, Avg_Usage, Customer_Value, Account_Type, Company_Id_Type,
                                                            Customer_Age_Value, City, Payment_Value, Net_Price, Start_Price, Action_Type_I, Action_Type,
                                                            Current_Billing_Account_Number, Nationality, Full_Name, Middle_Name, First_Name, Last_Name
                                                     From '||P_Tablename;                                                      
     Execute Immediate V_Inser;
     --Dbms_Output.Put_Line (V_Inser);                                                                      
     Commit;
     
     Execute Immediate 'Drop Table '||P_Tablename;
   End If;      
  End Create_Source_Tab;
/



5- لغاية هذه المرحلة يمكنك تحميل الملف من خلال التود أو Sql Plus.

6- إذا أردت تشغيل الكود من خلال الفورم فاستخدم الـ Web-util لعمل Browse للملف المطلوب ويجب نقل الملف من جهاز الكلينت الى السيرفر وتحديدا على الـ Directory الذي تم إنشاؤه سابقا، إذا كنت تستخدم AS فاستخدم الكود التالي:

Webutil_File_Transfer.Client_To_AS('C:\\Stc_File.Csv', '\\10.1.70.186\d\Stc_File.Csv');



وإذا لا يوجد لديك AS فابمكانك استخدام :

Client_Host('Cmd.exe /C Copy C:\Stc_File.Csv \\10.1.70.186\D\Stc_File.Csv');



ولغاية هذه النقطة تم نقل الملف من الكلينت الى السيرفر.

7- نأتي الآن لعمل Execute للبروسيجر:

Create_Source_Tab(/*Substr(:Blk_1.File_Name, 4)*/'Stc_File.Csv', ';', 'Import_Stc_Daily_Reports_Tbl', :Blk_1.Import_Id, :Blk_1.Import_Date, :Global.User);



بامكانك تمرير إسم الملف مباشرة أو بعد عملية الـ Browse وضع إسم الملف في Variable وتمريره في البروسيجر.

8- بعد الإنتهاء من عملية الـ Import بامكانك حذف الملف من السيرفر كالتالي:

Client_Host('Cmd.exe /C Del \\10.1.70.186\D\Stc_File.Csv'); 



* ملاحظة 1: يجب تمرير إسم الملف فقط في البروسيجر يعني لو عملت Browse واعطاك إسم الملف مع الـ Path يجب تمرير إسم الملف فقط ويمكنك استخدام Substr او الطريقة التي تناسبك.
* ملاحظة 2: الـ Column Headings يجب أن تكون على صيغة Employee_Name، يعني في حال كان Label العمود من أكثر من كلمة يجب إستبدال المسافة التي بين الكلمتين بـ ( _ ).

أتمنى أن أكون قد وفقت في شرح الموضوع بطريقة واضحة.

التوفيق للجميع.

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله

الأخ الفاضل / احمد

كما عودتنا دائما ... تأتى بكل ما هو جديد ومفيد للأخوة الأعضاء
مع اسلوب وطريقة عرض سهلة وواضحة بالأمثلة

جزاك الله خيرا على هذا الجهد المتميز

تقبل تحياتي

رابط هذا التعليق
شارك

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

تم تعديل بواسطة scince
رابط هذا التعليق
شارك


السلام عليكم ورحمة الله

الأخ الفاضل / احمد

كما عودتنا دائما ... تأتى بكل ما هو جديد ومفيد للأخوة الأعضاء
مع اسلوب وطريقة عرض سهلة وواضحة بالأمثلة

جزاك الله خيرا على هذا الجهد المتميز

تقبل تحياتي


جزاك الله كل خير أخي أمجد..
وشكرا جزيلا لك..
رابط هذا التعليق
شارك


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


أشكرك أخي ميهال على مرورك الكريم..
رابط هذا التعليق
شارك

  • بعد 3 شهور...
  • بعد 3 أسابيع...
  • بعد 1 سنة...

السلام عليكم  ، اريد مساعدة في
تصدير بيانات ملفات من النوع txt حيث تٌنتج من بعض
التطبيقات الاخرى وعندما استخدم loader في تصدير
داخل قاعدة اوراكل ، فأن ال loader  يقوم بتسجيلها
في ال Table  بتقسيمها على اكثر من سجل مع العلم بأن
بيانات الملف سجل واحد

السؤال هو : كيف يمكن تجنب هذة المشكله وتسجيل
بيانات تلك الملف على سجل واحد

2- هل من وسيلة تستخدم في الاوراكل لتصدير بيانات
من اكثر من ملف على نفس folder  الى قاعدة البيانات
بدون تدخل من المستخدم (بطريقة اتوماتيكية).

ولكم جزيل الشكر والعرفان (مرفق ملف من نوعية
هذة البيانات)


 

رابط هذا التعليق
شارك

  • بعد 2 أسابيع...

 

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

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

 

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته

اريد مساعدة في الاتي:

1- تصدير البيانات من الملف بمجرد حفظ الملف على الـ folder 

2- هذة العملية سيتم تكرارها يوميا وبعدد من المرات (في نهاية اليوم  أو بمجرد حفظ الملف في الـ folder   )

3- هذا الملف متكرر ويوميا وليس بنفس الاسم ولكن بأسماء مختلفة ولكنهم بنفس التنسيق

4- تنفيذ هذة العملية اتوماتيكية بدون تدخل المستخدم

 

مرفق عدد  من الملفات المراد تصدير بياناتها الى قاعدة البيانات في table  مكون من one column وعدد حروفة varchar2(4000)h

 

أرجو المساعدة للضرورة القصوى  ولكم جزيل الشكر والعرفان مع العلم بانه كلما صدرته بال sqlloader  فإنه يسجله فى ال table  على اكثر من سجل ولكني اريدة كل ملف على حدة كسجل واحد فقط

واليك نسخة من بعض بيانات الملفات وهي كالاتي:

وهذا أول ملف

T51G773392015750001821NOV131328 SV065SAUDI ARABIAN AIRLINES 23NOV13D9DAE7E93AC2

7IM17IM190201996 XQBPFM 65M1MANAHAG20NOV1300121NOV13007

EGP0000003990002EGP00000000 00000000 00000000 00000000 00000000 000000000300 -SVI2EG1213

NNNYN5NNYAYH NNNX EG

000000002000002001000001000001001000001000000000

A02IBRAHEM/MOHAMEDJABERMR 325516997353506545256501 ADT 01 N

TL:23NOV13C35:N

A02NOHA/MAHMOUDAWARAMRS 325516998313506545256601 ADT 01 N

TL:23NOV13C35:N

A0401SV065SAUDI ARABIA 316Q HK23NOV1700 1950 2CAICAIRO MEDMADINAH IN O0 320 T1 00641F TK:YJT:01.50ANL:SAUDI ARABIAN AIRLINES

A0403SV065SAUDI ARABIA 303T HK28NOV1715 1830 2JEDJEDDAH CAICAIRO IN O0 772 S 00769F TK:YJT:02.15ANL:SAUDI ARABIAN AIRLINES

A0502 ARNK

A0701EGP 1995.00EGP 2698.00 EGPT1: 100.00EGT2: 7.00EQT3: 596.00XT

IT: 50.00JK 140.00QH 150.00XK 11.00XL 151.00IO 94.00UR

A080101QRTSVR 0000000023NOV1323NOV13 F:QRTSVR E:NON ENDORSABLE PLZ VISIT E:SAUDIAIRLINES.COM/TERMS B:2PC

A080103TRTSVR 0000000028NOV1328NOV13 F:TRTSVR E:NON ENDORSABLE PLZ VISIT E:SAUDIAIRLINES.COM/TERMS B:2PC

A09010CAI SV MED 150.69 /-JED SV CAI 138.38 NUC289.07END ROE6.90127

XT 50.00JK140.00QH150.00XK11.00XL151.00IO94.00UR

A11S 5396.00N

A12CAIT *DAR ALSALAM TOURS 01001314753

A14VL-140020NOVMUCRM1AYQFCE9

 

 

هذا هو بيانات الملف الثاني:

T51G773392016160000314NOV130835 SV065SAUDI ARABIAN AIRLINES 14NOV13D9DAE7E93AC2

7IM17IM190201996 R9ZKLY 3l31AHNAHAG06NOV1300813NOV13026

EGP0000002828002EGP00000000 00000000 00000000 00000000 00000000 000000000000

NYNYN5YNYAYH NNNX EG

000000001000002001000001001001001000001000000000

A02GABR/MOHAMEDHOUSSAMELDINMR 317264097823506543605301 ADT 0101N

TL:14NOV13C35:N

A0401SV065SAUDI ARABIA 316I HK14NOV1710 2000 2CAICAIRO MEDMADINAH IN O0 772 T1 00641F TK:YJT:01.50ANL:SAUDI ARABIAN AIRLINES

A0403SV065SAUDI ARABIA 303I HK18NOV1715 1830 2JEDJEDDAH CAICAIRO IN O0 333 S 00769F TK:YJT:02.15ANL:SAUDI ARABIAN AIRLINES

A0502 ARNK

A0701EGP 2828.00EGP 2839.00 EGPT1: 11.00XL

A080101INATDAY 0000000014NOV1314NOV13 F:INATDAY E:NON ENDORSABLE PLZ VISIT E:SAUDIAIRLINES.COM/TERMS B:2PC

A080103INATDAY 0000000018NOV1318NOV13 F:INATDAY E:NON ENDORSABLE PLZ VISIT E:SAUDIAIRLINES.COM/TERMS B:2PC

A09010CAI SV MED//JED M204.88INATDAY SV CAI 204.88INATDAY NUC409.76

END ROE6.90127END ROE6.90127 XT PD7.00EQ PD596.00XT

A100106NOV139020199 CAI S A

TI:0655065436024613

EGP000004040.00 T1: 100.00EGT2: 7.00EQT3: 596.00XTT4: T5: 000004743.00000000000000

A11S 11.00N P:01

A12CAIT * DAR ALSALAM TOURS 0502313626 REF AHMED

A14VL-084813NOVMUCRM1AYU3MGG

 

 

وهذا هو بيانات الملف الثالث

 

T51G773392016010001016NOV131226 MS077EGYPTAIR 15NOV13D9DAE7E93AC2

7IM17IM190201996 ZH7HW8 hg51AHNAHAG03NOV1301316NOV13050

EGP0000004025002EGP00000000 00000000 00000000 00000000 00000000 000000000000

NYNYN5YNYAYH NNNX EG

000000001000002001000001001001001000001000000000

A02GABR/HOUSSAMELDINMR 320225171803506543607501 ADT 0101N

TL:15NOV13C35:N

A0401MS077EGYPTAIR 677C HK15NOV1550 1840 2CAICAIRO MEDMADINAH INM O0 320 T3 00641F TK:YJT:01.50ANL:EGYPTAIR

A0403MS077EGYPTAIR 672Z HK18NOV1830 1950 2JEDJEDDAH CAICAIRO INM O0 330 N 00769F TK:YJT:02.20ANL:EGYPTAIR

A0502 ARNK

A0701EGP 4025.00EGP 4336.00 EGPT1: 300.00CPT2: 11.00XL

A080101CRSEG 00000000 F:CRSEG E:DEPARTURE-ARRIVAL FOR E:MADINAH AND JEDDAH FROM B:2PC

A080103ZREEG 0000000018NOV1318NOV13 F:ZREEG E:DEPARTURE-ARRIVAL FOR E:MADINAH AND JEDDAH FROM B:2PC

A09010CAI MS MED 322.40CRSEG /-JED MS CAI 260.82ZREEG NUC583.22END

ROE6.90127END ROE6.90127

A100114NOV139020199 CAI S A

TI:077506543606213

EGP000004025.00 T1: T2: T3: T4: T5: 000004025.00000000000000

A11S 311.00N P:01

A12CAIT * DAR ALSALAM TOURS 0502313626 REF AHMED

A14VL-120216NOVMUCRM1A7TSSHR

 

 

 

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية