Вставить массив с помощью PostgreSQL ECPG - PullRequest
0 голосов
/ 04 августа 2009

Я использую ECPG с PostgreSQL 8.4. У меня есть функция, которая принимает структуру, содержащую указатели, на пару динамически размещаемых, «нулевых» -определенных массивов целых чисел (в этом случае я определил ноль как -1, так как нет необходимости в отрицательных значениях, как в 1001 *

#define INT_ARR_NULL -1

struct foobar {
    int * foo;
    int * bar;
};

void init_foobar( struct foobar * fb ) {
    fb->foo = (int*) calloc( 11, sizeof(int) );
    fb->bar = (int*) calloc( 11, sizeof(int) );
    fb->foo[10]=INT_ARR_NULL;
    fb->bar[10]=INT_ARR_NULL;
    int i;
    for( i = 0; i < 10; ++i ) {
        fb->foo[i] = i;
        fb->bar[i] = i;
    }
}

void print_foo( struct foobar * fb ) {
    int * cursor = fb->foo;
    while( *cursor != INT_ARR_NULL ) {
        printf( "%d ", *cursor );
        ++cursor;
    }
}

Я включил функцию print_foo, чтобы показать, как массив будет работать нормально. Если я хочу вставить эти значения в массив в столбце PostgreSQL с помощью ECPG, как мне поступить?

1 Ответ

1 голос
/ 06 августа 2009

Вы должны быть в состоянии получить что-то работающее из этого примера, взятое из набора тестов ECPG и немного урезанное. Я не уверен, работает ли он с массивами динамического размера, но это должно по крайней мере дать вам отправную точку.

main (void)
{
EXEC SQL BEGIN DECLARE SECTION;
    int a[10] = {9,8,7,6,5,4,3,2,1,0};
    char text[25] = "klmnopqrst";
EXEC SQL END DECLARE SECTION;

    EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT TO REGRESSDB1;

    EXEC SQL SET AUTOCOMMIT = ON;

    EXEC SQL BEGIN WORK;

    EXEC SQL CREATE TABLE test (f float, i int, a int[10], text char(10));

    EXEC SQL INSERT INTO test(f,i,a,text) VALUES(404.90,3,'{0,1,2,3,4,5,6,7,8,9}','abcdefghij');

    EXEC SQL INSERT INTO test(f,i,a,text) VALUES(140787.0,2,:a,:text);

    EXEC SQL COMMIT;
}

Если вы не можете заставить его работать с динамическим массивом, вы всегда можете превратить его в строку формата '{1,2,3,4,5}' и вставить ее (см. Пример).

...