oracle1422,奇怪的ORA-1422错误
发现bug总是喜欢扎堆,也许很长时间都碰不到bug,可能会在短时间内,碰到很多的bug。
这个bug又是在10.2.0.3上发现的。
检查后台alert文件时,发现一个JOB运行报错:
Errors in file /opt/oracle/admin/tradedb/bdump/tradedb1_j000_5103.trc:
ORA-12012:自动执行作业77出错ORA-01422:实际返回的行数超出请求的行数ORA-06512:在line 14
查询DBA_JOBS,发现这个JOB会运行一个存储过程。
开始没有太当回事,一般造成这个错误都是由于类似SELECT INTO的时候读取了多条记录造成的,比如:
SQL> DECLARE
2 V_NAME VARCHAR2(30);
3 BEGIN
4 SELECT TNAME INTO V_NAME FROM TAB;
5 END;
6 /
DECLARE
*第1行出现错误:
ORA-01422:实际返回的行数超出请求的行数ORA-06512:在line 4
但是在检查存储过程的时候,并没有发现类似的问题。而且,存储过程中进行了错误信息的捕获。
既然进行错误的捕获,而错误还能被抛出来,那么错误应该是出自存储过程的EXCEPTION部分。
但是EXCEPTION部分代码很简单,出错的可能性很小,更没有可能出现ORA-1422错误。
尝试执行这个存储过程,结果发现存储过程可以顺利执行。尝试DBMS_JOB.RUN运行这个失败的JOB,发现JOB也可以顺利运行。
于是开始怀疑这个问题是Oracle的bug,到metalink上一搜索,果然如此。
由于建立了一个系统登陆触发器,且触发器中对V$SESSION动态视图进行了查询,由于包含对SYSDATE的访问,造成了对JOB运行的阻塞,导致触发器中读取V$SESSION视图时出现ORA-1422错误。
Oracle给出的解决方法是删除或禁止系统触发器,或者在触发器中去掉SYSDATE函数。
Oracle在Doc ID:Note:402508.1中给出详细的描述。
根据Oracle给出的方法,原始的触发器:
SQL> CREATE TABLE LOGIN_LOGS
2 (
3 LOGIN_DATE DATE,
4 USERNAME VARCHAR2(30),
5 BG_JOB_ID VARCHAR2(64),
6 INSTANCE VARCHAR2(30),
7 IP_ADDRESS VARCHAR2(30),
8 OS_USER VARCHAR2(30),
9 TERMINAL VARCHAR2(30),
10 MACHINE VARCHAR2(64),
11 PROGRAM VARCHAR2(48),
12 MODULE VARCHAR2(48),
13 CLIENT_INFO VARCHAR2(64),
14 SERVICE_NAME VARCHAR2(64)
15 );
表已创建。
SQL> CREATE OR REPLACE TRIGGER TRI_ON_LOGON AFTER LOGON ON DATABASE
2 DECLARE
3 V_USER VARCHAR2(30);
4 V_OSUSER VARCHAR2(30);
5 V_TERMINAL VARCHAR2(30);
6 V_MACHINE VARCHAR2(64);
7 V_PROGRAM VARCHAR2(48);
8 V_MODULE VARCHAR2(48);
9 V_CLIENT_INFO VARCHAR2(64);
10 V_SERVICE_NAME VARCHAR2(64);
11 BEGIN
12 SELECT UPPER(USER) INTO V_USER FROM DUAL;
13 IF V_USER = 'YANGTK' THEN
14
15 SELECT OSUSER, TERMINAL, MACHINE, PROGRAM, MODULE, CLIENT_INFO, SERVICE_NAME
16 INTO V_OSUSER, V_TERMINAL, V_MACHINE, V_PROGRAM, V_MODULE, V_CLIENT_INFO, V_SERVICE_NAME
17 FROM V$SESSION
18 WHERE AUDSID = SYS_CONTEXT('USERENV', 'SESSIONID');
19
20 INSERT INTO LOGIN_LOGS VALUES
21 (
22 SYSDATE,
23 V_USER,
24 SYS_CONTEXT('USERENV', 'FG_JOB_ID'),
25 SYS_CONTEXT('USERENV', 'INSTANCE'),
26 SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
27 V_OSUSER,
28 V_TERMINAL,
29 V_MACHINE,
30 V_PROGRAM,
31 V_MODULE,
32 V_CLIENT_INFO,
33 V_SERVICE_NAME
34 );
35 END IF;
36 END;
37 /
触发器已创建
应该修改为:
SQL> CREATE OR REPLACE TRIGGER TRI_ON_LOGON AFTER LOGON ON DATABASE
2 DECLARE
3 V_USER VARCHAR2(30);
4 V_OSUSER VARCHAR2(30);
5 V_TERMINAL VARCHAR2(30);
6 V_MACHINE VARCHAR2(64);
7 V_PROGRAM VARCHAR2(48);
8 V_MODULE VARCHAR2(48);
9 V_CLIENT_INFO VARCHAR2(64);
10 V_SERVICE_NAME VARCHAR2(64);
11 BEGIN
12 SELECT UPPER(USER) INTO V_USER FROM DUAL;
13 IF V_USER = 'YANGTK' THEN
14
15 SELECT OSUSER, TERMINAL, MACHINE, PROGRAM, MODULE, CLIENT_INFO, SERVICE_NAME
16 INTO V_OSUSER, V_TERMINAL, V_MACHINE, V_PROGRAM, V_MODULE, V_CLIENT_INFO, V_SERVICE_NAME
17 FROM V$SESSION
18 WHERE AUDSID = SYS_CONTEXT('USERENV', 'SESSIONID')
19 AND ROWNUM = 1;
20
21 INSERT INTO LOGIN_LOGS VALUES
22 (
23 SYSDATE,
24 V_USER,
25 SYS_CONTEXT('USERENV', 'FG_JOB_ID'),
26 SYS_CONTEXT('USERENV', 'INSTANCE'),
27 SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
28 V_OSUSER,
29 V_TERMINAL,
30 V_MACHINE,
31 V_PROGRAM,
32 V_MODULE,
33 V_CLIENT_INFO,
34 V_SERVICE_NAME
35 );
36 END IF;
37 END;
38 /
触发器已创建
oracle1422,奇怪的ORA-1422错误相关推荐
- linux下ora-12505,甲骨文临时ORA 12505错误后的Linux启动
我遇到与Oracle一个很奇怪的现象,也许有人可以帮助我,让我总结一下真正的快:甲骨文临时ORA 12505错误后的Linux启动 我的首选操作系统是Debian的Linux操作系统,我使用的是Ora ...
- 奇怪的curl 403错误
最近在一家公司实习,按照他们技术总裁的要求写一个URL连接检查器,从数据库里面select出url后判断他的访问状态生成报告,php或者python任选,我自然选择了自己最熟悉的php了 但是程序跑了 ...
- java ora 00911_ORA-00911错误
ORA-00911,"911"看着很霸气的错误号,虽然我还是Oracle的初学者,但每次碰到一个未见过的ORA错误号后,都有一种查案的赶脚,根据错误号.OERR.相关错误信息,判断 ...
- 关于Oracle的ORA 12505错误 ORA-12505, TNS:listener does not currently know of SID given in connect descrip
报错是这样的:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 一直用的好好的,突然 ...
- oracle提示01034,oracle数据库ORA 01034错误问题解决方案
ORA-01034错误的话: Oracle常见错误之一 这是个Oracle数据库服务器比较常见的错误.有经验的用户几乎马上就能解决这个错误,再不济也能马上到Metalink去搜索一下. 不幸的是,大多 ...
- c++奇怪的1179链接错误
元<常符*c>构 字典{}; 上面这样,输入文件名,在同时用两个字典的子类时,会出现问题,报错1179链接错误,说字典已有comdat. 改为: 元<常符*c,类 T=空>构 ...
- PLSQL连接Oracle数据库时报ORA 12154错误的解决方法
pl/sql连接Oracle时遇到的问题: 解决办法:安装后将Oracle安装目录下的文件夹network(包括其中的子文件,其中主要是tnsnames.ora) 在pl/sql菜单–"工具 ...
- 一个奇怪的EL表达式错误
下图是在Struts2的action中写的一个方法 JSP页面代码如下: 在页面访问如下路径:http://localhost:8088/maven_ssh/cust_getCustList 目前推测 ...
- mysql查询错误_一个奇怪的MySQL查询错误
t_user表的phone_number字段是varchar(255)类型的,表示手机号, 在查询某个手机号时,sql语句如下: SELECT phone_number FROM t_user WH ...
最新文章
- 创业笔记-Node.js入门之阻塞与非阻塞
- 算法效果AB测试中的PV-UV不对称性
- sql php修改mysql结构_sql怎么修改表内容
- C语言 指针在函数传参中的使用
- 前端可视化编程:liveReload安装,sublime 3
- oraclenbsp;一个稍微大点数据库
- php resque 计划任务,PHP-RESQUE - 实现重试
- Depth-first Search深度优先搜索专题1
- javascript的事件绑定与事件委托
- Android 性能测试初探(一)
- Core Animation基础
- Mysql和Oracle语句区别
- 华为集齐 AI 龙珠,“召唤神龙”为期不远
- php二维数组按照键值排序的方法
- 关于知云文献翻译显示乱码,无法翻译的解决方法
- android 百度获取经纬度,百度地图API获取经纬度的方法
- 2022年武汉市小微企业服务补贴券签约服务机构申报条件、材料及时间
- An unexpected error prevented the server from fulfill your request.(HTTP500)
- 20145212 罗天晨 网络欺诈技术防范
- 【分享视频资源】React JS教程