ORA-01422与ORA-01403错误

本文详细描述了在使用'AFTERLOGONONDATABASE'触发器后遇到的Oracle数据库错误ORA-00604和ORA-01422,并提供了排查和解决这些问题的方法,最终通过异常处理语句成功解决了错误。

添加一个'AFTER LOGON ON DATABASE'的trigger以后,发现日志中出现如下错误片段:

ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在 line 5

检查了trigger中的查询语句后,发现以下查询的确是返回了多行数据:

select username,SYS_CONTEXT('USERENV','IP_ADDRESS')  
into v_username,v_ip
from sys.v_$session where AUDSID = SYS_CONTEXT('USERENV', 'SESSIONID');

在后面加入了过滤条件,完整语句如下:

select username,SYS_CONTEXT('USERENV','IP_ADDRESS')  
into v_username,v_ip
from sys.v_$session where AUDSID = SYS_CONTEXT('USERENV', 'SESSIONID')
 and upper(username) not in ('SYS') and type<>'BACKGROUND';

解决此问题后,发现报了另外一个错误:

ORA-04088: error during execution of trigger '...'
ORA-01403: no data found
ORA-06512: at line 5

加入如下异常处理语句后解决:

EXCEPTION
 WHEN NO_DATA_FOUND
  THEN
...

 

转载于:https://my.oschina.net/liuliufa/blog/63346

### ORA-01422错误代码解决方案 ORA-01422错误通常在使用`SELECT INTO`语句期望返回一行,但实际返回多行时出现。当使用以下Oracle过程根据输入SQL语句的PO ID返回一行或者更多行,返回多行就会收到该错误提示。为了一对多地返回数据行,可以使用游标来处理多行结果。以下是示例代码: ```sql -- 创建一个包规范 CREATE OR REPLACE PACKAGE test_package AS -- 定义一个游标类型 TYPE test_cursor_type IS REF CURSOR; -- 定义一个函数,返回游标 FUNCTION get_po_data(p_po_id VARCHAR2) RETURN test_cursor_type; END test_package; / -- 创建包体 CREATE OR REPLACE PACKAGE BODY test_package AS FUNCTION get_po_data(p_po_id VARCHAR2) RETURN test_cursor_type IS v_cursor test_cursor_type; BEGIN -- 打开游标,执行查询语句 OPEN v_cursor FOR SELECT * FROM your_table_name WHERE po_id = p_po_id; -- 返回游标 RETURN v_cursor; END get_po_data; END test_package; / -- 测试函数 DECLARE v_cursor test_package.test_cursor_type; v_row your_table_name%ROWTYPE; BEGIN -- 调用函数获取游标 v_cursor := test_package.get_po_data('0700185'); -- 循环遍历游标 LOOP FETCH v_cursor INTO v_row; EXIT WHEN v_cursor%NOTFOUND; -- 处理每一行数据,这里只是简单打印 DBMS_OUTPUT.PUT_LINE('Column1: ' || v_row.column1 || ', Column2: ' || v_row.column2); END LOOP; -- 关闭游标 CLOSE v_cursor; END; / ``` 在上述代码中,创建了一个包,包中定义了一个游标类型和一个返回该游标类型的函数。函数中打开一个游标,执行查询语句,然后返回该游标。在测试代码中,调用函数获取游标,然后使用`LOOP`循环遍历游标获取每一行数据进行处理,最后关闭游标。 ### ORA-20001错误代码解决方案 ORA-20001 是用户自定义错误代码,通常是在 PL/SQL 代码中使用`RAISE_APPLICATION_ERROR`函数抛出的错误。要解决这个错误,需要查看抛出该错误的 PL/SQL 代码。以下是示例代码: ```sql -- 创建一个存储过程,模拟抛出 ORA-20001 错误 CREATE OR REPLACE PROCEDURE test_procedure AS v_condition BOOLEAN := TRUE; BEGIN IF v_condition THEN -- 抛出 ORA-20001 错误 RAISE_APPLICATION_ERROR(-20001, 'This is a custom error message for ORA-20001'); END IF; EXCEPTION WHEN OTHERS THEN -- 捕获异常并处理 DBMS_OUTPUT.PUT_LINE('Error Code: ' || SQLCODE || ', Error Message: ' || SQLERRM); END; / -- 调用存储过程 BEGIN test_procedure(); END; / ``` 在上述代码中,创建了一个存储过程,在存储过程中使用`RAISE_APPLICATION_ERROR`函数抛出 ORA-20001 错误。在异常处理部分,捕获异常并打印错误代码和错误信息。要解决这个错误,需要根据具体业务逻辑修改`v_condition`的值或者修改抛出错误的条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值