yallayalla Geschrieben 23. März 2006 Teilen Geschrieben 23. März 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pinhead Geschrieben 23. März 2006 Teilen Geschrieben 23. März 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
yallayalla Geschrieben 23. März 2006 Autor Teilen Geschrieben 23. März 2006 Hallo! Erstmal danke für den Tip, aber so ganz verstehe ich das nicht. Zu meinem Szenario: Ich will die Packages in meiner DB auslesen und als ganzes in einem BLOB ablegen. Also lese ich ich zeilenweise die Packages aus...und wie schreibe ich nun in den BLOB? gruss yallayalla Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
johnhaltonx Geschrieben 23. März 2006 Teilen Geschrieben 23. März 2006 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
yallayalla Geschrieben 23. März 2006 Autor Teilen Geschrieben 23. März 2006 Ho! Wie ist denn die ganue Syntax, um Daten in den Blob einzufuegen? und wie nutze ich den lob_loc? mfg yallayalla Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
yallayalla Geschrieben 27. März 2006 Autor Teilen Geschrieben 27. März 2006 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; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
johnhaltonx Geschrieben 27. März 2006 Teilen Geschrieben 27. März 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
yallayalla Geschrieben 27. März 2006 Autor Teilen Geschrieben 27. März 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
johnhaltonx Geschrieben 28. März 2006 Teilen Geschrieben 28. März 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
yallayalla Geschrieben 28. März 2006 Autor Teilen Geschrieben 28. März 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
yallayalla Geschrieben 28. März 2006 Autor Teilen Geschrieben 28. März 2006 Hi! Achja, und wie kann ich den CLOB anzeigen/ausgeben? Danke. Gruss Yallayalla Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
johnhaltonx Geschrieben 28. März 2006 Teilen Geschrieben 28. März 2006 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.