2011-02-02 56 views
23

Tôi mới sử dụng PostgreSQL. Ai có thể vui lòng sửa truy vấn này.Xử lý ngoại lệ 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; 

Câu hỏi:

  1. Làm thế nào để in một thông báo như 'IN' trong T-SQL?
  2. Cách tăng lỗi với thông tin ngoại lệ?
+0

gì bạn đang viết bằng ngôn ngữ nào? bạn dường như đang trộn các macro C với các câu lệnh SQL trực tiếp và bạn nói "plpgsql" trong các thẻ. – araqnid

+1

Tôi mới làm quen với bưu điện. Bạn có thể hướng dẫn tôi đạt được điều này trong truy vấn postgres không. –

+1

Cảm ơn. Đã chỉnh sửa. Tôi đã thử một vài cú pháp khác nhưng vô ích. –

Trả lời

44

Để bắt được thông báo lỗi và mã của nó:

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

Đã không tìm thấy số dòng chưa

+0

Postgres sẽ phát hành tự động khôi phục nếu một câu lệnh không thành công? Là nó không cần thiết để rõ ràng cuộn nó trở lại? –

+2

Có. Nếu bạn đang ở trong một giao dịch (sau khi 'bắt đầu' nhưng trước khi 'cam kết' hoặc 'rollback') và một lỗi xảy ra thì mọi thứ kể từ khi 'bắt đầu' được khôi phục. – gr5

3

Bạn có thể viết này như là một kịch bản psql, ví dụ,

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

và chạy với

psql -f somefile.sql 

Nâng lỗi với thông số là không thể trong PostgreSQL trực tiếp. Khi chuyển mã như vậy, một số người mã hóa thông tin cần thiết trong chuỗi lỗi và phân tích cú pháp nó nếu cần.

Tất cả hoạt động hơi khác một chút, vì vậy hãy chuẩn bị để học lại/suy nghĩ lại/viết lại nhiều thứ.

11

Sử dụng DO statement, một lựa chọn mới trong phiên bả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

cảm ơn bạn rất hữu ích .. –