Oracle与DB2常用语法对比

本内容主要对比Oracle和DB2数据库在常见语法方面的差异,特别是在提取前N条记录时的语法区别。

1. 提取前N条记录

  • Oracle: 使用ROWNUM关键字,例如:SELECT * FROM TableName WHERE ROWNUM <= N;
  • DB2: 使用FETCH FIRST子句,例如:SELECT * FROM TableName FETCH FIRST N ROWS ONLY;

2. DB2错误信息查询

当使用COBOL连接DB2数据库时,遇到错误信息,可通过以下方式查询:

  • 使用DB2命令行工具,输入 db2 ? SQLCODE (将SQLCODE替换为实际的错误代码),例如: db2 ? SQL30081N。系统会返回该错误代码的详细信息及相关解释。

以下列出了一些常见的DB2错误代码及其含义,方便用户快速了解问题原因:

| SQLCODE | SQLSTATE | 错误信息 |

| :------- | :------- | :--------------------------------------------------------------------------------------- |

| 00000 | | SQL语句成功完成 |

| 01xxx | | SQL语句成功完成,但是有警告 |

| +012 | 01545 | 未限定的列名被解释为一个有相互关系的引用 |

| +098 | 01568 | 动态SQL语句用分号结束 |

| +100 | 02000 | 没有找到满足SQL语句的行 |

| +110 | 01561 | 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统 |

| +111 | 01590 | 为2型索引设置了SUBPAGES语句 |

| +117 | 01525 | 要插入的值的个数不等于被插入表的列数 |

| +162 | 01514 | 指定的表空间被置为检查挂起状态 |

| +203 | 01552 | 使用非唯一的名字来解决命名的限定列 |

| +204 | 01532 | 命名的对象未在DB2中定义 |

| +206 | 01533 | 命名的列不在SQL语句中指定的任何表中存在 |

| +218 | 01537 | 因为SQL语句引用一个远程对象,不能为该SQL语句执行EXPLAIN |

| +219 | 01532 | 命名的PLAN TABLE不存在 |

| +220 | 01546 | 不正确定义PLAN TABLE,检查命名列的定义 |

| +236 | 01005 | SQLDA中的SQLN的值至少应于所描述的列的个数一样大 |

| +237 | 01594 | 至少有一个被描述的列应该是单值类型,因此扩展的SQLVAR条目需要另外的空间 |

| +238 | 01005 | 至少应有一个被描述的列是一个LOB,因此扩展的SQLVAR条目需要另外的空间 |

| +239 | 01005 | 至少应有一个被描述的列应是单值类型,因此扩展的SQLVAR条目需要另外的空间 |

| +304 | 01515 | 该值不能被分配给宿主变量,因为该值不再数据类型的范围之内 |

| +331 | 01520 | 不能被翻译的字符串,因此被设置为NULL |

| +339 | 01569 | 由于与DB2 2.2版本的子系统连接,所以可能存在字符转换问题 |

| +394 | 01629 | 使用优化提示来选择访问路径 |

| +395 | 01628 | 设置了无效的优化提示,原因代码指定了为什么,忽略优化提示 |

| +402 | 01521 | 未知的位置 |

| +403 | 015 | ... |