发现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错误相关推荐

  1. linux下ora-12505,甲骨文临时ORA 12505错误后的Linux启动

    我遇到与Oracle一个很奇怪的现象,也许有人可以帮助我,让我总结一下真正的快:甲骨文临时ORA 12505错误后的Linux启动 我的首选操作系统是Debian的Linux操作系统,我使用的是Ora ...

  2. 奇怪的curl 403错误

    最近在一家公司实习,按照他们技术总裁的要求写一个URL连接检查器,从数据库里面select出url后判断他的访问状态生成报告,php或者python任选,我自然选择了自己最熟悉的php了 但是程序跑了 ...

  3. java ora 00911_ORA-00911错误

    ORA-00911,"911"看着很霸气的错误号,虽然我还是Oracle的初学者,但每次碰到一个未见过的ORA错误号后,都有一种查案的赶脚,根据错误号.OERR.相关错误信息,判断 ...

  4. 关于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 一直用的好好的,突然 ...

  5. oracle提示01034,oracle数据库ORA 01034错误问题解决方案

    ORA-01034错误的话: Oracle常见错误之一 这是个Oracle数据库服务器比较常见的错误.有经验的用户几乎马上就能解决这个错误,再不济也能马上到Metalink去搜索一下. 不幸的是,大多 ...

  6. c++奇怪的1179链接错误

    元<常符*c>构 字典{}; 上面这样,输入文件名,在同时用两个字典的子类时,会出现问题,报错1179链接错误,说字典已有comdat. 改为: 元<常符*c,类 T=空>构 ...

  7. PLSQL连接Oracle数据库时报ORA 12154错误的解决方法

    pl/sql连接Oracle时遇到的问题: 解决办法:安装后将Oracle安装目录下的文件夹network(包括其中的子文件,其中主要是tnsnames.ora) 在pl/sql菜单–"工具 ...

  8. 一个奇怪的EL表达式错误

    下图是在Struts2的action中写的一个方法 JSP页面代码如下: 在页面访问如下路径:http://localhost:8088/maven_ssh/cust_getCustList 目前推测 ...

  9. mysql查询错误_一个奇怪的MySQL查询错误

    t_user表的phone_number字段是varchar(255)类型的,表示手机号, 在查询某个手机号时,sql语句如下: SELECT phone_number  FROM t_user WH ...

最新文章

  1. 创业笔记-Node.js入门之阻塞与非阻塞
  2. 算法效果AB测试中的PV-UV不对称性
  3. sql php修改mysql结构_sql怎么修改表内容
  4. C语言 指针在函数传参中的使用
  5. 前端可视化编程:liveReload安装,sublime 3
  6. oraclenbsp;一个稍微大点数据库
  7. php resque 计划任务,PHP-RESQUE - 实现重试
  8. Depth-first Search深度优先搜索专题1
  9. javascript的事件绑定与事件委托
  10. Android 性能测试初探(一)
  11. Core Animation基础
  12. Mysql和Oracle语句区别
  13. 华为集齐 AI 龙珠,“召唤神龙”为期不远
  14. php二维数组按照键值排序的方法
  15. 关于知云文献翻译显示乱码,无法翻译的解决方法
  16. android 百度获取经纬度,百度地图API获取经纬度的方法
  17. 2022年武汉市小微企业服务补贴券签约服务机构申报条件、材料及时间
  18. An unexpected error prevented the server from fulfill your request.(HTTP500)
  19. 20145212 罗天晨 网络欺诈技术防范
  20. 【分享视频资源】React JS教程

热门文章

  1. 机器学习基本知识(内容来自斯坦福公开课)course 1
  2. Android 单利模式(分类解析)
  3. IPETRONIK活塞式发动机试验方案
  4. 数据结构+算法=程序
  5. C++ QT QSerialPort基操
  6. 大学专业选择电气自动化好不好?
  7. 通信系统简述——高频信号第一集
  8. UI设计初学者快速入门的5大建议!
  9. 电脑怎么抠图?分享我一直在用的办法
  10. app产品设计碉堡了