各位高手麻烦请大家帮忙看看,小第初学ORACLE,遇到这样的问题。
小弟的ORACLE安装在UNIX下,其中有个存储过程,每天运行,负责取出当天最大的前20个号码,然后插入到数据库的表中,这个表是每个月月初自动建立的。
可现在在每个月月初,表建立之后,却不会向里面插入数据,报这2个错。
DBD::Oracle::st execute failed: ORA-04021: timeout occurred while waiting to lock object IIN.TOP_PROC (DBD ERROR: OCIStmtExecute)和
DBD::Oracle::st execute failed: ORA-01410: invalid ROWID
ORA-06512: at "IIN.TOP_PROC", line 118DBD::Oracle::st execute failed: ORA-01410: invalid ROWID
ORA-06512: at "IIN.TOP_PROC", line 59我实在不知道怎么理解,我查了看这个月新建的invalid rowid是空的,什么也没有啊。我附上我的存储过程TOP_PROC 麻烦各位帮忙看看,实在感谢了/
CREATE OR REPLACE PROCEDURE Top_proc AS
  V_CallNo     Varchar2(20);
  V_StatTime Varchar2(20);
  N_CallIn Number(1) := 1;
  N_CallOut Number(1) := 0;
  N_TotalCall Number(1) := 0;
  N_AnswerCall Number(1) := 1;
  N_AnswerTime Number(1) := 2;
  N_StatValue Number(30, 2);
  V_Time Varchar2(20);
  N_RecordNum Number := 1;
  N_MaxNum Number := 100;
  
  CURSOR C_TotalCalling IS 
    select TIMESTAMP, CallingNo, count(CallingNo) StatValue, TIME from Table_CDR
    where not(CallingNo is null)
    group by TIMESTAMP, CallingNo,TIME
    order by count(CallingNo) desc;
    
  CURSOR C_AnswerCalling IS
    select TIMESTAMP,CallingNo, count(CallingNo) StatValue,TIME from Table_CDR
    where not(CallingNo is null) and ConversationTime > 0
    group by TIMESTAMP,CallingNo,TIME
    order by count(CallingNo) desc;
    
  CURSOR C_AnswerTimeCalling IS
    select TIMESTAMP,CallingNo, sum(ConversationTime) StatValue,TIME  from Table_CDR
    where not(CallingNo is null)
    group by TIMESTAMP,CallingNo,TIME
    order by sum(ConversationTime) desc;   CURSOR C_TotalCalled IS 
    select TIMESTAMP,CalledNo, count(CalledNo) StatValue,TIME from Table_CDR 
    where not(CalledNo is null)
    group by TIMESTAMP,CalledNo,TIME
    order by count(CalledNo) desc;          
    
  CURSOR C_AnswerCalled IS
    select TIMESTAMP,CalledNo, count(CalledNo) StatValue,TIME  from Table_CDR
    where not(CalledNo is null) and ConversationTime > 0
    group by TIMESTAMP,CalledNo,TIME
    order by count(CalledNo) desc;  CURSOR C_AnswerTimeCalled IS
    select TIMESTAMP,CalledNo, sum(ConversationTime) StatValue,TIME from Table_CDR
    where not(CalledNo is null)
    group by TIMESTAMP,CalledNo,TIME
    order by sum(ConversationTime) desc;            
BEGIN
  N_RecordNum := 1;
  
  OPEN C_TotalCalling;
  LOOP
      IF N_RecordNum > N_MaxNum THEN
         EXIT;
      END IF;
      FETCH C_TotalCalling INTO V_StatTime, V_CallNo, N_StatValue, V_TIME;
      INSERT INTO TOP_200211(STATTIME,CALLNO,IO,STATTYPE,STATVALUE,TIME)
              VALUES(to_date(V_StatTime,'YYYY-MM-DD HH24:MI:SS'),
                     V_CallNo,N_CallOut,N_TotalCall,N_StatValue,
                     to_date(V_TIME,'YYYY-MM-DD HH24:MI:SS'));
       N_RecordNum := N_RecordNum + 1;
       EXIT WHEN C_TotalCalling%NOTFOUND ;
  END LOOP;
  Commit; 
  CLOSE C_TotalCalling;
  N_RecordNum := 1;  OPEN C_AnswerCalling;  
  LOOP
      IF N_RecordNum > N_MaxNum THEN
         EXIT;
      END IF;
      FETCH C_AnswerCalling INTO V_StatTime, V_CallNo, N_StatValue, V_TIME;
      INSERT INTO TOP_200211(STATTIME,CALLNO,IO,STATTYPE,STATVALUE,TIME)
              VALUES(to_date(V_StatTime,'YYYY-MM-DD HH24:MI:SS'),
                     V_CallNo,N_CallOut,N_AnswerCall,N_StatValue,
                     to_date(V_TIME,'YYYY-MM-DD HH24:MI:SS'));
      N_RecordNum := N_RecordNum + 1;
      EXIT WHEN C_AnswerCalling%NOTFOUND ;
   END LOOP;
   Commit;
   CLOSE C_AnswerCalling;   N_RecordNum := 1;  OPEN C_AnswerTimeCalling;  
  LOOP
      IF N_RecordNum > N_MaxNum THEN
         EXIT;
      END IF;
      FETCH C_AnswerTimeCalling INTO V_StatTime, V_CallNo, N_StatValue, V_TIME;
      INSERT INTO TOP_200211( STATTIME,CALLNO,IO,STATTYPE,STATVALUE,TIME)
              VALUES(to_date(V_StatTime,'YYYY-MM-DD HH24:MI:SS'),
                     V_CallNo,N_CallOut,N_AnswerTime,N_StatValue,
                     to_date(V_TIME,'YYYY-MM-DD HH24:MI:SS'));
      N_RecordNum := N_RecordNum + 1;
      EXIT WHEN C_AnswerTimeCalling%NOTFOUND ;
   END LOOP;
   Commit;
   CLOSE C_AnswerTimeCalling;    
  N_RecordNum := 1;
  
  OPEN C_TotalCalled;
  LOOP
      IF N_RecordNum > N_MaxNum THEN
         EXIT;
      END IF;
      FETCH C_TotalCalled INTO V_StatTime, V_CallNo, N_StatValue, V_TIME;
      INSERT INTO TOP_200211(STATTIME,CALLNO,IO,STATTYPE,STATVALUE,TIME)
              VALUES(to_date(V_StatTime,'YYYY-MM-DD HH24:MI:SS'),
                     V_CallNo,N_CallIn,N_TotalCall,N_StatValue,
                     to_date(V_TIME,'YYYY-MM-DD HH24:MI:SS'));
       N_RecordNum := N_RecordNum + 1;
       EXIT WHEN C_TotalCalled%NOTFOUND ;
  END LOOP;
  Commit; 
  CLOSE C_TotalCalled;  N_RecordNum := 1;  OPEN C_AnswerCalled;  
  LOOP
      IF N_RecordNum > N_MaxNum THEN
         EXIT;
      END IF;
      FETCH C_AnswerCalled INTO V_StatTime, V_CallNo, N_StatValue, V_TIME;
      INSERT INTO TOP_200211(STATTIME,CALLNO,IO,STATTYPE,STATVALUE,TIME)
              VALUES(to_date(V_StatTime,'YYYY-MM-DD HH24:MI:SS'),
                     V_CallNo,N_CallIn,N_AnswerCall,N_StatValue,
                     to_date(V_TIME,'YYYY-MM-DD HH24:MI:SS'));
      N_RecordNum := N_RecordNum + 1;
      EXIT WHEN C_AnswerCalled%NOTFOUND ;
   END LOOP;
   Commit;
   CLOSE C_AnswerCalled;   N_RecordNum := 1;  OPEN C_AnswerTimeCalled;  
  LOOP
      IF N_RecordNum > N_MaxNum THEN
         EXIT;
      END IF;
      FETCH C_AnswerTimeCalled INTO V_StatTime, V_CallNo, N_StatValue, V_TIME;
      INSERT INTO TOP_200211( STATTIME,CALLNO,IO,STATTYPE,STATVALUE,TIME)
              VALUES(to_date(V_StatTime,'YYYY-MM-DD HH24:MI:SS'),
                     V_CallNo,N_CallIn,N_AnswerTime,N_StatValue,
                     to_date(V_TIME,'YYYY-MM-DD HH24:MI:SS'));
      N_RecordNum := N_RecordNum + 1;
      EXIT WHEN C_AnswerTimeCalled%NOTFOUND ;
   END LOOP;
   Commit;
   CLOSE C_AnswerTimeCalled;  
END Top_proc;

解决方案 »

  1.   

    某个应用正在锁定该表或者包表为:
    select b.SID,b.SERIAL#,c.SQL_TEXT
    from v$locked_object a, v$session b, v$sqlarea c
    where a.SESSION_ID = b.SID
    and b.SQL_ADDRESS = c.ADDRESS
    and c.sql_text like '%table_name%'
    包为:
    select B.SID,b.USERNAME,b.MACHINE FROM V$ACCESS A, V$SESSION B WHERE A.SID=B.SID and a.OBJECT = '%PACKAGE_name%' and a.TYPE = 'PACKAGE'
    找出这个session
    然后 kill
    alter system kill session 'sid,serial#'