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

1 ... 308 309 310 [ 311 ] 312 313 314 ... 469


Внешние процедуры на языке С 1347

Directory created. SQI>

SQL> declare

2 l blob blob;

3 l clob clob;

4 l bfile bfile;

5 begin

6 insert into demo

7 values (empty blob(), empty clob())

8 returning theBlob, theClob into l blob, l clob; 9

10 l bfile := bfilename (MY FILES, something.big); 11

12 dbms lob.fileopen(l bfile);

14 dbms lob.loadfromfile(l blob, l bfile,

15 dbms lob.getlength(l bfile)); 16

17 dbms lob.loadfromfile(l clob, l bfile,

18 dbms lob.getlength(l bfile)); 19

20 dbms lob.fileclose(l bfile);

21 commit;

22 end;

23 /

PL/SQL procedure successfully completed.

Итак, мы загрузили файл something.big в базу данных (сначала - как данные типа BLOB, затем - как данные типа CLOB). Теперь снова запишем содержимое этих больших объектов во внешние файлы:

SQL> declare

2 l bytes number;

3 l bfile bfile;

4 begin

5 for x in (select theBlob from demo)

6 loop

.7 l bytes := lob io.write(&PATH,blob.dat, x.theBlob);

8 dbms output.put line(Записали l bytes байтов -> данных типа blob) ;

9 end loop;

11 for x in (select theClob from demo)

12 loop

13 lbytes := lob io.write(&PATH,clob.dat, x.theclob);

14 dbms output.put line(Записали lbytes байтов -> данных типа clob);

15 end loop; 16

17 l bfile := bfilename(MY FILES, something.big);

18 dbms lob.fileopen(l bfile);

19 1 bytes := lob io.write(&PATH,bfile.dat, l bfile);



1348

Глава 18

2 0 dbms output.put line(Записали

-> типа bfile);

dbms lob.fileclose(l bfile);

l bytes

байтов данных

end;

l bytes := lob io.write(&PATH,blob.dat, x.theBlob); l bytes := lob io.write(/tmp/, blob.dat, x.theBlob); l bytes : = lob io.write(&PATH, clob.dat, x.theClob); l bytes := lob io.write(/tmp/, clob.dat, x.theClob) ; l bytes := lob io.write(SPATH,bfile.dat, l bfile); l bytes := lob io.write(/tmp/,bfile.dat, l bfile); Записали 1107317 байт данных типа blob Записали 1107317 байт данных типа clob Записали 1107317 байт данных типа bfile

PL/SQL procedure successfully completed.

Это показывает, что мы успешно вызвали внешнюю процедуру и трижды записали файл. Каждый раз размер файла был одним и тем же (как и ожидалось). Теперь создадим временный большой объект, скопируем в него файл и запишем объект в другой файл, чтобы убедиться, что можно работать и с временными большими объектами:

SQL> declare

10 11 12 13

l tmpblob blob; l blob blob;

l bytes number;

begin

select theBlob into l blob from demo;

dbms lob.createtemporary(l tmpblob,TRUE); dbms lob.copy(l tmpblob,l blob,dbms lob.getlength(l blob),1,1) ;

Ibytes := lob io.write(&PATH,tempblob.dat, ltmpblob); dbms output.put line(Записали lbytes байтов временного -> большого объекта);

DBMS LOB.FREETEMPORARY(l tmpblob);

15 16 17 old

END;

12: 12:

l bytes := lob io.write(&PATH,tempblob.dat, l bytes := lob io.write(/tmp/,tempblob.dat,

l tmpblob); l tmpblob);

Записали 1107317 байтов временного большого объекта PL/SQL procedure successfully completed.

Таким образом, запись прошла успешно и, к счастью, записано точно такое же количество байтов. Последний шаг - проверить с помощью утилит ОС, что записанные файлы идентичны загруженному файлу:

SQL> host &CMD SPATH.something.big &PATH.blob.dat

Files /tmp/something.big and /tmp/blob.dat are identical

SQL> host &CMD SPATH.something.big &PATH.clob.dat

Files /tmp/something.big and /tmp/clob.dat are identical



Внешние процедуры на языке С 1349

S> host &CMD &PATH.something.big &PATH.bfile.dat

Files /tmp/something.big and /tmp/bfile.dat are identical

SQL> host &CMD &PATH.something.big &PATH.tempblob.dat

Files /tmp/something.big and /tmp/tempblob.dat are identical

Мы проверили работу нового пакета LOB IO.

Возможные ошибки

Ниже предcтавлен cпиcок типичн1х ошибок, которые возникнуть при иcполь-зовании внешних процедур. Некоторые из них м1 уже обcуждали, например ошибку, возникающую при неправильном конфиировании процеccа проcлушивания или файла TNSNAMES.ORA. Но многие ошибки еше не раccмотренI. Mi займемcя ими cейчаc: я раccкажу, когда они возникать и что cделать, чтобы их иcправить.

Вcе эти cообщения об ошибках опиcанI также в руководcтве Oracle 8i Error Messages Manual.*

0RA-28575 невозможно открыть соединение RPC с агентом внешней процедуры

28575, 00000, unable to open RPC connection to external procedure agent * Причина: инициализация подключения по сети к агенту внешних

процедур не прошла успешно. Это может быть связано с

проблемами сети, неправильной конфигурацией процесса

прослушивания или некорректным кодом переноса.

* Действие: проверить конфигурацию процесса прослушивания в файлах LISTENER.ORA и TNSNAMES.ORA или проверить сервер Oracle

Names.

та ошибка почти вcегда cвидетельcтвует об ошибках конфигурации в файлах TNSNAMES.ORA или LISTENER.ORA. Возможные причины ее возникновения уже раccматривалиcь ранее, в разделе Конфигурирование cервера .

ORA-28576 потеряно соединение RPC с агентом внешней процедуры

28576, 00000, lost RPC connection to external procedure agent

* Причина: произошла фатальная ошибка сетевого соединения, в агенте

внешних процедур или в вызванной внешней процедуре после

успешной организации взаимодействия.

* Действие: сначала проверьте вызываемый код внешней процедуры,

поскольку наиболее вероятной причиной получения этого

сообщения об ошибке является аварийное завершение

вызванной С-функции. Если - нет, проверьте сеть. Устраните

проблему, если она обнаружена. Если все кооненты

функционируют нормально, но проблема остается, она может

быть связана с внутренней логической ошибкой в коде

передачи RPC (вызова удаленной процедуры). Свяжитесь с

представителем службы поддержки.

* Текст сообщения об ошибке сначала приведен так, как он выдается СУБД Oracle версии 8.0.5.0.0 при установке русского языка для сообщений. В примерах и описаниях оставлены сообщения на английском языке. - Прим. научн. ред.



1 ... 308 309 310 [ 311 ] 312 313 314 ... 469

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