sql-server - 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
@@ERROR
SQL Server 中存在,但 DB2 不存在,那么我如何在 DB2 中做同样的事情呢?
解决方案
大多数平台上的 Db2 都提供ANSI SQL PL,您可以在命名块(例程(函数、存储过程)和触发器中)以及匿名块中使用它。
使用 ANSI SQL PL,您的代码可以使用结构化异常处理来捕获和响应错误。如果您以前没有使用过结构化异常处理程序,那么有一个学习曲线。
SQL PL 代码块可以使用 continue-handlers 或 exit-handlers 或 undo-handlers 来捕获错误并对错误做出反应。此类异常处理程序可以公开某些 SQL 语句的执行可以设置的SQLCODE 和 SQLSTATE值。块可以嵌套,每个块都可以有自己的异常处理程序。还可以使用相关语句SIGNAL和RESIGNAL用于引发异常,以及GET DIAGNOSTICS语句来访问返回状态、row_count 和错误详细信息。其中一些是版本相关的,并且可能存在特定于平台的变化。
可以为特定条件或一般情况声明异常处理程序。您可以有多个处理程序,每个处理程序用于不同类型的条件和不同类型的响应(继续、退出、撤消)。
您需要注意存储过程中的默认退出处理程序,它可能会立即退出任何负 SQLCODE。
Db2 for Linux/Unix/Windows 在专门配置时还提供了 Oracle PL/SQL 的模拟,在这种情况下,Oracle 样式语法可用于处理错误。
在 3GL(如 C 或 C++ 或 COBOL 等)中使用嵌入式 SQL 进行编程时,应用不同的概念,并且 SQLCODE 和 SQLSTATE 使用另一种技术公开。
推荐阅读
- blazor - Blazor 服务器端 - 如何使用 RevalidatingServerAuthenticationStateProvider 继续检查令牌到期?
- python - 我的项目(Django 数据库)的问题
- azure-web-app-service - 在 Azure 中,如何创建将捕获用户信息的 Web 应用程序,该应用程序主要是一个可容纳 300 个用户的普通 Web 表单并创建仪表板
- react-spring - react-spring - 设置插值的初始值
- html - 将 Less 变量传递给属性选择器
- flutter - “在布局期间,RenderStack 对象被赋予了无限大小”当在堆栈中使用定位时
- java - Java Apache HttpClient - 身份验证变得陈旧
- .net-core - 如何发布 .NET Core Worker Service 以确保它不处于生产模式 (DOTNET_ENVIRONMENT)?
- firebase - 在 Firestore 中设置自定义声明
- shopware6 - Shopware 6:如何通过 SalesChannel 级别的 EventSubscriberInterface 检测任何类别添加/更新?