2011-02-02 15 views
23

Soy nuevo en PostgreSQL. ¿Podría alguien corregir esta consulta?PostgreSQL Exception Handling

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; 

Preguntas:

  1. cómo imprimir un mensaje como 'imprimir' en T-SQL?
  2. Cómo generar errores con información de excepción?
+0

lo idioma en que escribes? parece que está mezclando las macros C con sentencias SQL directas, y dice "plpgsql" en las etiquetas. – araqnid

+1

Soy nuevo en postgres. ¿Puedes guiarme para lograr esto dentro de la consulta postgres? –

+1

Gracias. Editado He intentado un par de otras sintaxis pero con vano. –

Respuesta

44

para coger el mensaje de error y su código:

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'; 

No puede encontrar el número de línea aún

+0

¿Postgres emitiría una reversión automáticamente si falla una declaración? ¿No es necesario deshacerlo explícitamente? –

+2

Sí. Si está en una transacción (después de 'begin' pero antes de 'commit' o 'rollback') y ocurre un error, entonces todo se revierte desde 'begin'. – gr5

3

Se puede escribir esto como una secuencia de comandos psql, por ejemplo,

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

y correr con

psql -f somefile.sql 

El aumento de los errores con los parámetros no es posible en PostgreSQL directamente. Al portar dicho código, algunas personas codifican la información necesaria en la cadena de error y la analizan si es necesario.

Todo funciona de manera diferente, así que prepárate para volver a aprender/repensar/reescribir muchas cosas.

11

Uso del DO statement, una nueva opción en la versión 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

muchas gracias. –