Cercando di convertire semplice procedura di esecuzione memorizzati alla funzione postgres - non possono ottenere CURRVAL ( 'table_seq') alla funzione

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top