如何从插入C触发的行中获取数据?
-
25-10-2019 - |
题
PostgreSQL 9.1.0。 OS 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函数。
现在,我试图从每行插入的数据中获取数据。这是代码:
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)。
最后但并非最不重要的一点是,在调用返回基准的函数时,请使用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
不隶属于 StackOverflow