捕获错误 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

捕获错误

当存储过程中发生错误时,不会运行任何其它代码,事务将回滚。您可以使用 EXCEPTION 块处理错误。

[ <<label>> ] [ DECLARE declarations ] BEGIN statements EXCEPTION WHEN OTHERS THEN statements END;

当发生异常并添加异常处理块时,您可以编写 REAE 语句和大多数其它 PL/pgSQL 语句。例如,您可以使用自定义消息引发异常,也可以将记录插入日志表中。

进入异常处理块时,将回滚当前事务并创建一个新事务来运行块中的语句。如果块中的语句运行没有错误,则会提交事务并重新抛出异常。最后,退出存储过程。

异常块中唯一支持的条件是 OTHERS,它匹配除了查询取消之外的各个错误类型。此外,如果异常处理块中出现错误,错误可由外部异常处理块捕获。

示例

以下示例演示如何在异常处理块中写入语句。

CREATE TABLE employee (firstname varchar, lastname varchar); INSERT INTO employee VALUES ('Tomas','Smith'); CREATE TABLE employee_error_log (message varchar); CREATE OR REPLACE PROCEDURE update_employee_sp() AS $$ BEGIN UPDATE employee SET firstname = 'Adam' WHERE lastname = 'Smith'; EXECUTE 'select invalid'; EXCEPTION WHEN OTHERS THEN RAISE INFO 'An exception occurred.'; INSERT INTO employee_error_log VALUES ('Error message: ' || SQLERRM); END; $$ LANGUAGE plpgsql; CALL update_employee_sp(); INFO: An exception occurred. ERROR: column "invalid" does not exist CONTEXT: SQL statement "select invalid" PL/pgSQL function "update_employee_sp" line 3 at execute statement

在此示例中,如果我们调用 update_employee_sp,则会引发信息性消息 An exception occurred.(发生异常。)并将错误消息插入到日志记录表的 employee_error_log 日志中。在存储过程退出之前再次抛出原始异常。以下查询显示了运行该示例所产生的记录。

SELECT * from employee; firstname | lastname -----------+---------- Tomas | Smith SELECT * from employee_error_log; message ------------------------------------------------ Error message: column "invalid" does not exist

有关 RAISE 的更多信息,包括格式帮助和附加级别列表,请参阅支持的 PL/pgSQL 语句