BFILE

BFILE gehört zu den large object-Datentypen bei Oracle und dem SQL-Standard und enthält einen Zeiger (Locator) auf eine large binary-Datei, die außerhalb des DBS im Dateisystem des Betriebssystems des Datenbankservers gespeichert ist. Es ist ein byte stream-Ein-/Ausgabe-Zugriff auf die externe LOB-Datei möglich, deren maximale Größe 4 Gigabyte ist.

Sie unterliegen nicht dem Transaktionskonzept des DBS, so dass Änderungen der Daten nicht mit den üblichen Mechanismen COMMIT und ROLLBACK bearbeitet werden können. Sie unterliegen auch nicht den DBS-spezifischen Sicherungs- und Wiederherstellungsvorkehrungen (Backup und Recovery) und so muss auf Betriebssystemebene für ihre Sicherheit gesorgt werden. Sie werden immer in Tabellenspalten referenziert über einen sogenannten Locator.

Für die Speicherung von BFILE-Daten wie auch für deren Zugriff reichen die Konzepte von SQL nicht aus, es muss mit dem PL/SQL-PACKAGE DBMS_LOB gearbeitet werden.

Beispiele:

   CREATE PROCEDURE SetBewerbung (InputName IN VARCHAR2) 
   IS   Textdaten   CLOB;
        Datei       BFILE;
   BEGIN
	SELECT Bewerbung, BewerbungDatei
         INTO  textdaten, datei
         FROM  Personen 
         WHERE Name = InputName for update;
        DBMS_LOB.FILEOPEN (datei, DBMS_LOB.FILE_READONLY) ;
        DBMS_LOB.LOADFROMFILE (textdaten, datei, DBMS_LOB.GETLENGTH(datei));
        DBMS_LOB.FILECLOSE(datei);
        UPDATE Personen  SET  Bewerbung = textdaten
         WHERE Name = InputName;
   END;

   DECLARE
     v_bfile_datei     BFILE; 
     v_position        INTEGER;
     v_laenge          BINARY_INTEGER :=80; 
     v_buffer          RAW(80); 
   BEGIN 
     SELECT prototyp_bild 
       INTO v_bfile_datei  
       FROM produkte 
      WHERE produkt_id = 4711;
     DBMS_LOB.OPEN(v_bfile_datei, DBMS_LOB.LOB_READONLY);   
     v_position := 1 + DBMS_LOB.GETLENTH(v_bfile_datei); 
     v_buffer := ''; 
     DBMS_LOB.READ(v_bfile_datei, v_laenge, v_position, v_buffer); 
     DBMS_OUTPUT.PUT_LINE('Read F1 past EOF: '|| 
          UTL_RAW.CAST_TO_VARCHAR2(v_buffer)); 
     DBMS_LOB.CLOSE(v_bfile_datei); 
   EXCEPTION
     WHEN NO_DATA_FOUND THEN 
       BEGIN 
         DBMS_OUTPUT.PUT_LINE('End of File reached. Closing file'); 
         DBMS_LOB.FILECLOSE(v_bfile_datei); 
         -- oder DBMS_LOB.FILECLOSE falls es passt
       END; 
   END; 

siehe auch: Multi-Media-Datentyp, BFILENAME, LOB

Quellen:

  • INCITS/ISO/IEC 9075-1-2008. Part 1 "SQL/Framework", ISO International Organization for Standardization / INCITS InterNational Committee for Information Technology Standards, 2008
  • INCITS/ISO/IEC 9075-1-2008. Part 2 "SQL/Foundation", ISO International Organization for Standardization / INCITS InterNational Committee for Information Technology Standards, 2008
  • Elmasri, Ramez/Navathe, Shamkant B.: "Grundlagen von Datenbanksystemen" , Pearson Studium, München, 2002, ISBN 3-8273-7021-3
  • Melton, Jim/Simon, Alan R.: "SQL: 1999 - Understanding Relational Language Components", Morgan Kaufmann, San Francisco, 2001, ISBN 1558604561
  • Oracle® Database SQL Language Reference 11g Release 2 (11.2), E17118-03, August 2010, http://download.oracle.com/docs/cd/E11882_01/server.112/e17118.pdf
  • Saake, Gunter/Sattler, Kai-Uwe/Heuer, Andreas: "Datenbanken - Konzepte und Sprachen", mitp-Verlag, Redline GmbH, Heidelberg, 2007, ISBN 3-8266-1664-2

Kategorie: Oracle-PL-SQL, SQL, Objektrelationales SQL, B