Tratar de convertir procedimiento de ejecución almacenado simple de la función postgres - no puede conseguir CURRVAL ( 'table_seq') a la función

StackOverflow https://stackoverflow.com/questions/4623475

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top