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

1 ... 293 294 295 [ 296 ] 297 298 299 ... 469


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). Для определения фактического типа данных, который должен использоваться в языке С, обратитесь ко второй таблице.

Тип данных SQL или PL/SQL

Внешний тип данных

Стандартный тип

BINARY INTEGER, BOOLEAN, PLS INTEGER

[unsigned]char, [unsigned]short, [unsigned]int, [unsigned]long, sb1, sb2, sb4, ub1, ub2, ub4, size t

NATURAL, NATURALN,

POSITIVE, POSITIVEN,

[unsigned]char, [unsigned]short, [unsigned]int, [unsigned]long, sb1, sb2, sb4, ub1, ub2, ub4, size t

unsigned int

FLOAT, REAL

Float

float

DOUBLE PRECISION

Double

double



1 ... 293 294 295 [ 296 ] 297 298 299 ... 469

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