Olga_ Geschrieben 27. Februar 2009 Teilen Geschrieben 27. Februar 2009 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) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 27. Februar 2009 Teilen Geschrieben 27. Februar 2009 Hi, du kannst BLOB Felder nicht in normalen SQL Abfragen verwenden. Dort kann ja neben den dir beschriebenen Textdateien auch ein Worddokument, ein Bild oder eine komplette DVD drinnen liegen - wie sollte das angezeigt werden? Um einen LOB zu lesen und zu schreiben werden Streams verwendet. Hier findest Du einige Beispiele dafür. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 27. Februar 2009 Teilen Geschrieben 27. Februar 2009 Warum zwei offene Threads http://forum.fachinformatiker.de/java/125028-blob-feld-oracle-db.html ? bleibe bitte bei einem. Phil 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.