MySQL存储的过程是:

     BEGIN
     set @sql=_sql;
     PREPARE stmt FROM @sql; 
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;
     set _ires=LAST_INSERT_ID();
     END$$

我试图将其转换为:

     BEGIN  
     EXECUTE _sql;
     SELECT INTO _ires CURRVAL('table_seq');
     RETURN;
     END;

我得到错误:

SQL error:

ERROR:  relation "table_seq" does not exist
LINE 1: SELECT CURRVAL('table_seq')
                       ^
QUERY:  SELECT CURRVAL('table_seq')
CONTEXT:  PL/pgSQL function "myexecins" line 4 at SQL statement
In statement:
SELECT myexecins('SELECT * FROM tblbilldate WHERE billid = 2')

使用的查询仅用于测试目的。我相信此功能用于从查询中获取插入或创建行的行ID。有什么建议么?

有帮助吗?

解决方案

当您使用串行列创建表时,默认情况下,序列被称为 tablename_columnname_seq, ,但似乎您正在尝试访问 tablename_seq. 。因此,有一张名为 foobar 和主键列 foobar_id 最终是 foobar_foobar_id_seq.

顺便说一句 清洁器 插入后获取主键的方法是使用 RETURNING 子句 INSERT. 。例如:

_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;

其他提示

PostgreSQL说没有序列称为“ table_seq”。您确定那是正确的名字吗?您要使用的名称取决于 _sql 每个 SERIAL 或者 BIGSERIAL 获得自己的序列,您还可以定义序列并手工将它们汇总。

任何状况之下, lastval() 是与MySQL的匹配 LAST_INSERT_ID(), lastval() 返回当前会话中任何序列的最近返回的值:

LASTVAL
在当前会话中返回NextVal最近返回的值。此函数与Currval相同,除非,除了将序列名称作为参数而不是以当前会话中NextVal使用的最后一个序列的值。如果在当前会话中尚未调用NextVal,则调用LastVal是一个错误。

使用 lastval() 还意味着您不必担心什么 _sql, ,除非当然根本不使用序列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top