异常处理
在存储过程中使用EXCEPTION处理机制可以提高代码的容错性,但频繁地捕获和处理异常可能会导致性能下降。每次异常处理都涉及上下文的创建和销毁,这会消耗额外的内存和资源。此外,由于异常被捕获,日志中不会记录错误信息,从而增加了问题定位的难度。
建议在必要时才使用EXCEPTION处理机制,并确保传递充足的上下文信息,以便于问题的定位和解决。
gaussdb=# create schema best_practices_for_procedure; CREATE SCHEMA gaussdb=# create table best_practices_for_procedure.tb1(id int, name varchar2(20)); CREATE TABLE gaussdb=# create unique index id1 on best_practices_for_procedure.tb1(id); CREATE INDEX --创建带有exception的存储过程。 gaussdb=# create or replace procedure best_practices_for_procedure.proc1(oi_flag OUT int, os_msg OUT varchar) as begin oi_flag := 0; os_msg := 'insert into tb1 some data.'; for i in 1..10 loop if i = 5 then insert into best_practices_for_procedure.tb1 values(i - 1, 'name'|| i - 1);--人为制造报错。 end if; insert into best_practices_for_procedure.tb1 values(i, 'name'|| i); end loop; exception when others then oi_flag := 1; os_msg := SQLERRM; --将报错信息传递出去。 end; / CREATE PROCEDURE gaussdb=# declare oi_flag int; os_msg varchar(1000); begin best_practices_for_procedure.proc1(oi_flag, os_msg); if oi_flag = 1 then dbe_output.print_line('Exception for ' || os_msg); end if; end; / Exception for Duplicate key value violates unique constraint "id1". ANONYMOUS BLOCK EXECUTE gaussdb=# drop schema best_practices_for_procedure cascade; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to table best_practices_for_procedure.tb1 drop cascades to function best_practices_for_procedure.proc1() DROP SCHEMA