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 是否写对、路径是否生效? |