Программирование >>  Oracle 

1 ... 397 398 399 [ 400 ] 401 402 403 ... 469


Пакет DBMS LOB 1623

1355104 redo size

1013 bytes sent via SQL*Net to client

871 bytes received via SQL*Net from client

4 SQL*Net roundtrips to/from client

2 sorts (memory)

0 sorts (disk)

99 rows processed

Сгенерировано лишь около 1 Мбайт информации в журнал. Это преобразование выполняется существенно быстрее, при этом генерируется намного меньше данных в журналы повторного выполнения. Конечно, как и для всех невосстанавливаемых операций, необходимо обеспечить резервное копирование базы данных как можно раньше, чтобы новые объекты можно было восстановить. Иначе в случае сбоя диска преобразование данных придется выполнять заново.

Представленный выше пример нельзя повторить непосредственно. Уменя случайно под рукой оказалась таблица IMAGE, содержащая около 200 Мбайт данных. Она использовалась для демонстрации множественных однократных преобразований и влияния опции NOLOGGING на объем генерируемых при этом данных повторного выполнения.

Оперативное преобразование типа данных

Во многих случаях необходимо читать данные типа LONG или LONG RAW в различных средах, но оказывается, что это не получается. Например, при использовании языка PL/SQL, если объем данных типа LONG RAW превышает 32 Кбайт, их практически невозможно прочитать. В других языках и интерфейсах тоже есть проблемы с данными типа LONG и LONG RAW. C помощью функции TO LOB и временной таблицы, однако, можно оперативно преобразовать данные типа LONG или LONG RAW в тип CLOB или BLOB. Это очень удобно, например, при использовании средств загрузки файлов в OAS4.X или WebDB. Эти средства загружают документы по сети (через Web) в таблицу базы данных, но, к сожалению, загружают они их в столбец типа LONG RAW. Это делает практически невозможной работу с документами в PL/SQL. Представленные ниже функции показывают, как обеспечить прозрачный доступ к таким данным через промежуточный BLOB-объект.

Начнем с создания временной таблицы для хранения преобразованного объекта типа CLOB/BLOB и последовательности, идентифицирующей строку:

ops$tkyte@DEV816> create global temporary table lob temp

2 (id int primary key,

3 c lob clob,

4 b lob blob

Table created.

ops$tkyte@DEV816> create sequence lob temp seq; Sequence created.



1624 Приложение А

Теперь создадим функции TO BLOB и TO CLOB. Эти функции используют для оперативного преобразования данных типа LONG или LONG RAW следующий подход.

Пользователь выбирает идентификатор строки из таблицы со столбцом типа LONG или LONG RAW, а не значение столбца LONG или LONG RAW в этой строке. Функции передается имя столбца типа LONG, имя таблицы и идентификатор нужной строки.

Функция получает последовательный номер, идентифицирующий строку, которая будет создаваться во временной таблице.

С помощью динамического SQL к указанному столбцу типа LONG или LONG

RAW применяется функция TO LOB. Использование динамического SQL не только делает функцию универсальной (она может работать со столбцом типа LONG в любой таблице), но и позволяет непосредственно вызывать функцию TO LOB

в языке PLSQL.

Функция считывает из временной значение созданного объекта типа BLOB или CLOB таблицы и возвращает вызывающему.

Вот код для функций TO BLOB и TO CLOB:

ops$tkyte@DEV816> create or replace

2 function to blob(p cname in varchar2,

3 p tname in varchar2,

4 p rowid in rowid) return blob

5 as

6 l blob blob;

7 l id int;

8 begin

9 select lob temp seq.nextval into l id from dual; 10

11 execute immediate

12 insert into lob temp (id,b lob)

13 select :id, to lob( p cname )

14 from p tname

15 where rowid = :rid

16 using IN l id, IN p rowid; 17

18 select b lob into l blob from lob temp where id - l id ;

20 return l blob;

21 end;

22 /

Function created.

ops$tkyte@DEV816> create or replace

2 function to clob(p cname in varchar2,

3 p tname in varchar2,

4 p rowid in rowid) return clob

5 as

6 l clob clob;

7 l id int;



Пакет DBMS LOB 1625

8 begin

9 select lob temp seq.nextval into l id from dual;

11 execute immediate

12 insert into lob temp (id,c lob)

13 select :id, to lob( p cname )

14 from p tname

15 where rowid = :rid

16 using IN l id, IN p rowid;

18 select c lob into l clob from lob temp where id = l id ;

20 return l clob;

21 end;

22 /

Function created.

Теперь можно продемонстрировать использование этих функций с помощью простого PL/SQL-блока. Данные типа LONG RAW в BLOB будут преобразованы, и выдана длина полученного объекта и небольшая часть его данных:

ops$tkyte@DEV816> declare

2 l blob blob;

3 l rowid rowid;

4 begin

5 select rowid into l rowid from long raw table;

6 l blob :=to blob(data, long raw table, l rowid);

7 dbms output.put line(dbms lob.getlength(l blob));

8 dbms output.put line(

9 utl raw.cast to varchar2(

10 dbms lob.substr(l blob,41/l)

11 )

12 );

13 end;

14 /

32003

Hello World Hello World Hello World Hello PL/SQL procedure successfully completed.

Для тестирования функции TO CLOB применяется практически такой же код, но использовать средства пакета UTL RAW не нужно:

ops$tkyte@DEV816> declare

2 l clob clob;

3 l rowid rowid;

4 begin

5 select rowid into l rowid from long table;

6 l clob :=to clob(data, long table, l rowid);

7 dbms output.put line(dbms lob.getlength(l clob));

8 dbms output.put line(dbms lob.substr(l clob,41,1));

9 end;

10 /



1 ... 397 398 399 [ 400 ] 401 402 403 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика