2011-02-02 7 views
23

Sono nuovo di PostgreSQL. Qualcuno potrebbe correggere questa domanda.Gestione delle eccezioni PostgreSQL

BEGIN TRANSACTION; 

BEGIN; 
    CREATE TABLE "Logs"."Events" 
    (
     EventId BIGSERIAL NOT NULL PRIMARY KEY, 
     PrimaryKeyId bigint NOT NULL, 
     EventDateTime date NOT NULL DEFAULT(now()), 
     Action varchar(12) NOT NULL, 
     UserId integer NOT NULL REFERENCES "Office"."Users"(UserId), 
     PrincipalUserId varchar(50) NOT NULL DEFAULT(user) 
    ); 

    CREATE TABLE "Logs"."EventDetails" 
    (
     EventDetailId BIGSERIAL NOT NULL PRIMARY KEY, 
     EventId bigint NOT NULL REFERENCES "Logs"."Events"(EventId), 
     Resource varchar(64) NOT NULL, 
     OldVal varchar(4000) NOT NULL, 
     NewVal varchar(4000) NOT NULL 
    ); 


    COMMIT TRANSACTION; 
    RAISE NOTICE 'Task completed sucessfully.' 
EXCEPTION; 
    ROLLBACK TRANSACTION; 
    RAISE ERROR @ErrorMessage, @LineNumber, @ErrorState --how to catch errors and display them???? 
END; 

Domande:

  1. come stampare un messaggio come 'Stampa' in T-SQL?
  2. Come aumentare gli errori con le informazioni sulle eccezioni?
+0

cosa lingua in cui stai scrivendo? sembra che tu stia mescolando le macro C con istruzioni SQL dirette e dici "plpgsql" nei tag. – araqnid

+1

Sono nuovo di Postgres. Puoi guidarmi a raggiungere questo nella query postgres. –

+1

Grazie. Modificato. Ho provato un paio di altre sintassi ma invano. –

risposta

44

per catturare il messaggio di errore e il suo codice:

do $$ 


begin 


    create table yyy(a int); 
    create table yyy(a int); -- this will cause an error 



exception when others then 

    raise notice 'The transaction is in an uncommittable state. ' 
       'Transaction was rolled back'; 

    raise notice '% %', SQLERRM, SQLSTATE; 
end; 


$$ language 'plpgsql'; 

Non hai trovato il numero di riga ancora

+0

Postgres rilascia automaticamente un rollback se una dichiarazione fallisce? Non è necessario restituirlo esplicitamente? –

+2

Sì. Se si è in una transazione (dopo "inizio", ma prima di "commit" o "rollback") e si verifica un errore, viene eseguito il rollback di tutto ciò che inizia. – gr5

3

Si potrebbe scrivere questo come uno script psql, per esempio,

START TRANSACTION; 
CREATE TABLE ... 
CREATE TABLE ... 
COMMIT; 
\echo 'Task completed sucessfully.' 

e correre con

psql -f somefile.sql 

Alzando gli errori con i parametri non è possibile in PostgreSQL direttamente. Quando si esegue il porting di questo codice, alcune persone codificano le informazioni necessarie nella stringa di errore e le analizzano, se necessario.

Tutto funziona in modo un po 'diverso, quindi preparatevi a reimparare/ripensare/riscrivere molte cose.

11

Utilizzare il DO statement, una nuova opzione nella versione 9.0:

DO LANGUAGE plpgsql 
$$ 
BEGIN 
CREATE TABLE "Logs"."Events" 
    (
     EventId BIGSERIAL NOT NULL PRIMARY KEY, 
     PrimaryKeyId bigint NOT NULL, 
     EventDateTime date NOT NULL DEFAULT(now()), 
     Action varchar(12) NOT NULL, 
     UserId integer NOT NULL REFERENCES "Office"."Users"(UserId), 
     PrincipalUserId varchar(50) NOT NULL DEFAULT(user) 
    ); 

    CREATE TABLE "Logs"."EventDetails" 
    (
     EventDetailId BIGSERIAL NOT NULL PRIMARY KEY, 
     EventId bigint NOT NULL REFERENCES "Logs"."Events"(EventId), 
     Resource varchar(64) NOT NULL, 
     OldVal varchar(4000) NOT NULL, 
     NewVal varchar(4000) NOT NULL 
    ); 

    RAISE NOTICE 'Task completed sucessfully.';  
END; 
$$; 
+0

grazie mille aiuto .. –