2011-02-02 92 views
23

我是PostgreSQL的新手。任何人都可以纠正这个问题。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; 

问题:

  1. 如何打印像T-SQL '打印' 的消息?
  2. 如何用异常信息引发错误?
+0

什么你在写什么语言?您似乎将C宏与直接SQL语句混合在一起,并且您在标记中说“plpgsql”。 – araqnid 2011-02-02 17:32:01

+1

我是新来的postgres。你能指导我在postgres查询中实现这个吗? – 2011-02-02 17:34:11

+1

谢谢。编辑。我尝试了其他几种语法,但徒劳无益。 – 2011-02-02 17:45:41

回答

44

捕获错误消息,并且其代码:

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

没有找到行号还

3

你可以这样写一个脚本PSQL,例如

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

psql -f somefile.sql 

提高错误与参数运行是不可能的PostgreSQL直接。在移植此类代码时,有些人会将必要的信息编码到错误字符串中,并在必要时将其解析出来。

这一切工作有点不同,所以准备重新学习/重新思考/重写很多事情。

11

使用DO statement,在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; 
$$;