Essayer de convertir l'exécution procédure stockée simple à la fonction postgres - ne peut pas obtenir CURRVAL ( « table_seq ») à la fonction
-
30-09-2019 - |
Question
Le MySQL procédure stockée est:
BEGIN
set @sql=_sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
set _ires=LAST_INSERT_ID();
END$$
J'ai essayé de le convertir en:
BEGIN
EXECUTE _sql;
SELECT INTO _ires CURRVAL('table_seq');
RETURN;
END;
J'obtiens l'erreur:
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 requête utilisée est uniquement à des fins de test. Je crois que cette fonction est utilisée pour obtenir l'ID de ligne de la ligne insérée ou créée à partir de la requête. Toutes les suggestions?
La solution
Lorsque vous créez des tables avec des colonnes en série, les séquences sont, par défaut, nommé tablename_columnname_seq
, mais il semble que vous essayez d'accéder tablename_seq
. Donc, avec une table appelée foobar
et la colonne de clé primaire foobar_id
il finit par être foobar_foobar_id_seq
.
Par ailleurs, propre façon d'obtenir la clé primaire après une insertion utilise la clause RETURNING
dans INSERT
. Par exemple:.
_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;
Autres conseils
PostgreSQL dit qu'il n'y a pas de séquence appelée « table_seq ». Êtes-vous sûr que ce soit le bon nom? Le nom que vous utiliserez dépendra de ce qui est en _sql
que chaque SERIAL
ou BIGSERIAL
obtient sa propre séquence, vous pouvez également définir des séquences et des fils-les à la main.
Dans tous les cas, lastval()
est un match plus proche de LAST_INSERT_ID()
de MySQL, retourne lastval()
la valeur la plus récemment revenue de toute séquence dans la session en cours:
lastval
Retour de la dernière valeur retournée par nextval dans la session en cours. Cette fonction est identique à currval, sauf qu'au lieu de prendre le nom de la séquence comme argument, il va chercher la valeur de la dernière séquence utilisée par nextval dans le session actuelle. Il est une erreur d'appeler lastval si nextval n'a pas encore été appelé dans la session en cours.
Utilisation lastval()
également des moyens que vous n'avez pas à vous soucier de ce qui est en _sql
, à moins bien sûr qu'il n'utilise pas une séquence du tout.