Để 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.