Announcement

Collapse
No announcement yet.

Blob zurücksetzen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Blob zurücksetzen?

    Beim Schreiben eines XML-Strings in einen Blob habe ich ein Problem. Das Schreiben funktioniert ohne Probleme, aber wenn ich in den selben Blob erneut einen kürzeren String schreibe, dann habe ich das Ende des vorigen Strings immernoch im Blob. Kann man den Blob irgendwie zurücksetzen, bevor man ihn neu befüllt?

    Leider verwenden wir die Oracle Version 8.1.7 - in der JavaDoc der neueren Version habe ich eine Blob.trim() Methode gefunden, die wohl genau das tun würde. Gibt es einen ähnlichen Weg auch für frühere Versionen?

    Danke für jeden Hinweis!

  • #2
    Hast Du auch etwas Code?<br>
    Ich vermute eher das Problem liegt an deinem Code und nicht an Blob bei Oracle im allgemeinen. Ich selbst verwende bei Oracle auch Blobs und habe dieses Problem nicht

    Comment


    • #3
      Hallo Bernhard, danke für Deine Antwort.

      Ursprünglich wurde dataOutputStream.writeUTF() verwendet, was aber ein Limit von 64KB hat. Deshalb schreibe ich den String in den Blob jetzt wie folgt. Allerdings wird dann nicht mehr erkannt, wo das Ende des zuletzt geschriebenen Strings ist...

      // ... update the blob
      if(rs.next())
      {
      Blob blob = rs.getBlob(7);
      oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) blob;
      OutputStream blobOutputStream = oracleBlob.getBinaryOutputStream();

      DataOutputStream dataOutputStream =
      new DataOutputStream(blobOutputStream);

      // Convert from Unicode to UTF-8
      byte[] utf8 = null;
      utf8 = reportDef.getXml().getBytes("UTF-8");

      // to be compatible with the old modules,
      // which use readUTF, add the length of the byte[]
      dataOutputStream.writeShort(utf8.length);

      ByteArrayInputStream inputStream = new ByteArrayInputStream(utf8);
      int length = -1;
      byte[] buffer = new byte[oracleBlob.getBufferSize()];
      while ((length = inputStream.read(buffer)) != -1)
      {
      blobOutputStream.write(buffer, 0, length);
      }

      // write a 0-value Byte as end delimiter
      dataOutputStream.writeByte(0);

      inputStream.close();
      dataOutputStream.flush();
      dataOutputStream.close();

      Comment


      • #4
        2. Versuch:

        // ... update the blob
        if(rs.next()) {
        Blob blob = rs.getBlob(7);
        oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) blob;
        OutputStream blobOutputStream = oracleBlob.getBinaryOutputStream();

        DataOutputStream dataOutputStream =
        new DataOutputStream(blobOutputStream);

        // Convert from Unicode to UTF-8
        byte[] utf8 = null;
        utf8 = reportDef.getXml().getBytes("UTF-8");

        // to be compatible with the old modules in KPS-DW,
        // which use readUTF, add the length of the byte[]
        dataOutputStream.writeShort(utf8.length);

        ByteArrayInputStream inputStream = new ByteArrayInputStream(utf8);
        int length = -1;
        byte[] buffer = new byte[oracleBlob.getBufferSize()];
        while ((length = inputStream.read(buffer)) != -1) {
        blobOutputStream.write(buffer, 0, length);
        }

        inputStream.close();
        dataOutputStream.flush();
        dataOutputStream.close();

        Comment


        • #5
          3. Versuch:

          // ... update the blob

          if(rs.next())

          {

          Blob blob = rs.getBlob(7);

          oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) blob;

          OutputStream blobOutputStream = oracleBlob.getBinaryOutputStream();

          DataOutputStream dataOutputStream =
          new DataOutputStream(blobOutputStream);


          // Convert from Unicode to UTF-8

          byte[] utf8 = null;

          utf8 = reportDef.getXml().getBytes("UTF-8");

          // to be compatible with the old modules in KPS-DW,

          // which use readUTF, add the length of the byte[]

          dataOutputStream.writeShort(utf8.length);

          ByteArrayInputStream inputStream = new ByteArrayInputStream(utf8);

          int length = -1;

          byte[] buffer = new byte[oracleBlob.getBufferSize()];

          while ((length = inputStream.read(buffer)) != -1)
          {

          blobOutputStream.write(buffer, 0, length);
          }


          inputStream.close();

          dataOutputStream.flush();

          dataOutputStream.close();

          Comment


          • #6
            1, Mittels < pre >-Formatierung ist der Quelltext besser lesbar, z.B.
            <pre>
            if(rs.next())
            {
            Blob blob = rs.getBlob(7);
            oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) blob;
            ...
            }
            </pre>

            2, Hab leider nur für Delphi erfahrung - Da muss sich jemand anderes damit auseinandersetze

            Comment


            • #7
              Ok, hab das Problem gelöst:

              wenn ich eine Änderung der Daten im Blob mache, dann erzeuge ich einfach vorher einen neuen Blob mittels EMPTY_BLOB(). Dann wird zwar jedesmal ein neuer Blob erzeugt, aber eine bessere Lösung finde ich leider nicht.

              Ich hoffe mal, dass Oracle eine Art GarbageCollector hat, der die obsoloten Blobs dann aufräumt. Kennt sich da jemand aus?

              Alternativ könnte man mittels PL/SQL-Befehl dbms_lob.trim() das Ende des Blobs abschneiden, aber leider sind bei unserer Oracle DB diese Procedures nicht aktiv geschaltet

              Comment

              Working...
              X