Zum Inhalt springen

ORACLE BLOB - interner LOB


yallayalla

Empfohlene Beiträge

Hallo!

Ich muss einen Haufen Daten, die ich aus der DB auslese, in ein File schreiben.

Ich will die Daten gern in ein BLOB schreiben, also ein LOB, der in der Datenbank abgelegt wird.

Wie kann ich in ein BLOB schreiben und wie kann ich den BLOB auslesen.

Kann man zeilenweise in den BLOB schreiben?

Leider habe ich bei google nicht viel gefunden, was mir da weiterhilft.

Vielen Dank.

Gruss

yallayalla

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie möchtest du denn in den BLOB schreiben ?

Also ich hab das mal Java gemacht.

Dafür musste ich zuerst beim Anlagen der Tabelle für das BLOB Feld ein Default Wert zuweisen


anhang	blob default empty_blob()

Dies ist nötig, da Oracle wohl die Daten intern nicht direkt in der DB ablegt sondern nur einen Verweis darauf speichert. Dann hab ich erst die anderen Daten zu meinem Anhang gespeichert und mir dann den BLOB zum Updaten geholt

select anhang

from 

tbl_anhang

where anhang_id="+ ianhang_id + " FOR UPDATE

Hierbei musste noch beachtet werden, das bei der Connection "AutoCommit" ausgeschaltet wurde.

Von dem Blob den ich nun selektiert hatte hab ich mit Hilfe eines BinaryOutputStream und eines FileStreams die Daten in die Datenbank geschrieben

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne fertige Lösung hab ich auch nicht, aber schau dir mal die Doku zu DBMS_LOB an

http://www.psoug.org/reference/dbms_lob.html

Da sollte ne passende Funktion dabei sein..

War glaube ich irgendwas mit "append".... wenn du das Zeilenweise machen willst, was aber wahrscheinlich ziemlich langsam wird, je nachdem wieviel code du übertragen willst, es wäre wahrscheinlich besser sich erst einen array mit einem Package aufzubauen oder sogar mehreren und den dann sozusagen per "bulk-processing" in die Lob Tabelle zu schreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo!

Habe sowas hier gefunden,

allerdings werde ich nicht ganz schlau draus:

lob_loc BLOB;

buffer RAW;

amt BINARY_INTEGER := 32767;

pos INTEGER := 2147483647;

i INTEGER;

BEGIN

SELECT b_col INTO lob_loc

FROM lob_table

WHERE key_value = 12 FOR UPDATE;

FOR i IN 1..3 LOOP

dbms_lob.write (lob_loc, amt, pos, buffer);

-- fill in more data

pos := pos + amt;

END LOOP;

EXCEPTION

WHEN some_exception

THEN handle_exception;

END;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Prozedur zerschneidet den Inputstream in 32K Stücke und inserted die nacheinander in ein BLOB-Feld

siehe schleife i=1...3

Hole 32K Lob Daten

Schreibe 32K lob daten an Position pos, Datenlänge amt,Quelle buffer in Lob_Locator

"dbms_lob.write (lob_loc, amt, pos, buffer);"

pos=pos+amt -- setze die neue Position ans Ende des gerade eingefügten 32K Blocks

wiederhole solange Quelldaten da sind, hier 3 mal = 96K BLOB

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo!

Danke für die schnelle Antwort.

Allerdings hänge ich immer noch irgendwie:

Wie mache ich einen "Stream" bzw. muss das sein?

Im Endeffekt lasse ich eien Schleife laufen, die mir in Variable x bei jedem Durchlauf nen Wert gibt. Den Wert x will ich dann in nen CLOB schreiben.

Mache ich da nen Writeappend bei jedem Schleifendurchlauf? uind wenn ja, wie muss ich was definieren, um den CLOB zu füllen?

Habe ne Tabelle angelegt mit

Create Table a_Clobtable(ID Number, clobdata Clob default empty_clob());

In clobdata sollen logischerweise die Daten rein.

mfg

yallayalla

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wieso in ner Schleife? das Select sollte doch schon alle benötigten Werte liefern?

btw das mit dem Inputstream liegt daran das reines SQL maximal 4000 Zeichen Strings unterstützt, PL/SQL maximal 32KB, Sobal du was größeres einfügen willst mußt du stückeln und writeappend benutzen

Hier mal eine Beispiel PL/SQL Package mit einem create_lob und einer append Funktion:

create package lob_pkg

as

   procedure lob_ins( p_id in number, p_text in varchar2 );

   procedure add_more( p_text in varchar2 );

end;

/


create package body lob_pkg

as


g_clob clob;



procedure lob_ins(p_id IN number, p_text IN varchar2 )

as

begin

     insert into demo values (p_id, empty_clob() ) returning y into g_clob;

     dbms_lob.write( g_clob,length(p_text), 1,p_text);

end;


procedure add_more( p_text in varchar2 )

as

begin

    dbms_lob.writeappend( g_clob, length(p_text), p_text );

end;


end;

/



and then call


exec ins_lob( 1, 'hello' );

exec add_more( ' world' );

Also erst die ins_lob aufrufen und dann in der schleife die add_more mit dem jeweiligen string. Achtung: wenn du darin Codestücke speichern willst denk daran Zeilenumbrüche usw über die Schleife einzufügen, falls die in deinen Quellen noch nicht vorhanden sind, sonst gibts nachher Spaghetticode

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo!

Danke für den Beispielcode, habe es gestern abned mit .write und writeappend auch soweit hinbekommen.

Wie füge ich den Zeilenumbruch ein?

Habe das jetzt mal so:

VARIABLE:= WERTX bzw. Ergebnis eines SELECTS

SELECT clobdata INTO lob_loc FROM a_clobtable WHERE id=1 FOR UPDATE;

v_string:= VARIABLE ;

amt:=length(v_string);

dbms_lob.writeappend(lob_loc, amt, v_string);

COMMIT;

Wie kann ich bei

v_string:= VARIABLE ;

mit || nen Zeilenumbruch anhängen?

Also dann

v_string:= VARIABLE || /*Zeilenumbruch*/ ;

Vielen Dank für die Hilfe!

mfg

yallayalla

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zeilenumbruch ist "chr(13);chr(10)" = character für Linefeed und Carriage return, soweit ich mich erinnern kann ;)

Was speicherst du in dem Clob? Textinformationen als clob ?

zum auslesen:

dbms_lob.read(lob_loc, amt, v_string)

Bsp: gut is für Blob aber das Prinzip is das gleiche


dbms_lob.read(

lob_loc IN BLOB,

amount  IN OUT NOCOPY INTEGER,

offset  IN     INTEGER,

buffer    OUT RAW);

Quelle: http://www.psoug.org/reference/dbms_lob.html

Da ist eine komplette funktionsreferenz, die sollte weiterhelfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...