Oracle大数据开发常见错误
在Oracle大数据开发(如ETL、Hadoop抽取)中,常见错误分为五类:
- 字段/表错误 :如
ORA-00904(无效列名)、ORA-00942(表不存在);- 数据类型/转换错误 :如
ORA-01722(数字转换失败)、ORA-12899(字段超长);- 连接/权限错误 :如
ORA-01017(登录失败)、ORA-12541(监听未启动);- 性能/资源错误 :如
ORA-01555(UNDO空间不足)、ORA-04030(内存耗尽);- 并行/分区错误 :如
ORA-14400(分区键不匹配)。
初学者高频错误:
- 语法类:
ORA-00923(漏写FROM)、ORA-00911(无效字符);- 约束类:
ORA-00001(主键冲突)、ORA-02291(外键缺失);- 连接类:
ORA-12154(TNS配置错误)。
速查建议 :通过错误码快速定位问题,如
ORA-00942优先检查表名拼写和权限。
大数据开发场景下,总结并翻译 Oracle 中常见的错误
在 Oracle 大数据开发(如数据迁移、ETL、Hadoop 抽取)中,常见错误可分为连接/权限类 、SQL/字段类 、数据类型/转换类 、资源/性能类。以下是典型错误及中英文对照总结:
一、字段/表不明确或不存在
| Oracle 错误(英文) | 中文翻译 | 常见原因 |
|---|---|---|
ORA-00918: column 'emp_no' in field list is ambiguous |
字段列表中的列 'emp_no' 有歧义 | 多表关联时未指定表别名 |
ORA-00904: "EMP_NO": invalid identifier |
无效标识符 | 列名写错/不存在;未加双引号区分大小写 |
ORA-00942: table or view does not exist |
表或视图不存在 | 表名拼错、不在当前 schema、无权限 |
ORA-00933: SQL command not properly ended |
SQL 命令未正确结束 | 多了一条分号或缺少关键字 |
二、数据类型/转换错误(大数据 ETL 常见)
| Oracle 错误 | 中文翻译 | 常见原因 |
|---|---|---|
ORA-01722: invalid number |
无效数字 | 将字符串转数字时含非数字字符 |
ORA-01843: not a valid month |
不是有效月份 | 日期格式不匹配 |
ORA-12899: value too large for column |
列的值过大 | 字段长度不足,如 VARCHAR2(10) 存了 12 个字符 |
ORA-01461: can bind a LONG value only for insert into a LONG column |
只能为 LONG 列绑定 LONG 值 | 将大文本错误插入非 LONG 字段 |
三、连接/权限/资源错误
| Oracle 错误 | 中文翻译 | 常见原因 |
|---|---|---|
ORA-01017: invalid username/password; logon denied |
用户名/密码无效,登录被拒绝 | 凭证错误或账户锁定 |
ORA-28009: connection as SYS should be as SYSDBA or SYSOPER |
以 SYS 连接应使用 SYSDBA 或 SYSOPER | 未用正确角色连接 |
ORA-12541: TNS:no listener |
TNS:无监听程序 | 数据库监听未启动 |
ORA-12514: TNS:listener does not currently know of service requested |
监听程序当前不知道请求的服务 | 服务名错误或未注册 |
四、性能/资源限制(大数据抽取时高发)
| Oracle 错误 | 中文翻译 | 常见原因 |
|---|---|---|
ORA-01555: snapshot too old |
快照过旧 | UNDO 表空间不足,大查询超过 undo_retention |
ORA-30036: unable to extend segment by in undo tablespace |
无法在 undo 表空间中扩展段 | UNDO 空间不足 |
ORA-01652: unable to extend temp segment by in tablespace |
无法在表空间中扩展临时段 | 临时表空间太小 |
ORA-04030: out of process memory |
进程内存不足 | PGA 不够或 CURSOR 泄漏 |
五、并行/分区/大数据操作错误
| Oracle 错误 | 中文翻译 | 常见原因 |
|---|---|---|
ORA-12801: error signaled in parallel query server |
并行查询服务器中发生错误 | 并行执行中某个从进程失败 |
ORA-14400: inserted partition key does not map to any partition |
插入的分区键未映射到任何分区 | 无对应分区(未建 MAXVALUE 分区) |
ORA-14074: partition maintenance cannot be performed on a table with domain indexes |
无法在具有域索引的表上执行分区维护 | 未先删除域索引 |
如需用于代码捕获映射,可将上述错误按如下方式组织为字典(Python示例):
python
oracle_errors_map = {
"ORA-00918": "字段列表中的列存在歧义,请检查多表关联时的别名",
"ORA-00904": "无效列名,检查是否存在或大小写敏感",
"ORA-00942": "表或视图不存在,检查 schema 或权限",
"ORA-01722": "数字转换失败,检查源数据是否含非数字字符",
"ORA-01555": "快照过旧,增大 UNDO 表空间或缩短查询时间",
"ORA-12899": "数据列长度超限,增加目标字段长度或截断处理",
}
补充其他错误码:适合初学者
以下补充适合大数据初学者 在 Oracle 开发、数据抽取(Sqoop/DataX/Spark)中高频遇到的易懂错误码,附带中文解释和直观示例。
六、基础语法/常见新手错误
| Oracle 错误 | 中文翻译 | 简单白话解释 | 示例 |
|---|---|---|---|
ORA-00923: FROM keyword not found where expected |
未在期望位置找到 FROM 关键字 | 写了 SELECT 但忘了写 FROM 表名 |
SELECT emp_no → 少 FROM employees |
ORA-00936: missing expression |
缺少表达式 | SELECT 后面只跟了逗号或空 |
SELECT , FROM dual |
ORA-00911: invalid character |
无效字符 | 语句里出现了中文标点或特殊符号 | 分号用了全角 ; |
ORA-00942: table or view does not exist |
表或视图不存在 | 表名写错、大小写敏感(双引号)、或者没加 schema 前缀 | SELECT * FROM emp 但实际表是 employees |
ORA-00933: SQL command not properly ended |
SQL 命令未正确结束 | 多写了多余的分号或 ORDER BY 放错位置 |
SELECT * FROM t; WHERE id=1 |
七、数据插入/更新新手错误
| Oracle 错误 | 中文翻译 | 简单白话解释 | 示例 |
|---|---|---|---|
ORA-01400: cannot insert NULL into () |
无法将 NULL 插入非空列 | 插入时漏掉了一个必填字段 | INSERT INTO emp (id) VALUES (1) 但 name 列不允许 NULL |
ORA-00001: unique constraint violated |
违反唯一约束 | 插入了重复的主键或唯一键值 | 两次插入相同 id=100 |
ORA-02291: integrity constraint violated - parent key not found |
外键约束违规 - 父键不存在 | 插入子表的外键值在主表里没有 | 插入订单时写了一个不存在的客户编号 |
ORA-02292: child record found |
存在子记录 | 删除主表记录时报错,因为子表还在引用它 | DELETE FROM dept 但该部门还有员工 |
八、表/字段操作新手错误
| Oracle 错误 | 中文翻译 | 简单白话解释 |
|---|---|---|
ORA-00955: name is already used by an existing object |
名称已被现有对象使用 | 重复创建同名表、索引或序列 |
ORA-00903: invalid table name |
无效表名 | 表名用了保留关键字(如 SELECT 作为表名)或数字开头 |
ORA-00904: invalid identifier |
无效标识符 | 列名写错,或者改表结构后忘了提交 |
九、常见连接/环境错误(初学者容易踩坑)
| Oracle 错误 | 中文翻译 | 白话解释 | 检查方法 |
|---|---|---|---|
ORA-12154: TNS:could not resolve the connect identifier specified |
TNS:无法解析指定的连接标识符 | 连接字符串(或 tnsnames.ora)写错了 | 检查 ORCL= 那一行是否有格式错误 |
ORA-12560: TNS:protocol adapter error |
TNS:协议适配器错误 | 本地没有启动 Oracle 服务,或环境变量不对 | 运行 lsnrctl status 看服务状态 |
ORA-01033: ORACLE initialization or shutdown in progress |
Oracle 正在初始化或关闭中 | 数据库正在启动或关闭,等一会儿再连 | 多等 30 秒重试 |
十、SELECT 查询新手经典错误
| Oracle 错误 | 中文翻译 | 白话解释 |
|---|---|---|
ORA-00979: not a GROUP BY expression |
不是 GROUP BY 表达式 | GROUP BY 中漏写了要直接展示的列 |
ORA-00918: column ambiguously defined |
列定义有歧义 | 两个表都有 id 列,必须写 表.id |
ORA-01747: invalid user.table.column, table.column, or column specification |
无效的列指定 | 更新时试图修改系统保留字作为列名 |
一个适合初学者的「错误码×解决方法」速查表(常见场景)
| 你看到的错误 | 优先检查方法 |
|---|---|
ORA-00942 |
1. 表名是否拼错? 2. 是否少写了 用户名.表名? 3. 是否有权限? |
ORA-01722 |
数据里是否有字母或空字符串被转数字? |
ORA-01400 |
INSERT 时所有 NOT NULL 列是否都给了值? |
ORA-00001 |
是否重复插入了主键? |
ORA-12154 |
tnsnames.ora 是否写对、路径是否生效? |