Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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)

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.