Как я могу получить данные из строки, вставленные в триггер C?

StackOverflow https://stackoverflow.com/questions/8802122

Вопрос

Postgresql 9.1.0. ОС Ubuntu 11.10. Компилятор GCC 4.6.1

Вот мой стол:

CREATE TABLE ttest
(
  x integer,
  str text
 )
 WITH (
 OIDS=FALSE
);
ALTER TABLE ttest OWNER TO postgres;

CREATE TRIGGER tb
BEFORE INSERT
ON ttest
FOR EACH ROW
EXECUTE PROCEDURE out_trig();

out_trig - это c functcion.

Теперь я пытаюсь получить данные из каждой строки, вставленную. Вот код:

if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
{
    rettuple = trigdata->tg_trigtuple;
    bool isnull = false;
    uint32 x=rettuple->t_len;
    int64 f;
        f = (int64) GetAttributeByNum(rettuple->t_data, 1, &isnull);//error here
    elog(INFO,"len of tuple: %d",x);
    elog(INFO,"first column being inserted x: %d",f);
 }

Я получил ошибку: тип записи не был зарегистрирован

Государство SQL: 42809

Что я делаю не так и как это сделать правильно?

Это было полезно?

Решение

Getattributebynum (или getattributebyname) работает только с датумами, а не в платежах на диске, используйте вместо этого Heap_getattr.

Вы объявили x как целое число, но пытаетесь прочитать его как int64 (PostgreSQL использует int4 для типов целочисленных целого числа, если вы явно не указаете свой столбец как int8).

И последнее, но не менее важное, используйте Macros Datumget [yourType] при вызовах функций, которые возвращают датума, преобразуя значение непосредственно в переносимость разрыва желаемого типа.

Длинный и короткий, код должен стать чем -то вроде этого:

if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
{
    HeapTuple rettuple = trigdata->tg_trigtuple;
    TupleDesc tupdesc = trigdata->tg_relation->rd_att;
    bool isnull = false;
    uint32 x=rettuple->t_len;
    int32 att = DatumGetInt32(heap_getattr(rettuple, 1, tupdesc, &isnull));
    elog(INFO,"len of tuple: %d",x);
    if (!isnull)
        elog(INFO,"first column being inserted x: %d",att);
    else
        elog(INFO,"first column being inserted x: NULL"); 
 }

Вы также можете взглянуть на интерфейс SPI, который упрощает доступ к базе данных из определенных пользовательских функций C:http://www.postgresql.org/docs/current/interactive/spi.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top