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 | ... |