首页 > 解决方案 > DB2 中的@@error 有什么相同之处?

问题描述

我想在 DB2 中处理异常。例外可能是我们事先不知道的任何事情(失去连接或任何事情)。

在 SQL Server 中,我可以这样做,例如:

DECLARE @i_Error INTEGER
DECLARE @i_Row  INTEGER

UPDATE Table_Name
SET Column_Name1 = 'Value1'
WHERE Column_Name2 = 'Value2'

SELECT  @i_Error = @@ERROR,
        @i_Row = @@ROWCOUNT

IF @i_Error <> 0
    GOTO ExitRoutine


ExitRoutine:
    -- Something to exit here

@@ERRORSQL Server 中存在,但 DB2 不存在,那么我如何在 DB2 中做同样的事情呢?

标签: sql-servererror-handlingdb2

解决方案


大多数平台上的 Db2 都提供ANSI SQL PL,您可以在命名块(例程(函数、存储过程)和触发器中)以及匿名块中使用它。

使用 ANSI SQL PL,您的代码可以使用结构化异常处理来捕获和响应错误。如果您以前没有使用过结构化异常处理程序,那么有一个学习曲线。

SQL PL 代码块可以使用 continue-handlers 或 exit-handlers 或 undo-handlers 来捕获错误并对错误做出反应。此类异常处理程序可以公开某些 SQL 语句的执行可以设置的SQLCODE 和 SQLSTATE值。块可以嵌套,每个块都可以有自己的异常处理程序。还可以使用相关语句SIGNALRESIGNAL用于引发异常,以及GET DIAGNOSTICS语句来访问返回状态、row_count 和错误详细信息。其中一些是版本相关的,并且可能存在特定于平台的变化。

可以为特定条件或一般情况声明异常处理程序。您可以有多个处理程序,每个处理程序用于不同类型的条件和不同类型的响应(继续、退出、撤消)。

您需要注意存储过程中的默认退出处理程序,它可能会立即退出任何负 SQLCODE。

Db2 for Linux/Unix/Windows 在专门配置时还提供了 Oracle PL/SQL 的模拟,在这种情况下,Oracle 样式语法可用于处理错误。

在 3GL(如 C 或 C++ 或 COBOL 等)中使用嵌入式 SQL 进行编程时,应用不同的概念,并且 SQLCODE 和 SQLSTATE 使用另一种技术公开。


推荐阅读