Traitement Des Exceptions PostgreSQL

Je suis nouveau à PostgreSQL. Quelqu'un pourrait-il corriger cette question?

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;

Questions:

  1. comment imprimer un message comme "imprimer" en T-SQL?
  2. comment soulever des erreurs avec des informations d'exception?
26
demandé sur Jonathan Leffler 2011-02-02 20:24:22

3 réponses

Pour attraper le message d'erreur et son code:

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

n'ai pas trouvé le numéro de la ligne encore

50
répondu Michael Buen 2011-08-11 00:13:08

déclaration, une nouvelle option dans la version 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;
$$;
12
répondu Frank Heikens 2011-02-03 08:52:19

vous pouvez écrire ceci comme un script psql, par exemple,

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

et courir avec

psql -f somefile.sql

il n'est pas possible de soulever des erreurs avec des paramètres dans PostgreSQL directement. Lors du portage d'un tel code, certaines personnes encoder les informations nécessaires dans la chaîne d'erreur et d'analyser si nécessaire.

tout Cela fonctionne un peu différemment, alors soyez prêt à réapprendre/repenser/réécriture beaucoup de choses.

3
répondu Peter Eisentraut 2011-02-02 19:52:50