OCILIB Ошибка при получении данных с использованием массива в переменной Bind - PullRequest
0 голосов
/ 08 июля 2019

Странная проблема, при использовании 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.

bind capture

Я полностью сбит с толку :)требуется помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...