#include "SampleLib.h"
#define SQL_IN "begin :1 := pkg_DemoStringArrays.DemoInArrays(:2, :3); end;"
#define SQL_INOUT "begin pkg_DemoStringArrays.DemoInOutArrays(:1, :2); end;"
#define SQL_OUT "begin pkg_DemoStringArrays.DemoOutArrays(:1, :2); end;"
#define SQL_ASSOC "begin pkg_DemoStringArrays.DemoIndexBy(:1); end;"
#define TYPE_NAME "PKG_DEMOSTRINGARRAYS.UDT_STRINGLIST"
static const char *gc_Strings[5] = {
"Demo String 1 (I)",
"Demo String 2 (II)",
"Demo String 3 (III)",
"Demo String 4 (IV)",
"Demo String 5 (V)"
};
int main(int argc, char **argv)
{
dpiData *returnValue, *numberValue, *arrayValue, *objectValue;
dpiVar *returnVar, *numberVar, *arrayVar, *objectVar;
uint32_t numQueryColumns, i, numElementsInArray;
int32_t elementIndex, nextElementIndex;
dpiObjectType *objType;
dpiData elementValue;
dpiStmt *stmt;
dpiConn *conn;
int exists;
conn = dpiSamples_getConn(0, NULL);
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_NUMBER, DPI_NATIVE_TYPE_INT64, 1,
0, 0, 0, NULL, &returnVar, &returnValue) < 0)
return dpiSamples_showError();
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_NUMBER, DPI_NATIVE_TYPE_INT64, 1,
0, 0, 0, NULL, &numberVar, &numberValue) < 0)
return dpiSamples_showError();
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_VARCHAR, DPI_NATIVE_TYPE_BYTES, 8,
60, 0, 1, NULL, &arrayVar, &arrayValue) < 0)
return dpiSamples_showError();
if (dpiConn_prepareStmt(conn, 0, SQL_IN, strlen(SQL_IN), NULL, 0,
&stmt) < 0)
return dpiSamples_showError();
if (dpiStmt_bindByPos(stmt, 1, returnVar) < 0)
return dpiSamples_showError();
numberValue->isNull = 0;
numberValue->value.asInt64 = 12;
if (dpiStmt_bindByPos(stmt, 2, numberVar) < 0)
return dpiSamples_showError();
for (i = 0; i < 5; i++) {
if (dpiVar_setFromBytes(arrayVar, i, gc_Strings[i],
strlen(gc_Strings[i])) < 0)
return dpiSamples_showError();
}
if (dpiVar_setNumElementsInArray(arrayVar, 5) < 0)
return dpiSamples_showError();
if (dpiStmt_bindByPos(stmt, 3, arrayVar) < 0)
return dpiSamples_showError();
if (dpiStmt_execute(stmt, 0, &numQueryColumns) < 0)
return dpiSamples_showError();
printf("IN array (5 elements): return value is %" PRId64 "\n\n",
returnValue->value.asInt64);
if (dpiVar_setNumElementsInArray(arrayVar, 0) < 0)
return dpiSamples_showError();
if (dpiStmt_execute(stmt, 0, &numQueryColumns) < 0)
return dpiSamples_showError();
dpiStmt_release(stmt);
printf("IN array (0 elements): return value is %" PRId64 "\n\n",
returnValue->value.asInt64);
if (dpiConn_prepareStmt(conn, 0, SQL_INOUT, strlen(SQL_INOUT), NULL, 0,
&stmt) < 0)
return dpiSamples_showError();
numberValue->value.asInt64 = 5;
if (dpiStmt_bindByPos(stmt, 1, numberVar) < 0)
return dpiSamples_showError();
if (dpiVar_setNumElementsInArray(arrayVar, 5) < 0)
return dpiSamples_showError();
if (dpiStmt_bindByPos(stmt, 2, arrayVar) < 0)
return dpiSamples_showError();
if (dpiStmt_execute(stmt, 0, &numQueryColumns) < 0)
return dpiSamples_showError();
dpiStmt_release(stmt);
if (dpiVar_getNumElementsInArray(arrayVar, &numElementsInArray) < 0)
return dpiSamples_showError();
printf("IN/OUT array contents:\n");
for (i = 0; i < numElementsInArray; i++)
printf(" [%d] %.*s\n", i + 1, arrayValue[i].value.asBytes.length,
arrayValue[i].value.asBytes.ptr);
printf("\n");
if (dpiConn_prepareStmt(conn, 0, SQL_OUT, strlen(SQL_OUT), NULL, 0,
&stmt) < 0)
return dpiSamples_showError();
numberValue->value.asInt64 = 7;
if (dpiStmt_bindByPos(stmt, 1, numberVar) < 0)
return dpiSamples_showError();
if (dpiStmt_bindByPos(stmt, 2, arrayVar) < 0)
return dpiSamples_showError();
if (dpiStmt_execute(stmt, 0, &numQueryColumns) < 0)
return dpiSamples_showError();
dpiStmt_release(stmt);
if (dpiVar_getNumElementsInArray(arrayVar, &numElementsInArray) < 0)
return dpiSamples_showError();
printf("OUT array contents:\n");
for (i = 0; i < numElementsInArray; i++)
printf(" [%d] %.*s\n", i + 1, arrayValue[i].value.asBytes.length,
arrayValue[i].value.asBytes.ptr);
printf("\n");
if (dpiConn_getObjectType(conn, TYPE_NAME, strlen(TYPE_NAME),
&objType) < 0)
return dpiSamples_showError();
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_OBJECT, DPI_NATIVE_TYPE_OBJECT, 1,
0, 0, 0, objType, &objectVar, &objectValue) < 0)
return dpiSamples_showError();
if (dpiConn_prepareStmt(conn, 0, SQL_ASSOC, strlen(SQL_ASSOC), NULL, 0,
&stmt) < 0)
return dpiSamples_showError();
if (dpiStmt_bindByPos(stmt, 1, objectVar) < 0)
return dpiSamples_showError();
if (dpiStmt_execute(stmt, 0, &numQueryColumns) < 0)
return dpiSamples_showError();
dpiStmt_release(stmt);
if (dpiObject_getFirstIndex(objectValue->value.asObject, &elementIndex,
&exists) < 0)
return dpiSamples_showError();
printf("ASSOCIATIVE array contents:\n");
while (1) {
if (dpiObject_getElementValueByIndex(objectValue->value.asObject,
elementIndex, DPI_NATIVE_TYPE_BYTES, &elementValue) < 0)
return dpiSamples_showError();
printf(" [%d] %.*s\n", elementIndex,
elementValue.value.asBytes.length,
elementValue.value.asBytes.ptr);
if (dpiObject_getNextIndex(objectValue->value.asObject, elementIndex,
&nextElementIndex, &exists) < 0)
return dpiSamples_showError();
if (!exists)
break;
elementIndex = nextElementIndex;
}
printf("\n");
dpiVar_release(returnVar);
dpiVar_release(numberVar);
dpiVar_release(arrayVar);
dpiVar_release(objectVar);
dpiObjectType_release(objType);
dpiConn_release(conn);
printf("Done.\n");
return 0;
}