18 DBMS_LOB.FILECLOSE(file_1);
19 DBMS_LOB.FILECLOSE(file_2);
20 END;
21 /
Procedure created.
SQL> BEGIN
2 f_compare('fname.txt','fname.txt');
3 END;
4 /
Файлы одинаковые
SQL> BEGIN
2 f_compare('fname.txt','fname2.txt');
3 END;
4 /
Файлы различные
SQL> BEGIN
2 f_compare('fname.txt','fname3.txt');
3 END;
4 /
BEGIN
*
ERROR at line 1:
ORA-22288: file or LOB operation FILEOPEN failed
The system cannot find the path specified
ORA-06512: at "SYS.DBMS_LOB", line 475
ORA-06512: at "SYSTEM.F_COMPARE", line 9
ORA-06512: at line 2
При последнем вызове процедуры f_compare не удалось открыть указанный файл. Обратите внимание, ошибка произошла при попытке открыть файл, установка указателя BFILE произошла нормально.
Для загрузки файлов в базу данных как LOB-объектов предназначена пакетная процедура DBMS_LOB.LOADFROMFILE, которой в качестве параметров передается переменная типа BFILE, связанная с загружаемым файлом, количество байт, считываемое из файла, и указатель на объект-приемник.
SQL> CREATE TABLE tab1 (at1 NUMBER, at2 BLOB, at3 BFILE);
Table created.
SQL> INSERT INTO tab1 VALUES (2,EMPTY_BLOB(),NULL);
1 row created.
SQL> DECLARE
2 l_BLOB BLOB;
3 file_1 BFILE;
4 BEGIN
5 SELECT at2 INTO l_BLOB FROM tab1
6 WHERE at1=2 FOR UPDATE;
7 file_1 := BFILENAME('DIR1','fname.txt');
8 DBMS_LOB.FILEOPEN(file_1);
10 DBMS_LOB.LOADFROMFILE(l_BLOB,file_1,
11 DBMS_LOB.GETLENGTH(file_1));
12 COMMIT;
13 END;
14 /
PL/SQL procedure successfully completed.
В данном случае сначала строка таблицы с пустым LOB-объектом блокируется с помощью команды SELECT FOR UPDATE, а затем пакетная процедура DBMS_LOB.LOADFROMFILE осуществляет в него загрузку из файла.
Семантика SQL для LOB-объектов
Начиная с версии Oracle 9i, реализована поддержка семантики SQL для LOB-объектов. Это означает, что с BLOB и CLOB могут работать обычные встроенные функции как со значениями типов VARCHAR2 и CHAR (используются перегруженные версии встроенных функций):