2010-09-10 2 views
6

in SQL Server ich tun, wie folgt:select/Anzeige eingefügt letzte serielle ID in Postgres

insert into foo(name) values('bob') 
select @@identity; 

so erhalte ich eine Abfrage/Skalar Ergebnis

angezeigt

, wie dies mit Postgres?

+3

Verwenden Sie nicht "@@ identity" in SQL Server. Die Verwendung von [SCOPE_IDENTITY()] (http://msdn.microsoft.com/en-us/library/ms190315.aspx) ist stattdessen sicherer, um mögliche Probleme mit Triggern zu vermeiden. –

Antwort

2

Es

GET DIAGNOSTICS wäre YourParam = RESULT_OID;

Siehe hier http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html Scrollen Sie bis zu 37.6.6. Abrufen der Ergebnisstatus

Fragesteller edit: ich das versucht:

create or replace function aaa() returns int as $$ 
declare 
a int; 
begin 
insert into oameni values(default, 'aaa'); 
get diagnostics a = result_oid; 
return a; 
end; 
$$ language plpgsql; 

es immer 0 zurückgibt, wissen Sie, was hier falsch ist?

+0

ja und ich möchte es sofort angezeigt werden, gleichbedeutend für select @@ Identität – Omu

+0

so dump in Variable und SELECT Variable – SQLMenace

+0

Ich habe bearbeiten Sie beantworten, könnten Sie einen Blick – Omu

22

eine spezifische Sequenz Get:

SELECT currval('name_of_your_sequence'); 

den letzten Wert aus der letzten Sequenz gewöhnungs:

SELECT lastval(); 

Überprüfen Sie das Handbuch auch: http://www.postgresql.org/docs/current/static/functions-sequence.html

Edit: Sie könnten auch verwenden RETURNING in Ihrem INSERT:

INSERT INTO foo(id, name) VALUES(DEFAULT, 'bob') RETURNING id; 
3

Ein guter Weg ist mit RETURNING ID. Hier ist ein kurzes Beispiel mit PL/pgSQL:

 DECLARE 
     nivel1 RECORD; 
     resultId BIGINT; 
     BEGIN 
      FOR nivel1 IN SELECT * FROM primary_table LOOP 
      INSERT INTO second_table(id, field2, field3) VALUES (DEFAULT, "value2", "value3") RETURNING id INTO resultId; 
      RAISE NOTICE 'Inserted id: %s', quote_literal(resultId); 
      END LOOP; 
     RETURN; 
     END 

Es funktioniert für mich!