Hallo Leute,
ich muss ein Objekt mit dem Attribut von dem Datentyp BLOB aus einer in Java-geschriebenen Web-Anwendung in der Oracle-DB speichern. Unten folgt die Beschreibung
Wenn jemand die Vorgehensweise kennt oder eine Idee hätte...
im Voraus besten Dank für jede Unterstützung.
Olga.
Oracle:
Das Feld in der DB-Tabelle Meine_Tabelle: "BEGRUENDUNG" BLOB
Mit dem Benutzer System habe ich einen tablespace angelegt:
create tablespace lobs
datafile 'lobs.dbf'
size 5M
extent management local uniform size 1M
Dann die Tabelle geändert:
alter table Meine_Tabelle
move lob (begruendung) store as (tablespace LOBS storage (initial 100k next 100k pctincrease 0)
chunk 16k pctversion 10 nocache logging)
Bei der Abfragen
select begruendung from Meine_Tabelle
oder
select begruendung from Meine_Tabelle FOR UPDATE
kommt die Fehlermeldung:
ORA-00932: Inkonsistente Datentypen: NUMBER erwartet, BLOB erhalten
Ein Update mit
update Meine_Tabelle set begruendung = EMPTY_BLOB() ändert nichts an der Sache.
Mapping:
<field-descriptor id="16"
name="begruendung"
column="BEGRUENDUNG"
jdbc-type="BLOB"
primarykey="false"
/>
Java:
import oracle.sql.BLOB;
private BLOB begruendung;
Die Infromationen, die in dem BLOB-Feld gespeichert werden sollen habe ich in Form eines Strings. Für die Speicherung in der DB versuche ich daraus ein BLOB zu erzeugen:
byte[] blobBites = this.begruendungStr.getBytes();
begruendung = BLOB.empty_lob();
begruendung.setBytes(1,blobBites);
Statische Methode BLOB.empty_lob() liefert kein BLOB-Objekt, sondern null zurück. Ich bin mir auch nicht sicher, dass ich für das von dieser Methode gelieferten Blob-Objekt die Methode begruendung.setBytes(1,blobBites) ausführen kann. Ausprobieren kann ich auch nicht, da ich kein BLOB-Objekt erzeugen kann (Es gibt keinen Konstruktor für die BLOB-Klasse new BLOB())
Für die Methode BLOB.createTemporary(Connnection , boolean, int) brauche ich die Connection zu der DB. Da ich aber alle DB-Zugriffe über DAOs verwalte, habe ich nicht wirklich die Connection in meiner Struts-Form. Rein theoretisch kann man sie von DAO mit einer public-Methode holen. Das passt natürlich nicht zu dem Konzept und unsere Erfahrungen sagen, dass die Connection dann auch nicht zuverlässig ist.
So lange der Befehl
update Meine_Tabelle set begruendung = EMPTY_BLOB() nicht ausgeführt wurde, ist in Java nach dem Lesen des Objektes aus Oracle das Attribut Begrundung = null.
Wenn aber das Feld ein EMPTY_BLOB enthält, bekomme ich einen Fehler schon bei Mapping:
Caused by: java.lang.IllegalArgumentException: Can not set oracle.sql.BLOB field de……….begruendung to [b
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
at java.lang.reflect.Field.set(Field.java:657)