|
Программирование >> Oracle
1302 Глава 18 in strArray, p out out strArray) library demoPassing 125 procedure pass(p in 126 as 127 language С name pass strArray 128 with context parameters 129 (CONTEXT, 13 0 p in OCIColl, p in INDICATOR short, 131 p out OCIColl, p out INDICATOR short) ; Далее следует процедура, передающая и принимающая данные типа RAW. В данном случае используется как атрибут MAXLEN (который уже использовался в представленной выше процедуре с параметрами типа VARCHAR2), так и атрибут LENGTH. Необходимо передавать длину данных типа RAW, поскольку они содержат двоичную информацию, включая нули, поэтому фактическую длину строки в программе на языке С определить невозможно, и сервер Oracle не сможет понять, какого объема данные возвращаются. Для данных типа RAW оба атрибута, LENGTH и MAXLEN, принципиально важны. Атрибут LENGTH передавать обязательно, a MAXLEN - желательно. 140 141 142 143 144 145 146 147 149 150 151 152 library demoPassing procedure passraw(pin in raw, pout out raw) language С name pass raw with context parameters (CONTEXT, p in RAW, p in INDICATOR short, p out RAW, p out INDICATOR short, p out LENGTH int) ; p in LENGTH int, p out MAXLEN int. void pass long raw ( OCIExtProcContext *, /* unsigned char *, /* short , /* int , /* unsigned char *, /* 1 : контекст 2 : P IN */ 3 : P IN (индикатор) 4 : P IN (длина) */ 5 : P OUT */ short *, /* 6 : P OUT (индикатор) */ int *, /* 7 : P OUT (максимальная длина) */ /* 8 : P OUT (длина) */ Далее идет процедура, принимающая и передающая в функцию языка С данные PL/SQL типа BINARY INTEGER. В этом случае тип BINARY INTEGER сопоставляется встроенному типу данных int языка С: 156 157 158 159 160 161 162 procedure pass int(p in in binary integer, p out out binary integer) as language С name pass int library demoPassing with context parameters (CONTEXT, p in int, p in INDICATOR short, p out int, p out INDICATOR short); void pass int Внешние процедуры на языке С 1303 164 165 166 167 168 169 OCIExtProcContext int short int short /* 1 : контекст */ /* 2 : P IN */ /* 3 : P IN (индикатор) */ /* 4 : P OUT */ /* 5 : P OUT (индикатор) */ Ниже представлены оболочки для трех функций, возвращающих числа, даты и строки. В них используется новое ключевое слово RETURN. При сопоставлении с функцией необходимо использовать ключевое слово RETURN в качестве последнего параметра в списке параметров. При этом задается тип возвращаемого значения, а не формального параметра функции. Ниже я буду указывать три параметра в SQL-оболоч-ке и только два из них в используемом прототипе функции на языке С. Параметр RIURN OCINumber задает тип данных, которые будут возвращаться в соответствии с прототипом функции OCINumber *retum number. Я включил индикаторную переменную даже для возвращаемого значения, чтобы можно было при необходимости вернуть значение NULL. Если не включить в список параметров индикаторную переменную, вернуть значение NULL будет невозможно. Как было показано в примере для строк, можно также возвращать атрибут LENGTH, но не MAXLEN, поскольку этот атрибут можно задавать только для параметров, передаваемых в режиме OUT, память для которых выделяет сервер Oracle. При возврате значений, поскольку за выделение памяти отвечает разработчик, атрибут MAXLEN не имеет смысла. 175 176 178 179 191 192 194 195 196 197 198 199 function return number return number as language С name return number library demoPassing with context parameters (CONTEXT, RETURN INDICATOR short, RETURN OCINumber); OCINumber *return number OCIExtProcContext short * /* * /* 1 : контекст */ 2 : RETURN (индикатор) */ function return date return date as language С name return date library demoPassing with context parameters (CONTEXT, RETURN INDICATOR short, RETURN OCIDate); OCIDate *return date OCIExtProcContext short *, /* 1 : контекст */ * /* 2 : RETURN (индикатор) */ function return string return varchar2 language С name return string library demoPassing 1304 200 201 202 203 204 205 206 207 208 209 Глава 18 with context parameters (CONTEXT, RETURN INDICATOR short, RETURN LENGTH int, RETURN STRING); char *return string ( OCIExtProcContext short int /* 1 : контекст */ /* 2 : RETURN (индикатор) */ /* 3 : RETURN (длина) */ end demo passing pkg; / Package body created. В последней функции я использую как атрибут LENGTH, так и индикаторную переменную. Так я могу передать серверу Oracle длину возвращаемой строки. Итак, мы имеем: спецификацию пакета, определяющую его основные функции; набор нов1х типов массивов SQL; объект-библиотеку в базе данных, задающую соответствие для еще не созданной библиотеки extproc.dll; тело пакета, представляющее собой спецификации SQL для функций на языке С. Эти спецификации сообщают серверу Oracle, какие данные (индикаторные переменные, параметры, контексты и т.д.) и как (на уровне типа данных) передавать внешней процедуре. Теперь, после рассмотрения примера, имеет смысл представить таблицы соответствия типов данных. Одна таблица показывает, какие внешние типы данных можно использовать для SQL-типа Х. Затем для выбранного внешнего типа, показано, какой тип данных языка С будет фактически использоваться. Таблицы соответствия типов данных можно найти в руководстве Oracle Application Developers Guide - Fundamentals; здесь они представлены просто для справки. Учтите, что внешний тип данных - это не тип, используемый в языке С (и не тип, используемый в языке SQL или PL/SQL). Для определения фактического типа данных, который должен использоваться в языке С, обратитесь ко второй таблице.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |