返回首页

gbase数据、南大通用产品文档:GBase8s处理错误

更新日期:2024年09月11日


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 214 -
虽然数据库服务器自动地处理数据类型之间的转换,但使用 SELECT 语句仍可发生错误。
在 SQL 编程中,如同在任何种类的编程中一样,您必须预见错误并随时为应对其做好准
备。
数据的结束
通常会发生没有行满足查询的情况。
在 SELECT 语句之后,
通过 SQLSTATE 代码 02000
和 SQLCODE 中的代码 100 标志此事件。此代码指示一个错误或一般事件,这完全依赖
于您的应用程序。如果您确信应有一行或多行满足查询(例如,如果您使用您刚从另一表
的行读取的键值读取一行的话),则“数据的结束”代码表示在该程序的逻辑中的严重错
误。在另一方面,如果您基于用户提供的键,或其他来源提供的不如程序可靠的键,则数
据的缺乏可能是正常事件。

不符合 ANSI 的数据库的数据的结束
如果您的数据库不符合 ANSI,则跟在 SELECT 语句之后,仅在 SQLCODE 中设置“数
据的结束”返回代码 100。此外,将 SQLSTATE 值设置为 02000。(诸如 INSERT、
UPDATE 和 DELETE 这样的其他语句设置 SQLERRD 的第三个元素,
来展示他们影响了
多少行;通过 SQL 程序修改数据 讨论此主题。)

严重的错误
将 SQLCODE 设置为负值的错误,
或将 SQLSTATE 设置为任何不以 00、
01 或 02 开头
的值的错误通常都很严重。您已开发好的程序或正在生产的程序几乎不应报告这些错误。
然而,很难预料每一种有问题的情况,因此您的程序必须能够处理这些错误。
例如,查询可返回错误 -206,这意味着在该查询中指定的表不在数据库中。如果有人在编
写了程序之后删除了该表,
或如果该程序通过某种逻辑错误或输入错误打开了错误数据库,
则会发生此情况。

使用聚集函数解释数据的结束
使用诸如 SUM、MIN 或 AVG 这样的聚集函数的 SELECT 语句总会成功地返回至少一行
数据,即使当没有行满足 WHERE 子句时。基于行的空集的聚集值为空,但它仍然存在。

然而,如果聚集值是基于都包含空值的一行或多行,则聚集值也为空。如果您必须能够检
测不基于任何行的聚集值与基于某些都是空的行的聚集值之间的差异,则您必须在该语句
中包括 COUNT 函数和聚集值上的指示符变量。然后,您可得出下列情况。
计数值
指示

具体情况
0
-1
选择了零行

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 215 -
计数值
指示

具体情况
>0
-1
选择了某些行;全部为空
>0
0
选择了一些非空行

缺省值
您可以许多方式处理这些不可避免的错误。在某些应用程序中,使用比执行功能更多的行
代码来处理错误。然而,在本部分的示例中,最简单的解决方案之一,缺省值,应奏效,
如下例所示:
avg_price = 0; /* 设置错误的缺省值 */
EXEC SQL SELECT avg (total_price)
INTO :avg_price:null_flag
FROM items;
if (null_flag < 0) /* 可能没有行 */
avg_price = 0; /* 设置 0 行的缺省值 */
前面的示例处理下列事项:

如果查询选择一些非空的行,则返回并使用正确的值。这是期望的并且最常用的结
果。

如果查询没有选择行,
或在发生的可能性很小的情况下,
仅选择在 total_price 列
(从
不应为空的列)中有空值的那些行,则设置该指示符变量,并指定缺省值。

如果发生任何严重的错误,则保持主变量不变;它包含最初设置的缺省值。在程序
中的此点,程序员无需捕获这类错误并报告它们。

用来显示当前所在的database 的名称。
名称
类型
描述
catalog_name
information_schema.sql_ide
ntifier
当前database 的名称。

gcmonitor_agent/conf/sys/snmp_udp_config.properties)。
需要注意的是这里提到的snmp 是agent 端的采集服务,与采集中心的报警推送
snmp 没有关系,不影响与客户的报警集成功能。