Essayer de convertir l'exécution procédure stockée simple à la fonction postgres - ne peut pas obtenir CURRVAL ( « table_seq ») à la fonction

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

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top