DBMS_LOB
APPEND
- добавляет содержание исходного LOB в целевой.
DECLARE
    dest_lob BLOB;
    src_lob  BLOB;
BEGIN
    -- get the LOB locators
    -- note that the FOR UPDATE clause locks the row
    SELECT b_lob INTO dest_lob
        FROM lob_table
        WHERE key_value = 12 FOR UPDATE;
    SELECT b_lob INTO src_lob
        FROM lob_table
        WHERE key_value =21;
        DBMS_LOB.APPEND(dest_lob, src_lob);
        COMMIT; END;  
CLOSE
- закрывает открытый внутренний или внешний LOB.
COMPARE
- сравнивает части двух LOB.
DBMS_LOB.COMPARE (
   lob_1            IN BLOB,
   lob_2            IN BLOB,
   amount           IN INTEGER := 4294967295,
   offset_1         IN INTEGER := 1,
   offset_2         IN INTEGER := 1)
  RETURN INTEGER;
DECLARE
    lob_1, lob_2      BLOB;
    retval            INTEGER;
BEGIN
    SELECT b_col INTO lob_1 FROM lob_table
        WHERE key_value = 45;
    SELECT b_col INTO lob_2 FROM lob_table
        WHERE key_value = 54;
    retval := dbms_lob.compare(lob_1, lob_2, 5600, 33482,
         128);
    IF retval =0 THEN ;
        -- process  compared
    code ELSE ; -- process not
        compared code  END
    IF; END;
COPY
- копирует все или часть исходного LOB в целевой LOB.
DECLARE
    lobd, lobs     BLOB; 
    dest_offset    INTEGER := 1
    src_offset     INTEGER := 1
    amt            INTEGER := 3000;
BEGIN
    SELECT b_col INTO lobd
        FROM lob_table
        WHERE key_value =
           
    12    FOR UPDATE; SELECT
    b_col     INTO lobs FROM
    lob_table            WHERE key_value= 

    21; DBMS_LOB.COPY(lobd, lobs, amt,
        dest_offset, src_offset);
        COMMIT; END; 
CREATETEMPORARY
- создает временный BLOB или CLOB в user's default temporary tablespace.
DBMS_LOB.CREATETEMPORARY (
   lob_loc IN OUT NOCOPY BLOB,
   cache   IN            BOOLEAN,
   dur     IN            PLS_INTEGER := 10);
ERASE
- удаляет весь или часть LOB.
DECLARE
    lobd       BLOB;
    amt        INTEGER := 3000;
BEGIN
    SELECT b_col INTO lobd
        FROM lob_table
        WHERE key_value = 12 FOR UPDATE;
    dbms_lob.erase(dest_lob,       amt,
    2000);        COMMIT; END;
FILECLOSE
- закрывает файл
FILECLOSEALL
- закрывает все ранее открытые файлы.
FILEEXISTS
- проверяет, что файл существует.
FILEGETNAME
- возвращает dir_name и имя файла.
FILEISOPEN
- проверяет, что файл был открыт с использованием BFILE locators.
FILEOPEN
- открывает файл.
FREETEMPORARY
- освобождает temporary BLOB или CLOB в user's default temporary tablespace.
GETCHUNKSIZE
- возвращает количество памяти используемого в части LOB для сохранения объекта. (Returns the amount of space used in the LOB chunk to store the LOB value.)
GETLENGTH
- возвращает размер LOB объекта.
INSTR
- возвращает позицию подстроки в LOB.
DBMS_LOB.INSTR (
   file_loc   IN   BFILE,
   pattern    IN   RAW,
   offset     IN   INTEGER := 1,
   nth        IN   INTEGER := 1)
  RETURN INTEGER;
ISOPEN
- проверяет, что LOB уже открыт с использованием input locator.
ISTEMPORARY
- проверяет, что локатор указывает на temporary LOB.
LOADFROMFILE
- загружает данные BFILE в internal LOB.
DBMS_LOB.LOADFROMFILE(
   dest_lob    IN OUT NOCOPY CLOB CHARACTER SET ANY_CS, 
   src_file    IN            BFILE, 
   amount      IN            INTEGER, 
   dest_offset IN            INTEGER := 1, 
   src_offset  IN            INTEGER := 1);
DECLARE 
  lobd       BLOB; 
  fils       BFILE   := BFILENAME('SOME_DIR_OBJ','some_file'); 
  amt        INTEGER := 4000; 
BEGIN 
  SELECT b_lob INTO lobd FROM lob_table WHERE key_value = 42 FOR 
  UPDATE;       dbms_lob.fileopen(fils, 
  dbms_lob.file_readonly);       dbms_lob.loadfromfile(lobd,   fils, amt); 
  COMMIT;        dbms_lob.fileclose(fils); END;
OPEN
- открывает LOB (internal, external, or temporary) в indicated mode.
DBMS_LOB.OPEN (
   lob_loc   IN OUT NOCOPY BLOB,
   open_mode IN            BINARY_INTEGER);
READ
- читает фрагмент данных из LOB по заданному смещению.
DECLARE
     fil BFILE; 
     pos INTEGER;
     amt BINARY_INTEGER; 
     buf RAW(40); 
BEGIN 
     SELECT f_lob INTO fil FROM lob_table WHERE key_value = 21;
     dbms_lob.open(fil, dbms_lob.lob_readonly);   
     amt := 40; pos := 1 + dbms_lob.getlength(fil); buf := ''; 
     dbms_lob.read(fil, amt, pos, buf); 
     dbms_output.put_line('Read
     F1 past 
     EOF: '||
     utl_raw.cast_to_varchar2(buf)); dbms_lob.close(fil); 
     exception WHEN 
no_data_found 
     THEN BEGIN dbms_output.put_line('End of File reached. Closing file');  dbms_lob.fileclose(fil);
     -- or   
     dbms_lob.filecloseall if appropriate END; END;
SUBSTR
- возвращает часть LOB по заданному смещению.
DECLARE
    fil BFILE;
    pos INTEGER := 2147483647;
    pattern RAW;
BEGIN
    SELECT f_lob INTO fil FROM lob_table WHERE key_value =
    21; dbms_lob.fileopen(fil,
    dbms_lob.file_readonly); 
    pattern := dbms_lob.substr(fil, 255, pos); 
    dbms_lob.fileclose(fil); END; 
TRIM
- укорачивает LOB до заданной длины.
DBMS_LOB.TRIM (
   lob_loc        IN OUT  NOCOPY CLOB CHARACTER SET ANY_CS,
   newlen         IN             INTEGER);
WRITE
- записывает данные в LOB по заданному смещению.
WRITEAPPEND
- добавляет данные в конец LOB.
TO_BLOB и TO_CLOB
create global temporary table lob_temp
(id int primary key,
c_lob clob,
b_lob blob
)
create sequence lob_temp_seq;
create or replace
function to_blob(p_cname in varchar2,
p_tname in varchar2,
p_rowid in rowid) return blob
as
l_blob blob;
l_id int;
begin
select lob_temp_seq.nextval into l_id from dual;

 execute immediate
 'insert into lob_temp (id,b_lob)
 select :id, to_lob(' || p_cname || ')
 from ' || p_tname ||
 ' where rowid = :rid '
 using IN l_id, IN p_rowid;

 select b_lob into l_blob from lob_temp where id - l_id ;

 return l_blob;
 end;
create or replace
function to_clob(p_cname in varchar2,
p_tname in varchar2,
p_rowid in rowid) return clob
as
l_clob clob;
l_id int;
begin
select lob_temp_seq.nextval into l_id from dual;

 execute immediate
 'insert into lob_temp (id,c_lob)
 select :id, to_lob(' || p_cname || ')
 from ' || p_tname ||
 ' where rowid = :rid '
 using IN l_id, IN p_rowid;

 select c_lob into l_clob from lob_temp where id = l_id ;

 return l_clob;
end;
DIRECTORY
Для работы с BFILE используется понятие DIRECTORY
  • Инициализация
    CREATE DIRECTORY dir_name AS 'path';
    DROP DIRECTORY dir_name;
    
    GRANT READ ON DIRECTORY dir_name TO user|role|PUBLIC;
  • кладем файл в директорию
  • чтение из файла в BLOB
    DECLARE
      lobd       BLOB; 
      fils       BFILE   := BFILENAME('SOME_DIR_OBJ','some_file'); 
      amt        INTEGER := 4000; 
    BEGIN 
      SELECT b_lob INTO lobd FROM lob_table WHERE key_value = 42 FOR UPDATE;
      dbms_lob.fileopen(fils, dbms_lob.file_readonly); 
      dbms_lob.loadfromfile(lobd, fils, amt); 
      COMMIT; 
      dbms_lob.fileclose(fils); 
    END;
  • просмотр списка директорий
-
TEXT
Hosted by uCoz