الجداول الخارجية Oracle: تخطيط الملفات المسطحة المتقدمة
-
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;
أتمنى أن يساعدك هذا