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

1 ... 395 396 397 [ 398 ] 399 400 401 ... 469


Пакет DBMS LOB 1617

53 - Теперь надо вернуть первые 40 0 0 байт, поскольку больше

54 - язык SQL все равно не позволит увидеть. После обработки в

55 - строке может оказаться более 4000 символов, поскольку GHR(10)

56 - превратится в \n (используется два байта) и т.д., т.е. это 5 7 - необходимо.

58 return substr(l return,l,4000);

59 end;

60 /

Function created.

scott@DEV816>select id,

2 dbms lob.getlength(theBlob) len,

3 clean(theBlob,3 0,40) piece,

4 dbms lob.substr(theBlob,40,30) raw data

5 from demo;

ID LEN PIECE RAW DATA

1 3498 \ndrop sequence 0A64726F702073657175656E636520

blob seq;\n\ncreate 626G6F625F7365713B0A0A63726561

table d 7465207461626G652064

2 2048 TE\nRTABLES\nl024\nO 54450A525441424G45530A31303234

\n2 8\n40 0 0\n........0A3 0 0A323 8 0A343 03 03 0 0A0 0 01001F

. . . . . .00010001000000000000

Как видите, теперь можно просматривать текстовые части данных типа BLOB в среде SQL*Plus, как обычный текст, воспользовавшись функцией CLEAN. Если использовать функцию DBMS LOB.SUBSTR, возвращающую значение типа RAW, мы получим результат в шестнадцатиричном виде. Просматривая шестнадцатиричное представление, можно убедиться, что первый байт первого объекта типа BLOB имеет значение 0A, или CHR(10) - это символ новой строки. В текстовом представлении большого объекта можно увидеть, что функция CLEAN преобразовала 0А в \n (символ новой строки). Это подтверждает, что функция выполнена, как предполагалось. Во втором объекте типа BLOB мы видим много двоичных нулей (значений 00 в шестнадцатиричном представлении) в обычном представлении содержимого файла expdat.dmp. В функции CLEAN, как видите, они преобразуются в точки, поскольку подобные специальные символы, при выдаче непосредственно на терминал, будут выдаваться в нераспознаваемом виде (как мусор).

Помимо функции CAST TO VARCHAR2 пакет UTL RAW содержит функцию CAST TO RAW. Как было показано ранее, в объект типа BLOB можно поместить обычный текст. Если для изменения этих данных надо использовать строки, пришлось бы преобразовывать их в шестнадцатиричный вид. Например, следующий оператор:

scott6DEV816> update demo

2 set theBlob = Hello World

3 where id - 1

set theBlob = Hello World

ERROR at line 2:

ORA-01465: invalid hex number



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

не работает. При неявном преобразовании данных из типа VARCHAR2 в RAW предполагается, что строка Hello World состоит из шестнадцатиричных цифр. Сервер Oracle берет первые два байта, преобразует их из шестнадцатиричного в десятичный вид и присваивает полученное значение первому байту данных типа RAW, и т.д. Надо либо преобразовать строку Hello World в шестнадцатиричный вид, либо изменить тип данных с VARCHAR2 на RAW - изменить только тип данных, не меняя сами байты данных. Например:

scott@DEV816> update demo

2 set theBlob = utl raw.cast to raw(Hello World)

3 where id = 1

1 row updated. scott@DEV816> commit; Coit complete.

scott@DEV816>select id,

2 dbms lob.getlength(theBlob) len,

3 clean(theBlob) piece,

4 dbms lob.substr(theBlob,40,l) raw data

5 from demo

6 where id =1;

ID LEN PIECE RAW DATA

1 11 Hello World 48656C6C6F20576F726C64

Использование UTL RAW.CAST TO RAW(Hello World*) обычно намного проще преобразования строки Hello World в шестнадцатиричное представление -48656C6C6F20576F726C64.

Преобразование данных типа LONG/LONG RAW в большой объект

Преобразовать данные типа LONG или LONG RAW в большой объект очень просто. Стандартная функция TO LOB языка SQL позволяет это сделать. Использование функции TO LOB, однако, весьма ограничено. Ее можно применять исключительно в операторах INSERT или CREATE TABLE AS SELECT и только в языке SQL (но не в SQL).

В результате первого ограничения нельзя выполнять операторы, подобные следующему:

alter table t add column clob column;

update t set clob column = to lob(long column);

alter table t drop column long column;

При попытке выполнения UPDATE будет получено сообщение об ошибке:

ORA-00932: inconsistent datatypes



Пакет DBMS LOB 1619

Для множественного преобразования типа в существующих таблицах со столбцами LONG/LONG RAW придется создавать новую таблицу. В большинстве случаев это вполне допустимо, поскольку данные типа LONG и LONG RAW хранятся в самой строке (inline) вместе с остальными данными таблицы. Если преобразовать их в большие объекты, а затем удалить столбец типа LONG, таблица окажется не в лучшем виде: будет много выделенного и неиспользуемого пространства. Такие таблицы лучше пересоздавать.

Второе ограничение означает, что функцию TO LOB нельзя использовать в PL/SQL-блоке. Чтобы использовать TO LOB в PL/SQL, придется прибегнуть к динамическому SQL. Вскоре я это продемонстрирую.

В следующих примерах мы рассмотрим два способа использования функции TO LOB. Один из них - использование функции TO LOB в операторе CREATE TABLE AS SELECT или INSERT INTO. Другой способ пригодится, когда данные должны остаться в столбце типа LONG или LONG RAW. Например, старому приложению нужен именно тип LONG. Хотелось бы предоставить другим приложениям возможность работать с этим столбцом как с большим объектом, чтобы можно было обрабатывать его значение в PL/SQL по частям с помощью функций пакета DBMS LOB, например READ и SUBSTR.

Начнем с создания данных типа LONG и LONG RAW:

ops$tkyte@DEV816> create table longtable

2 (id int primary key,

3 data long

Table created.

ops$tkyte@DEV816> create table long raw table

2 (id int primary key,

3 data long raw

Table created.

ops$tkyte@DEV816> declare

2 l tmp long := Hello World;

3 l raw long raw;

4 begin

5 while(length(l tmp) < 32000)

6 loop

7 l tmp := l tmp Hello World;

8 end loop; 9

10 insert into long table

11 (id, data) values

12 (1, l tmp);

14 l raw := utl raw.cast to raw(l tmp); 15

16 insert into long raw table

17 (id, data) values



1 ... 395 396 397 [ 398 ] 399 400 401 ... 469

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