Странная проблема, при использовании OCILIB, я пытаюсь извлечь данные / записи из таблицы с Переменной связывания, используя предложение IN
.Поскольку я использую предложение IN
, я передаю массив в переменной bind.Для этого я изменил Пример интерфейса массива .Ниже приведена моя версия.
#include "ocilib.h"
#define ARRAY_SIZE 1000
#define STRING_SIZE 20
void err_handler(OCI_Error *err)
{
printf("%s\n", OCI_ErrorGetString(err));
}
int main(void)
{
OCI_Connection *cn;
OCI_Statement *st;
OCI_Error *err;
char tab_str[ARRAY_SIZE][STRING_SIZE+1];
int i;
if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT | OCI_ENV_CONTEXT))
{
return EXIT_FAILURE;
}
cn = OCI_ConnectionCreate("DB", "USER", "PASS", OCI_SESSION_DEFAULT);
OCI_SetAutoCommit(cn, TRUE);
st = OCI_StatementCreate(cn);
OCI_Prepare(st, "select * from products where name in (:s)");
OCI_BindArraySetSize(st, ARRAY_SIZE);
OCI_BindArrayOfStrings(st, ":s", (char*)tab_str, STRING_SIZE, 0);
for (i = 0; i < ARRAY_SIZE; i++)
sprintf(tab_str[i], "Name %d", i + 1);
if (!OCI_Execute(st))
{
printf("there was an error: %s\n", OCI_ErrorGetString(OCI_GetLastError()));
}
OCI_Resultset *rs = OCI_GetResultset(st);
while (OCI_FetchNext(rs))
{
printf("code: %i, name %s\n", OCI_GetInt(rs, 1), OCI_GetString(rs, 2));
}
OCI_StatementFree(st);
OCI_ConnectionFree(cn);
OCI_Cleanup();
return EXIT_SUCCESS;
}
output
[amir@jump ~]$ ./test3
code: 1, name Name 1
Несмотря на то, что таблица содержит 1000 записей (и способ ее хранения соответствует запросу), код, к сожалению, возвращает только1 запись.Я проверил таблицу захвата привязки Oracle, код на самом деле передал только первый элемент из массива char.
Я полностью сбит с толку :)требуется помощь.