Cercando di convertire semplice procedura di esecuzione memorizzati alla funzione postgres - non possono ottenere CURRVAL ( 'table_seq') alla funzione
-
30-09-2019 - |
Domanda
Il MySQL stored procedure è stata:
BEGIN
set @sql=_sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
set _ires=LAST_INSERT_ID();
END$$
Ho cercato di convertirlo in:
BEGIN
EXECUTE _sql;
SELECT INTO _ires CURRVAL('table_seq');
RETURN;
END;
ottengo l'errore:
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 query utilizzata è solo a scopo di test. Credo questa funzione viene utilizzata per ottenere l'id riga della riga inserita o creati dalla query. Qualche suggerimento?
Soluzione
Quando si creano le tabelle con le colonne seriali, sequenze sono, per impostazione predefinita, chiamato come tablename_columnname_seq
, ma sembra che si sta tentando di accedere tablename_seq
. Quindi, con una tabella denominata foobar
e foobar_id
colonna di chiave primaria si finisce per essere foobar_foobar_id_seq
.
Tra l'altro, un più pulito modo per ottenere la chiave primaria dopo un inserimento sta usando la clausola RETURNING
in INSERT
. Per esempio:.
_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;
Altri suggerimenti
PostgreSQL sta dicendo che non v'è alcuna sequenza denominata "table_seq". Sei sicuro che questo è il nome giusto? Il nome si usa dipenderebbe ciò che è in _sql
come ogni SERIAL
o BIGSERIAL
ottiene la propria sequenza, è possibile definire sequenze e li filo a mano.
In ogni caso, lastval()
è una partita più vicina a LAST_INSERT_ID()
di MySQL, lastval()
restituisce il valore più recentemente tornato da una qualsiasi sequenza nella sessione corrente:
lastval
Restituisce il valore più recente restituito dal nextval nella sessione corrente. Questo funzione è identica a currval, salvo che invece di prendere il nome della sequenza come argomento recupera il valore dell'ultima sequenza utilizzata dal nextval nel sessione corrente. Si tratta di un errore di chiamare lastval se nextval non è ancora stato chiamato nella sessione corrente.
Utilizzando lastval()
anche mezzi che non devi preoccuparti di ciò che è in _sql
, a meno che naturalmente non fa uso di una sequenza a tutti.