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

1 ... 311 312 313 [ 314 ] 315 316 317 ... 469


1356

Глава 18

ORA-06527 ошибка SQLLIB внешней процедуры: %s

$ oerr ora 6527

06527, 00000, External procedure SQLLIB error: %s

* Причина: при выполнении внешней процедуры, написанной с помощью

Рго*С, возникла ошибка в библиотеке sqllib.

* Действие: тест сообщения позволит понять, какая именно ошибка произошла в библиотеке SQLLIB. Обратитесь к руководству

Oracle Error Messages and Codes, где можно найти полное

описание причин ошибки, и выполните соответствующие

действия.

С этой ошибкой все понятно. Более детальная информация о причинах будет представлена в сообщении.

Резюме

В этой главе мы рассмотрели тонкости использования внешних процедур:

поддержка информации о состоянии с помощью контекстов;

использование независимых от ОС функций для работы с файлами;

параметризация кода внешней процедуры с помощью внешних файлов параметров;

оснащение кода средствами отладки (с помощью макроса debugf), позволяющими найти причину проблем;

приемы написания безопасного кода (всегда передавать контекст, всегда передавать индикаторы значений NULL и т.д.);

как использовать универсальный шаблон для быстрой разработки внешних процедур с широкими функциональными возможностями;

различия между внешними процедурами, использующими исключительно библиотеку OCI, и процедурами, использующими средства прекомпилятора Рго*С;

как сопоставлять, принимать и передавать основные типы данных PL/SQL во внешние функции на языке С;

как передавать и принимать наборы данных.

Имея представленные выше универсальный шаблон и файлы управления проектом, вы получили все необходимое для написания внешней процедуры от начала до конца за несколько минут. Самое сложное - сопоставление типов данных, но по представленным в этой главе таблицам это легко сделать. Они вам подскажут, какой тип использовать для передачи данных. Далее следуйте представленным в примерах принципам передачи параметров (всегда передавать контекст, всегда передавать атрибут MAN для строк и данных типа RAW, всегда передавать индикаторные переменные и т.д.). обеспечит создание эффективных внешних процедур в кратчайшие строки.




Хранимые процедуры на

языке Java

В сервере Oracle 8.1.5 впервые появилась возможность использовать для реализации храним1х процедур язык Java. Для 99 процентов задач всегда хватало возможностей языка PL/SQL, и его по-прежнему можно использовать. В Oracle 8.0 ранее появилась возможность реализовать процедуры на языке С (см. главу 18). Хранимые процедуры на языке Java (еще один вид внешних процедур) - естественное расширение этой возможности, позволяющее использовать язык Java в тех случаях, когда раньше приходилось программировать на С или С+ + .

Если необходимо разработать хранимую процедуру, теперь есть как минимум три возможности: использовать язык PL/SQL, Java или С. Я перечислил их в порядке предпочтения. Большую часть обработки в базе данных можно выполнить на PL/SQL. Если что-то нельзя сделать с помощью PL/SQL (в основном это касается интерфейсов с ОС), вступает в игру язык Java. Язык С используется при наличии уже созданного кода на С или в тех случаях, когда нельзя решить задачу средствами Java.

Эта глава не раскрывает основы Java, интерфейса JDBC или программирования с помощью SQLJ. Предполагается, что читатель хоть немного знаком с языком Java и сможет разобраться в небольших фрагментах Java-кода. Предполагается также общее знание интерфейса JDBC и прекомпилятора SQLJ, хотя при наличии минимального опыта использования Java вы легко сможете понять фрагменты кода, связанные с JDBC

и SQLJ.



1360

Глава 19

Когда используются хранимые процедуры на языке Java?

Внешние процедуры на языке Java отличаются от процедур на С тем, что, как и программные единицы PL/SQL, они выполняются встроенной виртуальной Java-машиной (JVM) сервера Oracle, непосредственно в адресном пространстве сервера. Чтобы использовать внешние процедуры на языке С, необходимо сконфигурировать процесс прослушивания, настроить файл TNSNAMES.ORA и запустить отдельный процесс. При использовании языка Java все это не нужно, поскольку как интерпретируемый язык он считается безопасным (как и PL/SQL). Нельзя создать Java-функцию, переписывающую часть области SGA. Это и хорошо, и плохо, как выяснится по ходу обсуждения. Тот факт, что работа происходит в одном адресном пространстве, обеспечивает более быстрое взаимодействие между кодом на Java и сервером, в частности происходит меньше переключений контекста между процессами на уровне ОС. С другой стороны, однако, Java-код всегда работает с правами владельца ПО Oracle , поэтому хранимая процедура на Java (при наличии соответствующих привилегий) может переписать файл параметров инициализации сервера, INIT.ORA (или другие, еще более важные файлы, например файлы данных).

Лично я постоянно использую небольшие фрагменты Java-кода для реализации того, что невозможно сделать с помощью PL/SQL. Например, в приложении А, посвященном основным стандартным пакетам, я демонстрирую, как я реализовал пакет для работы с сокетами TCP/IP при помощи Java. Я создавал его для версии Oracle 8.1.5, до появления пакета UTL TCP (который тоже написан на языке Java), и предпочитаю использовать его до сих пор. Я также использую средства языка Java для передачи сообщений электронной почты с сервера. И для этих целей уже существует стандартный пакет, UTL SMTP (тоже реализованный на языке Java), позволяющий отправлять простые сообщения, но непосредственное использование языка Java открывает множество других возможностей, включая передачу (и получение) сообщений электронной почты с вложениями.

Я интенсивно использую пакет UTL FILE для чтения и записи файлов в PL/SQ Одна из возможностей, которых не хватает пакету UTL FILE, - получение списка файлов в каталоге. С помощью языка PL/SQL его получить нельзя, а на Java - элементарно.

Иногда необходимо выполнить команду ОС или программу из среды сервера. В этом случае язык PL/SQL тоже не поможет, а Java позволит легко решить задачу. Изредка мне необходимо узнать часовой пояс, установленный на сервере. В PL/SQL его получить нельзя, а вот с помощью Java - можно (эту возможность мы рассмотрим в приложении А при изучении стандартного пакета UTL TCP). Надо измерять время с точностью до миллисекунд? В Oracle 8i с помощью Java это можно сделать.

Если постоянно необходимо подключаться к СУБД DB2 для выполнения запросов, это можно сделать с помощью шлюза (Transparent Gateway) для СУБД DB2. Это позволит без ограничений выполнять соединения таблиц в разнородных базах данных, распределенные транзакции, прозрачную двухэтапную фиксацию и использовать много других возможностей. Но если необходимо выполнить запрос или изменение в базе дан-



1 ... 311 312 313 [ 314 ] 315 316 317 ... 469

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