Der Versuch, einfache Ausführung gespeicherte Prozedur Postgres Funktion zu konvertieren - kann CURRVAL nicht bekommen ( ‚table_seq‘) zur Funktion
-
30-09-2019 - |
Frage
Die MySQL Stored Procedure war:
BEGIN
set @sql=_sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
set _ires=LAST_INSERT_ID();
END$$
Ich habe versucht, es zu konvertieren:
BEGIN
EXECUTE _sql;
SELECT INTO _ires CURRVAL('table_seq');
RETURN;
END;
ich den Fehler:
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')
Die Abfrage verwendet wird, ist nur zu Testzwecken. Ich glaube, diese Funktion wird die Zeilen-ID der eingelegten oder erstellte Zeile aus der Abfrage zu erhalten. Irgendwelche Vorschläge?
Lösung
Wenn Sie Tabellen mit seriellen Spalten erstellen, Sequenzen sind, die standardmäßig als tablename_columnname_seq
genannt, aber es scheint, dass Sie den Zugriff auf tablename_seq
versuchen. Also mit einer Tabelle namens foobar
und Primärschlüsselspalte foobar_id
es endet als foobar_foobar_id_seq
auf.
Durch die Art und Weise, ein Reiniger Weg, um den Primärschlüssel zu erhalten, nachdem ein Einsatz der RETURNING
Klausel in INSERT
verwendet. Z.
_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;
Andere Tipps
PostgreSQL sagt, dass es keine Sequenz „table_seq“ genannt wird. Sind Sie sicher, dass der richtige Name ist? Der Name, den Sie verwenden würden, würde davon abhängen, was in _sql
als jeder SERIAL
oder BIGSERIAL
seine eigene Sequenz wird, können Sie auch Sequenzen definieren und Draht sie von Hand.
In jedem Fall lastval()
ist eine bessere Übereinstimmung zu MySQL LAST_INSERT_ID()
, lastval()
kehrt der zuletzt zurückgegebene Wert von jeder Sequenz in der aktuellen Sitzung:
lastval
Gibt den Wert zuletzt durch nextval in der aktuellen Sitzung zurück. Dies Funktion ist identisch mit CURRVAL, mit der Ausnahme, dass anstelle der Sequenznamen des Nehmens als Argument holt er den Wert des zuletzt durch nextval in der verwendeten Sequenz aktuelle Sitzung. Es ist ein Fehler lastval zu nennen, wenn nextval noch nicht aufgerufen worden in der aktuellen Sitzung.
Mit lastval()
auch bedeutet, dass man sich keine Sorgen machen muß über das, was in _sql
, es sei denn natürlich ist es nicht eine Folge überhaupt.