PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Xử lý ngoại lệ PostgreSQL

Để bắt 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';

Vẫn chưa tìm thấy số dòng

CẬP NHẬT, ngày 16 tháng 4 năm 2019

Theo đề xuất của Diego Scaravaggi, đối với Postgres 9.2 trở lên, hãy sử dụng NHẬN CÁC CHẨN ĐOÁN ĐƯỢC THEO DÕI :

do language plpgsql $$
declare
    v_state   TEXT;
    v_msg     TEXT;
    v_detail  TEXT;
    v_hint    TEXT;
    v_context TEXT;
begin

    create table yyy(a int);
    create table yyy(a int); -- this will cause an error

exception when others then 

    get stacked diagnostics
        v_state   = returned_sqlstate,
        v_msg     = message_text,
        v_detail  = pg_exception_detail,
        v_hint    = pg_exception_hint,
        v_context = pg_exception_context;

    raise notice E'Got exception:
        state  : %
        message: %
        detail : %
        hint   : %
        context: %', v_state, v_msg, v_detail, v_hint, v_context;

    raise notice E'Got exception:
        SQLSTATE: % 
        SQLERRM: %', SQLSTATE, SQLERRM;     

    raise notice '%', message_text; -- invalid. message_text is contextual to GET STACKED DIAGNOSTICS only

end; $$;

Kết quả:

NOTICE:  Got exception:
        state  : 42P07
        message: relation "yyy" already exists
        detail : 
        hint   : 
        context: SQL statement "create table yyy(a int)"
PL/pgSQL function inline_code_block line 11 at SQL statement
NOTICE:  Got exception:
        SQLSTATE: 42P07 
        SQLERRM: relation "yyy" already exists

ERROR:  column "message_text" does not exist
LINE 1: SELECT message_text
               ^
QUERY:  SELECT message_text
CONTEXT:  PL/pgSQL function inline_code_block line 33 at RAISE
SQL state: 42703

Ngoài GET STACKED DIAGNOSTICS là tuân thủ chuẩn SQL, các biến chẩn đoán của nó (ví dụ:message_text ) chỉ theo ngữ cảnh đối với GSD. Vì vậy, nếu bạn có một trường có tên message_text trong bảng của bạn, không có cơ hội nào để GSD có thể can thiệp vào giá trị trường của bạn.

Tuy nhiên, vẫn không có số dòng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo hoặc thay thế các postgres kích hoạt

  2. Toán tử postgres cho kiểu dữ liệu JSON sử dụng Rails 4

  3. Có bao giờ là một ý tưởng hay khi lưu trữ một mảng dưới dạng giá trị trường hoặc lưu trữ các giá trị mảng dưới dạng bản ghi?

  4. Giao thức Vi phạm:LỖI:liên kết thông báo cung cấp 0 tham số, nhưng câu lệnh đã chuẩn bị yêu cầu 1

  5. pg-promise:sử dụng kết quả của một truy vấn trong truy vấn tiếp theo trong một giao dịch