Как я могу получить данные из строки, вставленные в триггер C?
-
25-10-2019 - |
Вопрос
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