|
Программирование >> Oracle
Внешние процедуры на языке С 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 байтов данных
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 при установке русского языка для сообщений. В примерах и описаниях оставлены сообщения на английском языке. - Прим. научн. ред.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |