Tratar de convertir procedimiento de ejecución almacenado simple de la función postgres - no puede conseguir CURRVAL ( 'table_seq') a la función
-
30-09-2019 - |
Pregunta
El MySQL procedimiento almacenado fue:
BEGIN
set @sql=_sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
set _ires=LAST_INSERT_ID();
END$$
He intentado convertirlo a:
BEGIN
EXECUTE _sql;
SELECT INTO _ires CURRVAL('table_seq');
RETURN;
END;
Me sale el error:
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')
La consulta utilizada es sólo para propósitos de prueba. Creo que esta función se utiliza para obtener el identificador de fila de la fila insertada o creado a partir de la consulta. Alguna sugerencia?
Solución
Cuando se crea tablas con columnas de serie, secuencias son, por defecto, nombrado como tablename_columnname_seq
, pero parece que al que intenta acceder tablename_seq
. Así que con una tabla llamada foobar
y foobar_id
columna de clave principal que termina siendo foobar_foobar_id_seq
.
Por cierto, un más limpio manera de obtener la clave principal después de una inserción está utilizando la cláusula RETURNING
en INSERT
. Por ejemplo:.
_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;
Otros consejos
PostgreSQL está diciendo que no hay una secuencia llamada "table_seq". ¿Estas seguro que ese es el nombre correcto? El nombre que usaría dependería de lo que está en _sql
ya que cada SERIAL
o BIGSERIAL
obtiene su propia secuencia, también se puede definir secuencias y alambre hacia arriba con la mano.
En cualquier caso, lastval()
es un partido más cerca de LAST_INSERT_ID()
de MySQL, devoluciones lastval()
el valor más recientemente regresó de cualquier secuencia en la sesión actual:
lastval
Devolver el último valor devuelto por nextval en la sesión actual. Esta función es idéntica a currval, excepto que en lugar de tomar el nombre de la secuencia como argumento se obtiene el valor de la última secuencia utilizada por nextval en el sesión actual. Es un error llamar a lastval si nextval aún no ha sido llamado en la sesión actual.
El uso de lastval()
también significa que usted no tiene que preocuparse de lo que está en _sql
, a menos que, por supuesto, que no utiliza una secuencia en absoluto.