【问题标题】:Need to recover BIGSERIAL "primary key" value from an Informix stored procedure需要从 Informix 存储过程中恢复 BIGSERIAL“主键”值
【发布时间】:2015-08-31 22:57:07
【问题描述】:

我有以下存储过程:

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 是一个起始值为 9999000000 的 BIGSERIAL 主键,所以在我第一次插入时,eunid 自动生成 9999000001 存储过程使用参数 (0, 'username') 执行,主程序自动加一。需要在插入时检索准确的 uniq eunid,因为许多用户会在一个瞬间请求此 ID。

【问题讨论】:

  • 我将程序修改为如下:
  • 创建过程 eukno(pk BIGINT) 返回 BIGINT;定义 eunid BIGINT;插入到 ent_uniq (eunid) 值 (pk);返回 DBINFO('serial8');结束程序;
  • 然而,有了这个改变,我仍然是 0,我指定的插入值,而不是数据库生成的实际值。
  • 请将您的 cmets 转移到问题的更新中(然后删除 cmets)。然后就可以正确格式化代码了。
  • 是的,谢谢乔纳森。我昨天终于解决了,当我点击“回答你的问题”时,我们的网络崩溃了。很抱歉浪费您的时间。不过很高兴得到确认。

标签: stored-procedures


【解决方案1】:

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 是更好的类型(出于多种原因)。

您可能还注意到,在您的代码中,局部变量 eunident_uniq.eunid 列完​​全分开(它恰好与列同名,但仅此而已),并且在以下情况下未初始化退回或未使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多