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

1 ... 300 301 302 [ 303 ] 304 305 306 ... 469


Внешние процедуры на языке С 1323 (*p oCLOB i= OCI IND NULL)? выходной : );

term(myCtx);

Следующие три функции демонстрируют, как передавать и принимать массивы данных во внешней процедуре. Если помните, мы создали несколько табличных типов в SQL: numArray, dateArray и strArray. Эти типы будут использоваться для демонстрации. Функции будут показывать, сколько элементов передано в массиве, в]давать их значения и наполнять этими элементами массив, переданный в режиме OUT.

В этих функциях, работающих с массивами, мы будем использовать набор функций OCIColl*. Для работы с наборами (массивами) можно использовать около 15 функций, позволяющих выполнять итерацию по элементам, получать или устанавливать значения элементов и т.п. Ниже использованы следующие наиболее типичные функции:

OCICollSize, для получения количества элементов в массиве;

OCICollGetElem, для получения i-го элемента массива;

OCICollAppend, для добавления элемента в конец массива.

Полн1й список имеющихся функций можно найти в руководстве Oracle Call Interface Programmers Guide.

Начнем с массива чисел. Эта функция будет проходить по всем элементам входного набора, выдавать их значения и присваивать соответствующим элементам выходного набора:

#ifdef WIN declspec (dllexport)

#endif

void passnumArray (OCIExtProcContext * ctx /* CD */,

OCIColl * p in /* OCICOL */,

short P in i /* INDICATOR short */,

OCIColl ** p out /* OCICOL */,

short * p out i /* INDICATOR short */

ub4 arraySize;

double tmp dbl ; boolean exists; OCINumber *ocinum; int i;

myCtxStruct*myCtx;

if ((myCtx = init(ctx)) == NULL) return;

debugf(myCtx, Входим в функцию Pass numArray );

if (p in i == OCI IND NULL) {

raise application error(myCtx, ERROR ARRAY NULL,

Входной массив - NULL ) ;



1324

Глава 18

else

if (OCICollSize(myCtx->envhp, myCtx->errhp,

p in, &arraySize) != OCI SUCCESS)

else

raise application error(myCtx,ERROR OCI ERROR,

%s ,lastOciError(myCtx));

debugf (myCtx, for(i - 0; i < {

Входной массив состоит из %d элементов , arraySize); arraySize;

if (OCICollGetElem(myCtx->envhp, myCtx->errhp, p in, i.

Sexists, (dvoid*)&ocinum, 0) != OCI SUCCESS)

raise application error(myCtx,ERROR OCI ERROR,

%s ,lastOciError(myCtx));

break;

(OCINumberToReal( myCtx->errhp, ocinum,

sizeof(tmp dbl), &tmp dbl)

!= OCI SUCCESS)

raise application error(myCtx,ERROR OCI ERROR, %s ,

lastOciError(myCtx));

break;

debugf(myCtx, p in[%d] = %g , i, tmp dbl); if (OCICollAppend(myCtx->envhp, myCtx->errhp,

*p out) != OCI SUCCESS )

ocinum, 0,

raise application error(myCtx,ERROR OCI ERROR,

%s ,lastOciError(myCtx));

break;

debugf(myCtx, Элемент добавлен в конец другого массива );

*p out i = OCI IND NOTNULL;

term(myCtx);

Следующие две функции - для массивов строк и дат. Они очень похожи на представленную выше функцию, работающую с массивами чисел, поскольку все три функции работают с данными типа OCIColl *. Пример для типа данных strArray интересен тем, что в нем впервые используется новый тип данных библиотеки OCI - OCIString (это не то же самое, что тип char *). При использовании типа данных OCIString необходимо работать со сс1лками на ссылки. Для строк и дат мы будем выполнять те же действия, что и в представленном ранее примере для чисел:

#ifdef WIN NT declspec (dllexport)



Внешние процедуры на языке С

1325

#endif

void pass strArray

(OCIExtProcContext

* ctx

CONTEXT

OCIColl *

p in

OCICOL

short

P in i

INDICATOR short

OCIColl **

p out

OCICOL

short *

p out i

INDICATOR short

boolean OCIString int text

myCtxStruct*myCtx;

if ((myCtx = init(ctx))

arraySize; exists; * * ocistring; i;

*txt;

NULL) return;

debugf( myCtx, Вход в функцию Pass strArray );

if (p in i = OCI IND NULL) {

raise application error(myCtx, ERROR ARRAY NULL,

Входной массив - NULL ) ;

else if (OCICollSize( myCtx->envhp, myCtx->errhp,

p in, &arraySize) != OCI SUCCESS)

raise application error(myCtx,ERROR OCI ERROR,

%s ,lastOciError(myCtx));

else

debugf (myCtx, Входной массив состоит из %d элементов , arraySize);

for(i = 0; i < arraySize;

if (OCICollGetElem(myCtx->envhp, myCtx->errhp, p in, i,

&exists, (dvoid*)socistring, 0) != OCI SUCCESS)

raise application error(myCtx,ERROR OCI ERROR,

%s ,lastOciError(myCtx));

break;

txt = OCIStringPtr(myCtx->envhp, *ocistring); debugf( myCtx, p in[%d] = s, size = %d, exists = %d , i, txt, OCIStringSize(myCtx->envhp,*ocistring), exists);

if (OCICollAppend(myCtx->envhp,myCtx->errhp, *ocistring, 0, *p out) != OCI SUCCESS)

raise application error(myCtx,ERROR OCI ERROR,

%s ,lastOciError(myCtx));

break;



1 ... 300 301 302 [ 303 ] 304 305 306 ... 469

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