الجداول الخارجية Oracle: تخطيط الملفات المسطحة المتقدمة

StackOverflow https://stackoverflow.com/questions/898872

  •  23-08-2019
  •  | 
  •  

سؤال

أتمنى إنشاء جدول خارجي في قاعدة بيانات Oracle، واستراد بياناتها من ملف مسطح على الخادم. تنسيق هذا الملف غير تافهة. يمكن أن يكون كل سطر في هذا الملف واحدا من عدة تخطيطات مختلفة، اعتمادا على بادئة السطر (البادئة نفسها دائما بطول ثابت). على سبيل المثال، خط يبدأ 'TYPE1' سيكون لها تخطيط مختلف من خط بداية 'TYPE2'.

لقد قرأت أن الجداول الخارجية يمكن أن تستفيد من جميع البنيات المتاحة ل SQLملفات التحكم Loader. ومع ذلك، فإن أي وثائق قمت بقراءة طبقات فقط للتعامل مع تخطيطات الملفات المسطحة تافهة حيث تشارك جميع الخطوط تخطيط مشترك. SQL.يمكن لملف التحكم Loader التعامل مع هذا السيناريو بسهولة باستخدام WHEN بند:

WHEN (1:5) = 'TYPE1'
(
    field1 POSITION(10:18),
    field2 POSITION(26:35)
)
WHEN (1:5) = 'TYPE2'
(
    field1 POSITION(23:27),
    field2 POSITION(15:19)
)

كيف يمكنني التعبير عن هذا التخطيط باستخدام بناء جملة تعريف جدول تعريف الجدول الخارجي Oracle؟

هل كانت مفيدة؟

المحلول

هذا من 9.2 مستندات ولكنك تحتاج إلى الحمل عندما جملة.

http://download.oracle.com/docs/cd/b10500_01/server.920/a96652/2012.htm.

نصائح أخرى

إذا كان لديك سجلات ثابتة، جرب هذا

create table EXT_TABLE
(
  record_type        char(2),
  customer_id        char(10),
  customer_name      char(60),
  item_id            char(12)
  quantity           char(10)
)
organization external
(
  type ORACLE_LOADER
  default directory DIR_FLUX_DEV
  access parameters
  (
    RECORDS DELIMITED BY NEWLINE
     BADFILE 'ext_table.bad'
     LOGFILE 'ext_table.log'
     SKIP 0
     FIELDS
    (
     TP_REC               position(1:2)   char(2),
     customer_id          position(3:10)  char(10),
     customer_name        position(13:60) char(60),
     item_id              position(3:12)  char(12),
     quantity             position(15:10) char(10)
    )
  )
  location (DIR_FLUX_DEV:'file.txt')
)
reject limit 0;

ثم يمكنك الوصول إليها إلى ثم أعمدة حسب نوع السجل

select e.* from ext_table;

begin
  for r in c1 loop
    if r.tp_rec = '02' then
       dbms_output.put_line(r.tp_rec || ' ' || r.customer_id);
    elsif r.tp_rec = '03' then
       dbms_output.put_line(r.tp_rec || ' ' || r.item_id);
    end if;
  end loop;
end;

أتمنى أن يساعدك هذا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top