数据检索错误

使用此信息可了解 SQL 如何处理检索数据时发生的错误。

如果 SQL 发现检索到的字符或图形列太长而无法放在主变量中,那么 SQL 将执行以下操作:

  • 在将值分配给主变量时截断数据。
  • 将 SQLCA 中的 SQLWARN0 和 SQLWARN1 设置为值 "W" ,或者将 SQL 诊断区域中的 RETURNED_SQLSTATE 设置为 "01004"。
  • 将指示符变量 (如果提供) 设置为截断前值的长度。

如果 SQL 在运行语句时发现数据映射错误,那么会发生以下两种情况之一:

  • 如果在 SELECT 列表中的表达式上发生错误,并且为出错的表达式提供了指示符变量:
    • 对于与错误表达式相对应的指示变量,SQL 返回 -2 。
    • SQL 返回该行的所有有效数据。
    • SQL 返回正 SQLCODE。
  • 如果未提供指示符变量,那么 SQL 将返回相应的负 SQLCODE。

数据映射错误包括:

  • +138-子串函数的自变量无效。
  • +180-日期,时间或时间戳记的字符串表示的语法无效。
  • +181-日期,时间或时间戳记的字符串表示不是有效值。
  • +183-来自日期/时间表达式的结果无效。 生成的日期或时间戳记不在有效的日期或时间戳记范围内。
  • +191-MIXED 数据的格式不正确。
  • +304-数字转换错误 (例如,溢出,下溢或除以零)。
  • +331-无法转换字符。
  • +364-DECFLOAT 算术错误。
  • +420-CAST 自变量中的字符无效。
  • +802-数据转换或数据映射错误。

对于数据映射错误, SQLCA 仅报告检测到的最后一个错误。 与出现错误的每个结果列相对应的指示变量被设置为 -2 。

对于多行 FETCH 上的数据映射错误,报告为警告 SQLSTATE 的每个映射错误都将在 SQL 诊断区域中具有单独的条件区域。 请注意, SQL 在第一个错误时停止,因此将在 SQL 诊断区域中仅返回一个报告为错误 SQLSTATE 的映射错误。

对于所有其他 SQL 语句,将在 SQL 诊断区域中仅报告最后一个警告 SQLSTATE。

如果全选在选择列表中包含 DISTINCT ,并且选择列表中的列包含无效的数字数据,那么当查询作为排序完成时,该数据将被视为等于空值。 如果使用现有索引,那么数据不会被视为等于空值。

数据映射错误对 ORDER BY 子句的影响取决于情境:

  • 如果在将数据分配给 SELECT INTO 或 FETCH 语句中的主变量时发生数据映射错误,并且在 ORDER BY 子句中使用了相同的表达式,那么将根据表达式的值对结果记录进行排序。 它的排序不像它是空值 (高于所有其他值)。 这是因为在尝试对主变量进行赋值之前对表达式进行了求值。
  • 如果在对选择列表中的表达式进行求值时发生数据映射错误,并且在 ORDER BY 子句中使用了相同的表达式,那么结果列通常会按其为空值 (高于所有其他值) 的顺序排序。 如果通过使用排序来实现 ORDER BY 子句,那么将对结果列进行排序,就像它是空值一样。 如果使用现有索引来实现 ORDER BY 子句,那么在以下情况下,将根据索引中表达式的实际值对结果列进行排序:
    • 表达式是日期格式为 *MDY , *DMY , *YMD 或 *JUL 的日期列,由于日期不在日期的有效范围内,因此发生日期转换错误。
    • 表达式是字符列,不能转换字符。
    • 表达式为十进制列,并且检测到无效的数字值。