尝试将简单的执行过程转换为Postgres函数 - 无法将Currval('table_seq')函数函数
-
30-09-2019 - |
题
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
, ,除非当然根本不使用序列。
不隶属于 StackOverflow