Der Versuch, einfache Ausführung gespeicherte Prozedur Postgres Funktion zu konvertieren - kann CURRVAL nicht bekommen ( ‚table_seq‘) zur Funktion

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

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top