oracle 预定义异常说明

本文详细介绍了PL/SQL中常见的错误代码及其含义,包括未定义对象、集合未初始化、游标操作错误等,有助于开发者快速定位并解决问题。
ACCESS_INTO_NULL         未定义对象  
CASE_NOT_FOUND         CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时  
COLLECTION_IS_NULL         集合元素未初始化  
CURSER_ALREADY_OPEN         游标已经打开  
DUP_VAL_ON_INDEX         唯一索引对应的列上有重复的值  
INVALID_CURSOR         在不合法的游标上进行操作  
INVALID_NUMBER         内嵌的 SQL 语句不能将字符转换为数字  
NO_DATA_FOUND         使用 select into 未返回行,或应用索引表未初始化的元素时  
TOO_MANY_ROWS         执行 select into 时,结果集超过一行  
ZERO_DIVIDE         除数为 0  
SUBSCRIPT_BEYOND_COUNT         元素下标超过嵌套表或 VARRAY 的最大值  
SUBSCRIPT_OUTSIDE_LIMIT         使用嵌套表或 VARRAY 时,将下标指定为负数  
VALUE_ERROR         赋值时,变量长度不足以容纳实际数据  
LOGIN_DENIED         PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码  
NOT_LOGGED_ON         PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据  
PROGRAM_ERROR         PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包  
ROWTYPE_MISMATCH         宿主游标变量与 PL/SQL 游标变量的返回类型不兼容  
SELF_IS_NULL         使用对象类型时,在 null 对象上调用对象方法  
STORAGE_ERROR         运行 PL/SQL 时,超出内存空间  
SYS_INVALID_ID         无效的 ROWID 字符串  
TIMEOUT_ON_RESOURCE         Oracle 在等待资源时超时

<think>嗯,用户问的是Oracle预定义异常对应达梦数据库中的哪些预定义异常。首先,我需要回忆一下Oracle常见的预定义异常,比如NO_DATA_FOUND、TOO_MANY_ROWS、DUP_VAL_ON_INDEX这些。然后,我得了解达梦数据库的异常处理机制,特别是它们的预定义异常名称和对应的错误码。 可能用户是在迁移项目,从Oracle到达梦,所以需要处理存储过程或PL/SQL代码中的异常。用户可能希望代码在达梦上运行时,原有的异常处理逻辑仍然有效,或者需要相应的调整。因此,正确对应异常名称和错误码是关键。 我需要检查达梦的官方文档,确认他们的预定义异常名称和对应的错误码是否与Oracle一致,或者是否有不同的命名。例如,Oracle的NO_DATA_FOUND在达梦中是否也叫NO_DATA_FOUND,或者是否有不同的错误码,比如可能使用-1403这样的代码。 另外,达梦可能有一些自己特有的预定义异常,而Oracle的某些异常在达梦中可能没有直接对应的,这时候可能需要用户自定义异常。例如,Oracle的INVALID_CURSOR可能在达梦中不存在,需要用户根据错误码手动定义。 还要注意错误码的范围,Oracle预定义异常通常对应特定的错误码,而达梦可能使用不同的数值,需要一一对应。例如,TOO_MANY_ROWS在Oracle是-1422,在达梦可能对应不同的错误码,或者相同的异常名称但不同的错误码。 最后,总结常见的对应关系,并提醒用户在实际使用时需要测试和参考达梦的文档,因为不同版本可能有差异。同时,建议用户处理未明确的异常时使用OTHERS异常处理器,或者自定义异常绑定特定的错误码。</think>在 Oracle 和达梦数据库(DM)中,预定义异常的名称和错误码可能不完全一致,但常见的异常场景可以对应。以下是 Oracle 常见预定义异常在达梦中的对应关系及注意事项: --- ### **常见预定义异常对照表** | **Oracle 异常** | **Oracle 错误码** | **达梦异常/处理方式** | **达梦错误码** | **说明** | |--------------------------|-------------------|-----------------------------------|---------------|------------------------------------| | `NO_DATA_FOUND` | `ORA-01403` | `NO_DATA_FOUND` | `-1403` | 查询无结果时触发 | | `TOO_MANY_ROWS` | `ORA-01422` | `TOO_MANY_ROWS` | `-1422` | SELECT INTO 返回多行时触发 | | `DUP_VAL_ON_INDEX` | `ORA-00001` | `DUP_VAL_ON_INDEX` | `-1` | 唯一索引冲突时触发 | | `INVALID_CURSOR` | `ORA-01001` | 需自定义异常或检查错误码 | `-1001` | 非法游标操作时触发 | | `ZERO_DIVIDE` | `ORA-01476` | `ZERO_DIVIDE` | `-1476` | 除数为零时触发 | | `VALUE_ERROR` | `ORA-06502` | `VALUE_ERROR` | `-6502` | 数据类型转换或长度不匹配时触发 | | `CURSOR_ALREADY_OPEN` | `ORA-06511` | 需自定义异常或检查错误码 | `-6511` | 重复打开已打开的游标时触发 | | `STORAGE_ERROR` | `ORA-06500` | 需自定义异常或检查错误码 | `-6500` | 内存溢出或 PL/SQL 运行时错误 | | `TIMEOUT_ON_RESOURCE` | `ORA-00051` | 需自定义异常或检查错误码 | `-51` | 等待资源超时 | --- ### **注意事项** 1. **直接对应关系**: `NO_DATA_FOUND`、`TOO_MANY_ROWS`、`DUP_VAL_ON_INDEX` 等常用异常名称在达梦中保留,但需确认错误码是否一致(部分可能不同)。 2. **需自定义的异常**: 如 `INVALID_CURSOR`、`CURSOR_ALREADY_OPEN` 等,达梦可能未预定义同名异常,需通过错误码手动绑定: ```sql DECLARE invalid_cursor EXCEPTION; PRAGMA EXCEPTION_INIT(invalid_cursor, -1001); BEGIN -- 业务逻辑 EXCEPTION WHEN invalid_cursor THEN DBMS_OUTPUT.PUT_LINE('游标操作非法'); END; ``` 3. **错误码差异**: 达梦的某些错误码可能与 Oracle 不同,需通过实际测试或查阅达梦官方文档(如《DM PL/SQL 用户手册》)确认。 4. **OTHERS 处理器**: 建议使用 `OTHERS` 捕获未明确处理的异常,并通过 `SQLCODE` 和 `SQLERRM` 获取详细信息: ```sql EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误码: ' || SQLCODE || ', 错误信息: ' || SQLERRM); ``` --- ### **总结** - **直接兼容的异常**:可直接沿用 Oracle异常名称(如 `NO_DATA_FOUND`)。 - **需适配的异常**:需检查达梦错误码并绑定自定义异常。 - **文档参考**:建议以达梦官方文档为准,不同版本可能存在差异。 迁移时建议通过完整测试覆盖异常场景,确保兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值