|
Программирование >> Oracle
Пакет 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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |