|
Программирование >> Oracle
Внешние процедуры на языке С 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
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;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |