我有以下存储过程:
CREATE PROCEDURE eukno(pk BIGINT, requestee VARCHAR(20))
RETURNING BIGINT;
DEFINE eunid BIGINT;
INSERT INTO ent_uniq (eunid, eunreq) VALUES (pk, requestee);
RETURN eunid;
END PROCEDURE;
我将值插入到表中,但是在插入期间我需要返回主键值eunid
以获得精确值。 eunid
是BIGSERIAL
主键,起始值为9999000000,因此在我的第一次插入时,eunid
会自动生成9999000001
存储过程使用参数(0,'用户名')执行,主存储自动增加1。需要在插入时检索确切的uniq eunid,因为许多用户将在一个时刻请求此ID。
答案 0 :(得分:0)
DBINFO('serial8')
函数返回最后一个SERIAL8列的键值。你正在插入一个BIGSERIAL;您需要改为使用DBINFO('bigserial')
。
SQL[2163]: CREATE PROCEDURE eukno(pk BIGINT, requestee VARCHAR(20))
> RETURNING BIGINT;
> INSERT INTO ent_uniq (eunid, eunreq) VALUES (pk, requestee);
> RETURN DBINFO('bigserial');
> END PROCEDURE;
SQL[2164]: execute procedure eukno(57, 'varieties');
57
SQL[2165]: execute procedure eukno(0, 'boredom');
58
SQL[2166]:
注意SERIAL是一个4字节的串行类型; SERIAL8和BIGSERIAL都支持8字节的序列号范围,但BIGSERIAL是更好的类型(出于各种原因)。
您可能还会注意到,在您的代码中,局部变量eunid
与ent_uniq.eunid
列完全分开(它恰好与列名相同,但这就是全部),以及在返回或未使用时未初始化。