0

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。有什么建议么?

4

2 回答 2

2

PostgreSQL 说没有称为“table_seq”的序列。你确定这是正确的名字吗?您将使用的名称取决于_sql每个中的内容SERIALBIGSERIAL获得自己的序列,您还可以定义序列并手动将它们连接起来。

在任何情况下,lastval()都更接近 MySQL 的LAST_INSERT_ID()lastval()从当前会话中的任何序列返回最近返回的值:

lastval
返回当前会话中 nextval 最近返回的值。此函数与 currval 相同,不同之处在于它不是将序列名称作为参数,而是获取 nextval 在当前会话中使用的最后一个序列的值。如果在当前会话中尚未调用 nextval,则调用 lastval 是错误的。

使用lastval()还意味着您不必担心 中的内容_sql,除非它当然根本不使用序列。

于 2011-01-07T07:59:03.440 回答
2

当您创建具有串行列的表时,序列默认命名为tablename_columnname_seq,但您似乎正在尝试访问tablename_seq. 因此,有了一个名为foobar和主键列的表,foobar_id它最终成为foobar_foobar_id_seq.

顺便说一句,在插入后获取主键的一种更简洁RETURNING的方法是使用in 子句INSERT。例如:

_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;
于 2011-01-07T08:33:26.360 回答