SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
Hallo,
ist es Möglich bei einer oracle-db aus einem clob-Feld, in dem ein xml-Dokument gespeichert ist, auf nur einen bestimmten Tag zu zugreifen bzw. nur diese eine Zeile zu selektieren?
Danke.
ist es Möglich bei einer oracle-db aus einem clob-Feld, in dem ein xml-Dokument gespeichert ist, auf nur einen bestimmten Tag zu zugreifen bzw. nur diese eine Zeile zu selektieren?
Danke.
Zuletzt geändert von Duff am 12.10.2007 08:28:16, insgesamt 1-mal geändert.
Oh, yeah!
Das benannte package kann ich hier in der db leider nicht finden.
Da die xml-Dokumente in einer Zeile stehen und da die Position des Suchstrings wohl doch nicht immer an der gleichen Stelle auftritt, werde ich mit substr wohl auch nicht weiter kommen.
Denke mal, dass ich auf perl zurückgreifen werden muss.
Da die xml-Dokumente in einer Zeile stehen und da die Position des Suchstrings wohl doch nicht immer an der gleichen Stelle auftritt, werde ich mit substr wohl auch nicht weiter kommen.
Denke mal, dass ich auf perl zurückgreifen werden muss.
Oh, yeah!
mit "to_xmltype(clobcol)" kannst du das CLOB in einen XMLTYPE umwandeln
mit "extractvalue(to_xmltype(clobcol),<xpathexpression>)" kannst du dann den gewünschten Tag herausholen
wenn in dieser Spalte immer nur XML Dokumente abgespeichert werden, wäre es besser diese Tabellenspalte als XMLTYPE zu definieren
edit
Hier gibts umfangreiche Oracle Dokumentation:
http://www.oracle.com/technology/docume ... index.html
wenn du weiterklickst z.B auf Release 10.2 findest du unter "Application Development" alles was dein Oracle Herz begeehrt
z.B.
http://www.oracle.com/pls/db102/portal. ... selected=5
Gruß
gms
mit "extractvalue(to_xmltype(clobcol),<xpathexpression>)" kannst du dann den gewünschten Tag herausholen
wenn in dieser Spalte immer nur XML Dokumente abgespeichert werden, wäre es besser diese Tabellenspalte als XMLTYPE zu definieren
edit
Wenn das kein Dirty Hack werden soll, den du da produzierst, solltest du nicht umbedingt auf Perl zurückgreifenDuff hat geschrieben:Denke mal, dass ich auf perl zurückgreifen werden muss.
Hier gibts umfangreiche Oracle Dokumentation:
http://www.oracle.com/technology/docume ... index.html
wenn du weiterklickst z.B auf Release 10.2 findest du unter "Application Development" alles was dein Oracle Herz begeehrt
z.B.
http://www.oracle.com/pls/db102/portal. ... selected=5
Gruß
gms
Danke für die Antworten.
Habe das ganze nun mit einer perl-Lösung bewältigt.
Habe mich aber auch nicht ganz deutlich ausgedrückt bzw. falsch. In dem CLOB-Feld steht nämlich alles in einer Zeile und dieser Inhalt ist wie folgt aufgebaut:
<irgendeintag><nächstertag>....</..>...
Wenn man dieses CLOB-Feld in einem SQL-Programm öffnet, wird das ganze nicht als eine Zeile dargestellt, sondern als XML-Dokument.
<Tag>
<NächsterTag>
...
Trotzdem Danke.
Habe das ganze nun mit einer perl-Lösung bewältigt.
Habe mich aber auch nicht ganz deutlich ausgedrückt bzw. falsch. In dem CLOB-Feld steht nämlich alles in einer Zeile und dieser Inhalt ist wie folgt aufgebaut:
<irgendeintag><nächstertag>....</..>...
Wenn man dieses CLOB-Feld in einem SQL-Programm öffnet, wird das ganze nicht als eine Zeile dargestellt, sondern als XML-Dokument.
<Tag>
<NächsterTag>
...
Trotzdem Danke.
Oh, yeah!
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
@gms: Hast du eventuell ein Beispiel zu den Oracle internen Funktionen?
Habe es schon mit regexp_like und regexp_substr versucht, nur bekomme ich immer bei der Suche nach einem bestimmten String ein Ergebnis zurück und nicht mehrere, wie es gewünscht wäre.
Denke auch, dass ein Problem am XML-Dokument im CLOB ist, dass dort alle Tags mit <ns0:tagname> Anfangen.
Danke & Gruß,
Daniel
Habe es schon mit regexp_like und regexp_substr versucht, nur bekomme ich immer bei der Suche nach einem bestimmten String ein Ergebnis zurück und nicht mehrere, wie es gewünscht wäre.
Denke auch, dass ein Problem am XML-Dokument im CLOB ist, dass dort alle Tags mit <ns0:tagname> Anfangen.
Danke & Gruß,
Daniel
Oh, yeah!
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
welche internen Funktionen meinst du jetzt ?Duff hat geschrieben:@gms: Hast du eventuell ein Beispiel zu den Oracle internen Funktionen?
wieso regexp* ? Ich dachte du möchtest das XML Dokument mit Perl parsen, warum verwendest du dann kein entsprechendes Perl-Modul, wie z.B XML::XPath , XML::Twig, XML::Parser,...Duff hat geschrieben: Habe es schon mit regexp_like und regexp_substr versucht, nur bekomme ich immer bei der Suche nach einem bestimmten String ein Ergebnis zurück und nicht mehrere, wie es gewünscht wäre.
Sowohl bei Verwendung der Oracle-XML-Funktionen, als auch bei Verwendung der Perl XML-Module ist ein bißchen XPath Know-How vorteilhaft:
http://www.w3schools.com/xpath/default.asp
Gruß
gms
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
Danke für die Antwort, aber ich habe mich nun dazu entschlossen, dass Auslesen direkt über ORACLE (VErsion 10g) zu lösen. Sollte auch wesentlich performanter sein.
Vielleicht funktioniert es ja mit EXTRACT ( XMLType_instance , XPath_string [, namespace_string ] ).
Das blöde sind nämlicher meiner Meinung nach die Namespaces in dem XML-Feldern.
Vielleicht funktioniert es ja mit EXTRACT ( XMLType_instance , XPath_string [, namespace_string ] ).
Das blöde sind nämlicher meiner Meinung nach die Namespaces in dem XML-Feldern.
Oh, yeah!
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
Kannst du bitte ein Beispiel posten, wie dieses XML-Dokument ausschaut und was du über die Abfrage zurückbekommen möchtest
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
Das CLOB-Feld, hat u.a. folgenden Inhalt:
Mit select xmltype(clob_feld) from table bekomme ich schon mal dass Ganze in einen XML-Type umgewandelt.
Habe dann anschließend, umd den country-Typ zu bekommen, sowas versucht:
Dann bekomme ich als Fehlermeldung immer: ORA-31013: Invalid XPATH expression
Lasse ich den Namespace weg, bekomme ich ein Null reslutat zurück.
Code: Alles auswählen
...
<ns0:mainAddress>
<ns0:country>DE</ns0:country>
</ns0:mainAddress>
...
Habe dann anschließend, umd den country-Typ zu bekommen, sowas versucht:
Code: Alles auswählen
select extract(xmltype(clob_feld),'//country','ns0:').getStringVal() as xml from table
Lasse ich den Namespace weg, bekomme ich ein Null reslutat zurück.
Oh, yeah!
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
Ich habe das jetzt auf meiner Test-Instanz unter 11g versucht, dort scheint es zu funktionieren:
versuche einmal dieses SQL bei dir auszuführen:
Gruß
gms
Code: Alles auswählen
gms@gms2 ~ $ sqlplus "/@XDB" @x.sql
SQL*Plus: Release 11.1.0.6.0 - Production on Mon Oct 20 13:51:18 2008
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create table x (id integer not null, field varchar(2048), primary key(id));
Table created.
SQL> insert into x (id,field) values (1,'<ns0:main xmlns:ns0="http://blabla.org/schema"><ns0:mainAdress>X<ns0:country>DE</ns0:country></ns0:mainAdress></ns0:main>');
1 row created.
SQL> select cast(extractvalue(xmltype(field),'//ns0:country','xmlns:ns0="http://blabla.org/schema"') as char(30)) as COUNTRY from x;
COUNTRY
------------------------------
DE
SQL> drop table x;
Table dropped.
SQL> exit;
Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Code: Alles auswählen
set echo on;
create table x (id integer not null, field varchar(2048), primary key(id));
insert into x (id,field) values (1,'<ns0:main xmlns:ns0="http://blabla.org/schema"><ns0:mainAdress>X<ns0:country>DE</ns0:country></ns0:mainAdress></ns0:main>');
select cast(extractvalue(xmltype(field),'//ns0:country','xmlns:ns0="http://blabla.org/schema"') as char(30)) as COUNTRY from x;
drop table x;
exit;
gms
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
Wow, super.
So funktioniert es nun!!!
So funktioniert es nun!!!
Oh, yeah!
Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]
Stehe nun vor dem Problem, dass der Namespace/Node in einem XML-Dokument öfter als 1mal auftaucht und dann scheitert extractvalue. Ein extracvalues konnte ich leider nicht finden.
Wie kann ich sowas denn am geschicktesten lösen?
PL/SQL?
Wie kann ich sowas denn am geschicktesten lösen?
PL/SQL?
Oh, yeah!