SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von Duff » 09.10.2007 09:15:00

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.
Zuletzt geändert von Duff am 12.10.2007 08:28:16, insgesamt 1-mal geändert.
Oh, yeah!

Benutzeravatar
muppets
Beiträge: 142
Registriert: 31.08.2004 21:13:53
Wohnort: Dortmund

Beitrag von muppets » 09.10.2007 09:36:42

Ich kenne nur PL/SQL-Prozeduren aus dem Package dbms_lob, um auf ein Clob-Feld zuzugreifen. Darin gibt es dann so hilfreiche Prozeduren, wie instr, substr und read, um da geeignete Teile rauszuholen.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 09.10.2007 09:49:35

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.
Oh, yeah!

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 11.10.2007 21:54:07

Wer XML in einer Datenbank speichert, hat irgendwas nicht verstanden ;) (Und ich meine nicht Duff, der darf die Scheisse wohl nur ausbaden)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.10.2007 22:26:11

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
Duff hat geschrieben:Denke mal, dass ich auf perl zurückgreifen werden muss.
Wenn das kein Dirty Hack werden soll, den du da produzierst, solltest du nicht umbedingt auf Perl zurückgreifen :wink:

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 12.10.2007 08:28:01

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.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von Duff » 15.10.2008 12:42:13

@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
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von gms » 19.10.2008 16:11:42

Duff hat geschrieben:@gms: Hast du eventuell ein Beispiel zu den Oracle internen Funktionen?
welche internen Funktionen meinst du jetzt ?
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.
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,...

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von Duff » 20.10.2008 07:57:56

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.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von gms » 20.10.2008 10:29:55

Kannst du bitte ein Beispiel posten, wie dieses XML-Dokument ausschaut und was du über die Abfrage zurückbekommen möchtest

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von Duff » 20.10.2008 11:11:01

Das CLOB-Feld, hat u.a. folgenden Inhalt:

Code: Alles auswählen

...
<ns0:mainAddress>
            <ns0:country>DE</ns0:country>
</ns0:mainAddress>
...
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:

Code: Alles auswählen

select extract(xmltype(clob_feld),'//country','ns0:').getStringVal() as xml from table
Dann bekomme ich als Fehlermeldung immer: ORA-31013: Invalid XPATH expression

Lasse ich den Namespace weg, bekomme ich ein Null reslutat zurück.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von gms » 20.10.2008 13:57:24

Ich habe das jetzt auf meiner Test-Instanz unter 11g versucht, dort scheint es zu funktionieren:

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
versuche einmal dieses SQL bei dir auszuführen:

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;
Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von Duff » 20.10.2008 14:52:17

Wow, super.

So funktioniert es nun!!!
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: SQL: Einzelnen Wert aus clob-Feld selektieren [gelöst]

Beitrag von Duff » 05.12.2008 08:56:06

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?
Oh, yeah!

Antworten