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

1 ... 147 148 149 [ 150 ] 151 152 153 ... 469


Глава 9

мой и работала на любой платформе, мы будем реализовывать ее средствами СУБД. Можно написать подпрограмму, которая будет использовать переменную типа BFILE для чтения файла операционной системы и выдавать его посимвольно на экран, показывая, где находятся символы возврата каретки (ASCII-код 13), перевода строки (ASCII-код 10), табуляции (ASCII-код 9) и другие специальные символы. На языке PL/SQL эта подпрограмма может выглядеть так:

tkyte@TKYTE816> create or replace

2 3 4 5 6 7 8 9 10 11 12 13 14 15

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

procedure file dump (p directory in varchar2,

p filename in varchar2)

type array is table of varchar2(5) index by binary integer;

array;

bfile;

number default 15; varchar2(30); number;

number default 1;

char(l);

l chars

l bfile

l buffsize

l data l len l offset

l char begin

- специальные случаи

- чтобы было понятно l chars(0) := \0; l chars(13) := \r ; l chars(10) :== \n; l chars(9) := \t;

l bfile := bfilename(p directory, dbms lob.fileopen(l bflie);

выдаем управляющие последовательности ,

p filename);

l len := dbms lob.getlength(l bfile);

while(l offset < l len)

loop

- выдаем смещение от начала файла в байтах dbms output.put(to char(l offeet,fm000000)

to char(l offset+l buffsize-l.

fmOOOOOO))

- теперь читаем BUFFSIZE байтов из l data := utl raw.cast to varchar2 (dbms lob.substr(l bfile.

файла для показа

l buffsize, l offset)) ;

- цикл по for i in 1 loop

l char

символам

. . length(l data) := substr(l data,i,l);

- если символ - печатный, просто выдаем его

if ascii (l char) between 32 and 126 then



Загрузка данных

4 3 44

45 46 47

50 51 52 53 54 55 56 57 58 59 60

dbms output.put(lpad(l char,3));

- если это один из представленных выше специальных

- символов,

- выдаем вместо него заданный текст elsif (l chars.exists(ascii(l char)))

then

dbms output.put(lpad(l chars(ascii(l char)), 3)) ;

- если это двоичные данные, выдаем их в

- шестнадцатиричном виде

else

dbms output.put(to char(ascii(l char),0X));

end if; end loop;

dbms output.new line;

l offset := l offset end loop;

dbms lob.close(l bfile);

l suffsize;

end;

Procedure created.

Подробнее о пакете DBMS LOB и данных типа BFILE можно прочитать в

приложении А в конце книги.

Итак, если взять файл данных следующего вида:

the Sales

the Accounting

tkyte@TKYTE816> host type demo17.dat 10,Sales,Virginia,01-april-2001,This is

Office in Virginia

20,Accounting,Virginia,13/04/2001,This is

Office in Virginia

30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting

Office in Virginia

40,Finance,Virginia,987268297,This is the Finance

Office in Virginia

tkyte@TKYTE816>

000001-000015

000016-000030

000031-000045

000046-000060

000061-000075

000076-000090

000091-000105

000106-000120

000121-000135

000136-000150 000151-000165

000166-000180

000181-000195

exec file dump(MY FILES, demol7.dat);

10 , S ia, 0 1, T h ales Vi r

cco u nia ,

This oun t i n

ales, Virgin l-april-20 0 is is the S

\r\n Office in

gini a

\r \n 2 0 , A nting,Virg i 13/0 4/2001,

is the Ace

in g \r\n Office Virginia



482 Глава 9

000196-000210 \r\n3 0 , Con su

000211-000225 1 t ing , Vi rginia,

000226-000240 14/04/2001 12:0

000241-000255 2:02, This is th

000256-000270 e Co nsulting\r\nO

000271-000285 ffice in Virgin

000286-000300 i a

000301-000315 \r\n4 0 ,Fi nance, V

000316-000330 irginia, 9872682

000331-000345 9 7 , Thi s is the

000346-000360 F i na n ce\r\n Office

000361-000375 in Virginia 000376-000390

000391-000405 \r \n

PL/SQL procedure successfully completed.

то с помощью этой утилиты можно убедиться, что все записи имеют длину 101 байт. Если посмотреть на строку данных, начинающуюся с 000091-000105, в конце ее можно обнаружить последовательность (\r\n). Поскольку мы знаем, что последний символ в этой строке находится в позиции 105 от начала файла, то можем отсчитать символы обратно и убедиться, что символ \n имеет смещение 101. Далее в строке, начинающейся с 000196-000210, мы по смещению 202 от начала файла видим еще один перевод строки, представляющий конец записи.

Теперь, зная точно, что все записи имеют длину 101 байт, мы готовы загружать их с помощью представленного выше управляющего файла с конструкцией FIX 101. В результате получим:

tkyte@TKYTE816> select comments comments from dept; COMMENTS

This is the Sales Office in Virginia

This is the Accounting Office in Virginia

This is the Consulting Office in Virginia

This is the Finance Office in Virginia

Обратите внимание, что каждая загруженная строка завершается символом новой строки - добавленная нами завершающая кавычка является первым символом в новой



1 ... 147 148 149 [ 150 ] 151 152 153 ... 469

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