我有以下存储过程:
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,'username')执行存储过程,主存储过程自动增加1。需要在插入时检索精确的uniq eunid,因为许多用户将在同一时刻请求此ID
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
列完全分开(它恰好与列具有相同的名称,但仅此而已),并且在返回时未初始化或未使用。