PostgreSQL异常处理

Nic*_*net 36 postgresql plpgsql

我是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;
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 如何在T-SQL中打印'PRINT'这样的消息?
  2. 如何使用异常信息引发错误?

Mic*_*uen 69

要捕获错误消息及其代码:

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';
Run Code Online (Sandbox Code Playgroud)

还没有找到行号

  • 是.如果您处于事务中(在'begin'之后但在'commit'或'rollback'之前)并且发生错误,则回滚"begin"以来的所有内容. (7认同)
  • 如果一个语句失败,postgres会自动发出回滚吗?无需显式回滚吗? (2认同)
  • 从9.2版开始GET STACKED DIAGNOSTICS myVariable = PG_EXCEPTION_CONTEXT; 这是非常有用的。 (2认同)

Fra*_*ens 16

使用DO语句,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;
$$;
Run Code Online (Sandbox Code Playgroud)


Pet*_*aut 5

你可以把它写成一个 psql 脚本,例如,

START TRANSACTION;
CREATE TABLE ...
CREATE TABLE ...
COMMIT;
\echo 'Task completed sucessfully.'
Run Code Online (Sandbox Code Playgroud)

并运行

psql -f somefile.sql
Run Code Online (Sandbox Code Playgroud)

不能直接在 PostgreSQL 中使用参数引发错误。在移植这样的代码时,有些人会在错误字符串中编码必要的信息,并在必要时将其解析出来。

这一切都有些不同,所以准备重新学习/重新思考/重写很多东西。