XML belgelerini kontrol dosyasıyla Oracle 11g DB'ye yükleme


4

Oracle 11g XML veritabanını kullanıyorum ve XML dosyalarını bu DB'ye bir kontrol dosyası vesqlldrYarar.Tüm bu XML dosyaları, zaman damgası (ve bunun ortasında T harfi olan) bir tarih dizesi içeren bir öğeye sahiptir.Oracle, içinde T olduğu için bu tarih dizesini reddediyor ve böylece XML dosyası DB'ye yüklenmiyor.

Oracle işlevini kullanmak istiyorumTO_TIMESTAMP_TZveri yüklemesi sırasında tarih dizgisinde, ancak nasıl yapacağımı bilmiyorum.Yardıma ihtiyacım olan yer burası.XML'i içe aktarmanın başka bir yolu varsa (zaman damgalı tarih dizesiyle), bunu da deneyeceğim.

XML dosyasındaki tarih girişi:

2013-04-20T21:02:52.468-04:00

Ve işte kodun tamamı kontrol dosyası:

load data infile 'filelist.dat' 
    append into table STXP xmltype(XMLDATA)
    ( filename filler char(120), XMLDATA lobfile(filename) terminated by eof )

Yukarıdaki kontrol dosyasını çalıştırabilirim.sqlldrAyrıca SQL * Plus komut satırında da yardımcı olabilir, ancak bu seçenek hakkında emin değil.Eğer mümkünse, kontrol dosyasını çalıştırmadan önce OTURUMA DEĞİŞTİREBİLİR (bir şekilde tarih dizgisini biçimlendirmek için).

filelist.datYukarıda belirtilen giriş XML dosyası için girişler içerir, bir satırda bir XML dosyası listelenir.Her XML dosyasında yukarıdaki tarih girişi zorunludur.Her XML dosyası, bazıları gerekli, bazıları isteğe bağlı olmak üzere yaklaşık 50 farklı öğeye sahiptir.Yardımınız için çok teşekkür ederim.

GÜNCELLEME: Tarih dizesi için tanım içeren şemayı ve diğer 100 şemayı bir komut dosyasına başarıyla kaydettim.Bu komut dosyası çok büyük olduğu için, yalnızca 2 kayıt bölümünü gönderiyorum:

DECLARE
SCHEMAURL VARCHAR2( 100 );
SCHEMADOC VARCHAR2( 100 );
BEGIN
SCHEMAURL := 'http://www.some.org/stxp/DataTypes.xsd';
SCHEMADOC := 'DataTypes.xsd';
DBMS_XMLSCHEMA.registerSchema( 
     SCHEMAURL, 
     BFILENAME( 'XSD_DIR', SCHEMADOC ),
     LOCAL => TRUE, -- local
     GENTYPES => TRUE, -- generate object types
     GENBEAN => FALSE, -- no java beans
     GENTABLES => TRUE, -- generate object tables
     OWNER => USER );
     SCHEMAURL := 'http://www.some.org/stxp/STXP.xsd';
     SCHEMADOC := 'STXP.xsd';
     DBMS_XMLSCHEMA.registerSchema( 
     SCHEMAURL, 
     BFILENAME( 'XSD_DIR', SCHEMADOC ),
     LOCAL => TRUE, -- local
     GENTYPES => TRUE, -- generate object types
     GENBEAN => FALSE, -- no java beans
     GENTABLES => TRUE, -- generate object tables
     OWNER => USER );
    END;
    /

Yukarıdaki ikinci kayıt, betiğin sonuncusudur ve bu, yaklaşık 800 XML dosyası yüklemeye çalıştığım STXP tablosu oluşturur.Her XML dosyasının stxp adlı bir kök elemanı vardır.

Bu, tarih dizgisinin ilgili tanımıdır:

 
     

Ve yukarıdaki tanımı nasıl kullanıyorum:


Yukarıdaki öğeyi isteğe bağlı (test amacıyla) yaptığımda ve tarih dizgisi girişini (bu sorunun başında belirtilen) XML dosyamdan kaldırdığımda, XML dosyası başarıyla Oracle XML veritabanına yüklenir.Bu girişi tekrar XML dosyasına koyduğumda (çünkü gerekli), Oracle reddetti.

Oracle'ın XML dosyalarındaki verilerle STXP tablosu popülasyonuna bakmasına izin verdiğim için, veritabanına kaydetmeden önce tarih dizesini giriş XML dosyasından önceden işlemek için bir tetikleyici ayarlayabileceğimden emin değilim.Kontrol dosyasında bunu yapmanın bir yolu olduğunu düşünüyorum.

  0

STXP tablosunu oluştururken bir şema kaydettiniz mi?Eğer öyleyse, lütfen bize bunu yaparken kullandığınız betiği gönderin. 22 nis. 132013-04-22 11:44:10

0

SQL Loader ile nasıl yönetileceğini bulamazsanız, ithal ettiğiniz tabloya bir varchar sütunu ekleyebilir ve ardından bu varchar sütunu tablodaki bazı tarih sütunlarına dönüştüren bir ekleme kaplanı ekleyebilirsiniz.

  0

@ColinYes, söz konusu tarih dizesinin tanımını içeren şemayı kaydettim.Aslında, 101 şema dosyasından oluşan büyük bir projedir.Hepsini doğru sırayla başarıyla kaydettim.Bu senaryo çok büyük;bu yüzden, sadece bazı bölümlerini listeliyorum: 23 nis. 132013-04-23 00:12:56

  0

@ColinHere betiği: 'DECLARE SCHEMAURL VARCHAR2 (100);SCHEMADOC VARCHAR2 (100); BEGIN SCHEMAURL: = 'http://www.some.org/stxp/DataTypes.xsd';SCHEMADOC: = 'DataTypes.xsd';DBMS_XMLSCHEMA.registerSchema (SCHEMAURL, BFILENAME ('XSD_DIR', SCHEMADOC), YEREL => DOĞRU, - yerel GENTYPES => DOĞRU, - Nesne türlerini üret nesne tabloları oluşturmak OWNER => USER); END;/' 23 nis. 132013-04-23 00:36:50

  0

Bu yorumları bu cevaptan ziyade soruya taşıyabilir misiniz?DataTypes.xsd dosyasının içeriğini gönderebilir misiniz?Datetime örneğiyle ne yapılacağı hakkında bir şey içeriyor mu? 23 nis. 132013-04-23 14:52:54

  0

@ Colin'tHart Bütün bu yorumlarla sorumu zaten geliştirdim ve sorularınızı orada cevapladım. 23 nis. 132013-04-23 15:59:49

  0

@Jokke XML dosyasını Oracle DB'ye yüklediğimde Oracle'ın XML dosyalarından gelen tablo verilerini çeşitli sütunlara bölmesine izin verdim.Bu nedenle, eklemeden önce bir sütun değerini işlemek için bir tetikleyici ayarlayabileceğimi sanmıyorum. 23 nis. 132013-04-23 16:04:59


1

Sanırım bunu yapmanız gereken bir Jokke önerisi: DT veri tipini tanımlamak yerineTIMESTAMP WITH TIME ZONEyerine onu tanımlaVARCHAR2(29)29 karakterin yeterli olması gerektiğini düşünüyorum ama daha geniş tanımlayabilirsiniz.

Ardından, XML'den veri çıkardığınızda, onu dönüştürmeniz gerekir.TIMESTAMP WITH TIME ZONE.

Ancak, sütunu "xsd: dateTime" olarak da tanımlayabilirsiniz.Görmekhttp://www.adp-gmbh.ch/xml/schema.htmlvehttp://www.w3.org/TR/xmlschema-2/#dateTime

  0

DT veri tipini 'xdb: SQLType =" VARCHAR2 (30) "' olarak tanımladım ve kaydetmeye çalıştım.Bu hatayı aldım: 'ORA-31094: uyumsuz SQL türü "DT" 'niteliği veya elemanı için" VARCHAR2 (30) " 24 nis. 132013-04-24 15:05:46