gpt4 book ai didi

c - 如何从 C 触发器中插入的行中获取数据?

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:40 25 4
gpt4 key购买 nike

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 函数。

现在我正在尝试从插入的每一行中获取数据。这是代码:

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 接口(interface),它简化了从用户定义的 C 函数访问数据库的过程: http://www.postgresql.org/docs/current/interactive/spi.html

关于c - 如何从 C 触发器中插入的行中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8802122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com