Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

C++. Энциклопедия пользователя - Либерти Дж.

Либерти Дж. C++. Энциклопедия пользователя — Москва, 2001. — 581 c.
Скачать (прямая ссылка): enciklopediyapolzovatelya2001.djvu
Предыдущая << 1 .. 200 201 202 203 204 205 < 206 > 207 208 209 210 211 212 .. 280 >> Следующая

NESTED TABLE empprojs STORE AS nested_proj_table;
/* Вставить в таблицу объектов */
INSERT INTO employees VALUES (12345, 'MIKE',
project_table(project_type(55555,'honda','orlando'),
project_type(66666,'toyota','miami')));
В этом примере показано, как создавать VARRAY с помощью операторов SQL:
/* Создать тип объекта */
CREATE TYPE account_type as OBJECT (accoun t_no INT,
account_type CHAR(2),
balance DEC(10,2));
/
/* Создать VARRAY с использованием типа объекта */
CREATE TYPE account_array AS VARRAY(10) OF account_type;
/
/* Создать тип объекта */
CREATE TYPE customer_type AS OBJECT (cust_no CHAR(5),
accounts account_array);
/
/* Создать таблицу с использованием типа объекта */
CREATE TABLE customers OF customer_type;
/* Вставить в таблицу объектов */
INSERT INTO customers
VALUES (55555, account_array(account_type(11,'С',1000.00) ,
account_type(22,'S', 2000.00)));
Использование внешних процедур, разработанных на языке C++
Поскольку Огас1е8 позволяет вызывать DLL-функции и процедуры кода PL/SQL, методы объектов могут быть реализованы как внешние процедуры языка C++. Использование внешних процедур, написанных на языке C++, позволяет получить эффективность 3GL; также можно использовать Win32 API.
Прежде, чем вызвать внешние процедуры PL/SQL, вы должны выполнить два следующих шага:
1. Зарегистрировать местонахождение DLL в словаре данных Огас1е8.
Create or replace library external.lib as 'e:/datacartridge/debug/cartridge.dll';
2. Объявить прототип функции C++ в словаре данных Огас1е8.
440
Живучесть объектов и шифрование
Часть IV
Рассмотрим пример, в котором используется тип объекта, методы которого реализованы как внешние процедуры C++:
Create or replace package data_package as
function ext_func (data CLOB) return binary_integer;
end;
/
create or replace package body data_package as
function ext_func (data CLOB) return binary_integer is external name "c_func" library external_lib language С with context parameters ( context,
data ОСXLOBLOCATOR
> ;
end;
/
create or replace type ext_objtype as object ( data CLOB,
member function ext_objtype_func return binary_integer
) ;
/
Create or replace type body ext_objtype is
member function ext_objtype_func return binary_integer is begin
return data_package.ext_func(data);
end;
end;
/
Прототип внешней функции может быть следующим: tinclude <oci.h>
tdefine DLLEXPORT declspec(dllexport) ________cdecl
int DLLEXPORT c_func (OCIExtProcContext *ctx, OCILobLocator *lobl); int c_func (OCIExtProcContext *ctx, OCILobLocator *lobl)
{
/*3десь разместить программный код функции */ return 0 ;
>
Внешний вызов может быть протестирован с помощью PL/SQL:
declare
i binary_integer; х ext_objtype;
begin
x : = ext_obj type(EMPTY_CLOB()); i := x.ext_objtype_func();
DBMS_OUTPUT.PUT_LINE(' ext_objtype_func () returned ' I I i) ;
end;
Если процесс загружает DLL без символьной отладочной информации, то вы можете воспользоваться отладчиком Visual C++ для установки точек останова и выявления ошибки. При реализации методов объектов в виде внешних процедур, написанных на языке C++, слушатель вызывает процедуру по требованию; следовательно, вы не сможете отладить процедуру с помощью стандартных методов. Для отладки в таких ситуациях в начало внешней процедуры можно поместить вызов Win32 API DebugBreak().
Рассмотрим объект DataStore, который может сохранять набор данных в символьном типе Oracle8 LOB (называемом CLOB). Над хранимыми данными можно проводить некоторые манипуляции, например, найти минимум, максимум, выполнить регрессию данных и т.п. Вот главные действия, которые необходимо выполнить для такой реализации:
1. Создать тип объекта для представления DataStore. Атрибуты и методы этого объекта должны отражать хранимые данные и функциональные возможности этого объекта. Объявим методы как external, поскольку тип требуемой обработки лучше реализуется с помощью языка C++:
Реализация живучести объектов с помощью реляционных баз данных
Глава 17
441
create or replace type DataStore as object ( pld Integer, name varchar2(10) , date_created date, value clob,
member function DataMinimum return Integer, member function DataMaximum return Integer, map member function DataToInt return Integer, pragma restrict_references(DataMinimum, WNDS, WNPS), pragma restrict_references(DataMaximum, WNDS, WNPS));
2. Объявить пакет, который будет использоваться для хранения всех внешних процедур:
create or replace package DataStore_package as
function datastore_findmin (data IN clob) return integer; function datastore_findmax (data IN clob) return integer; pragma restrict_references (datastore_findmin, WNDS, WNPS); pragma restrict_references (datastore_findmax, WNDS, WNPS);
end;
Для вызова упакованной функции из выражений SQL вы должны вызвать pragma RESTRICT REFE-RENCES в объявлении пакета (а не в теле пакета, поскольку тело упакованной функции скрыто). Pragma указывает компилятору PL/SQL не давать функции доступа на чтение/запись к таблицам и(или) переменным пакета. В предыдущем примере истинны следующие утверждения:
Предыдущая << 1 .. 200 201 202 203 204 205 < 206 > 207 208 209 210 211 212 .. 280 >> Следующая