Avatar billede gvp Nybegynder
23. oktober 2009 - 15:58 Der er 9 kommentarer og
1 løsning

XML filer til database

Hej alle,
jeg har et par filer som dagligt skal lægges ind i database, hver med en størrelse på ca 35 MB.
XML filerne ligger som BLOB (CLOB virkede af en eller anden mystisk grund ikke med vores 3.parts software som lægger filerne ind)
Jeg forestiller mig at lave en staging tabel som hiver BLOB'en ind i noget nogle XMLType tabeller, hvorefter jeg kan stage ud i nogle live tabeller.

jeg har to spørgsmål:
1 er det overhoved muligt og/eller smart at gøre på denne måde?
2 hvordan får man rent praktisk en BLOB over i en XMLtype tabel (og hvordan strukturerer man den)?

Hvis dig som svarer på dette kan lægge et par nemme demo eksempler ud på spm.#2 ville det være til stor hjælp.
Avatar billede arne_v Ekspert
26. oktober 2009 - 00:21 #1
Jeg har aldrig brugt XMLType, men som jeg kan læse mig til at det en kolonne type ikke en tabel type.

re 1)

Så vidt jeg kan læse mig til vil en XMLType kolonne giver nogle ekstra muligheder i forhold til BLOB bl.a. mulighed for brug af XPath uden at det har nogen ulemper. Det lyder derfor som en god ide.

re 2)

Prøv:

UPDATE tabel SET xmltypefelt = XMLType(blobfelt);
Avatar billede gvp Nybegynder
27. oktober 2009 - 10:52 #2
okay...har fået xml ind i xmltype kolonnen, men nu har jeg store problemer med at selecte ting med xpath fra mine data. suk...
Avatar billede gvp Nybegynder
27. oktober 2009 - 10:53 #3
SELECT extractValue(p.OBJECT_VALUE, '/enfinity/offer/sku') "SKU"
  FROM xml_table p
WHERE existsNode(p.OBJECT_VALUE,'/enfinity/offer["sku=TOM9V00101"]') = 1;
returnerer bare 'null'
nogle gode ideer?
Avatar billede gvp Nybegynder
27. oktober 2009 - 10:59 #4
lige for at uddybe:

SELECT extractValue(p.OBJECT_VALUE, '/enfinity/offer/sku') "SKU"
  FROM xml_table p
returnerer : 'null'

SELECT extractValue(p.OBJECT_VALUE, '/enfinity/offer/sku') "SKU"
  FROM xml_table p
WHERE existsNode(p.OBJECT_VALUE,'/enfinity/offer["sku=TOM9V00101"]') = 1;

returnerer intet, ingen rækker vælges.

for mig tyder det på at den ikke læser dokumentet korrekt.
får også kun et 'null' som svar på dette:

SELECT extractValue(p.OBJECT_VALUE, '//offer') "offer"
  FROM xml_table p

så der er et eller andet helt galt....(der er mange offer's).
Avatar billede arne_v Ekspert
28. oktober 2009 - 02:04 #5
Er der namespace i din XML ?
Avatar billede gvp Nybegynder
28. oktober 2009 - 11:00 #6
root ser sådan ud:

<enfinity
xsi:schemaLocation="http://www.intershop.com/xml/ns/enfinity/6.1/xcs/impex catalog.xsd
http://www.intershop.com/xml/ns/enfinity/6.1/core/impex-dt dt.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.intershop.com/xml/ns/enfinity/6.1/xcs/impex"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:dt="http://www.intershop.com/xml/ns/enfinity/6.1/core/impex-dt"
major="6" minor="1" family="enfinity" branch="enterprise" build="6.1.0.0.242">

desværre er der noget galt med schema loc., så jeg har lavet en ny xsd fil, men det fungerer heller ikke.
Avatar billede arne_v Ekspert
28. oktober 2009 - 13:56 #7
Der er et default namespace, saa alle tags er i et namespace.

Det skal angives i dine XPath.

Jeg ved ikke lige hvordan Oracle haandterer namespaces i XPath, men jeg kan proeve om min google fu er god idag.
Avatar billede arne_v Ekspert
28. oktober 2009 - 17:06 #8
Giver:

SELECT extractValue(p.OBJECT_VALUE, '//offer', 'http://www.intershop.com/xml/ns/enfinity/6.1/xcs/impex') "offer" FROM xml_table p

noget ?
Avatar billede gvp Nybegynder
02. november 2009 - 10:37 #9
fandt ud af en løsning. Jeg var helt på vildspor, det havde intet at gøre med xsd schema's eller noget.

select
  EXTRACTVALUE(value(g),'/offer/sku') sku
from xml_test t,table(XMLSequence(extract(t.dt, '/enfinity/offer'))) g

det giver det resultat jeg havde håbet på.

men tak for hjælpen alligevel :)
Avatar billede gvp Nybegynder
09. november 2009 - 15:04 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester