![]() |
|
Программирование >> Oracle
Глава 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 Обратите внимание, что каждая загруженная строка завершается символом новой строки - добавленная нами завершающая кавычка является первым символом в новой
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |