त्रुटि संदेश और उसके कोड को पकड़ने के लिए:
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';
अभी तक लाइन नंबर नहीं मिला है
अप्रैल, 16, 2019 को अपडेट करें
डिएगो स्कारवाग्गी के सुझाव के अनुसार, पोस्टग्रेज़ 9.2 और बाद के वर्शन के लिए, स्टैक्ड डायग्नोस्टिक्स प्राप्त करें :
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; $$;
परिणाम:
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
GET STACKED DIAGNOSTICS
. के अलावा SQL मानक-अनुपालन है, इसके निदान चर (उदा., message_text
) केवल जीएसडी के लिए प्रासंगिक हैं। तो अगर आपके पास message_text
. नाम की कोई फ़ील्ड है आपकी तालिका में, इस बात की कोई संभावना नहीं है कि GSD आपके क्षेत्र के मूल्य में हस्तक्षेप कर सकता है।
हालांकि अभी भी कोई लाइन नंबर नहीं है।