PDA

Visualizza la versione completa : [DELPHI] Funzione currval() di PostGreSQL


mfc1708
19-07-2011, 11:14
Ciao a tutti, spero possiate aiutarmi

Delphi 7 en
Zeos lib 6.6.6-stable
Postgresql 8.4.7

In una tabella tbl_protocollo_categoria ho un campo auto incrementante codice_protocollo_categoria di tipo SERIAL, in altri progetti per recuperare il valore assegnato dal DB al campo serial, utilizzavo un campo di appoggio nella tabelle in cui inserivo l’ip della postazione che aveva effettuato l’inserimento e poi con una select con clausola where = ip_macchina recuperavo il valore inserito e con un update aggiornano il campo ip_macchina = ‘’.

Volendo utilizzare la funzione currval() di postgresql non riesco a recuperare l’ultimo valore serial inserito dalla sessione corrente il pezzo di codice è questo:


with sqlProtocolloCategorie do
begin
SQL.Clear();
SQL.Add( insertProtocolloCategoria ); // insertProtocolloCategoria contiene il codice sql per l’inserimento
ExecSQL();
// fino qui tutto ok
Active := false;
SQL.Clear();
SQL.Add('SELECT pg_catalog.currval(''tbl_protocollo_categoria_codi ce_protocollo_categoria_seq'')' );
SQL.Open();
// qui mi da il seguente errore:
EDatabaseError ‘sqlProtocolloCategorie: Filed ‘codice_protocollo_categorie’ not found
Il campo codice_protocollo_categorie è il campo auto incrementante di tipo serial
Ho provato anche a modificare la query in questo modo:
('SELECT currval(''SELECT currval(''tbl_protocollo_categoria_codice_protocol lo_categoria_seq'') from tbl_protocollo_categoria' );
mettendo il nome della tabella … from tbl_protocollo_categoria, ma l’errore è sempre quello.
PS Nel Field Editor del componente query sqlProtocolloCategoria sono enumerati tutti i campi della tabella

end;


Grazie per l’aiuto

deleted_29
19-07-2011, 12:20
a memoria non esistono campi autoincrementanti in postgres, si simulano con le sequenze.
Forse, e dico forse, stai cercando di leggere un campo che, semplicemente, non esiste, o meglio che il metodo Open non sia quello adatto [zsqlscript?]

---
sono nello studio\2 e non ho postgres sotto mano, domani potrò essere più preciso; dalle vaghe rimembranze ti tocca normalmente creare una vera e propria transazione


begin
insert qualcosa
select currval(qualcosaltro)
commit

o usare nextval (approccio superquick e superdirty) PRIMA della insert

mfc1708
20-07-2011, 10:18
a memoria non esistono campi autoincrementanti in postgres, si simulano con le sequenze

Hai ragione uso inappropriato dei termini

Loading