这是程序:
CREATE OR REPLACE PROCEDURE P_MONITOR
--(AN_MINUTES NUMBER DEFAULT 60)
/*******************************************
存储过程用途:识别出系统中超过一定空闲连接时间(
  AS_MINUTES)的用户,并将其kill掉参数:
  AN_MINUTES 空闲时间数,单位为分钟,默认为60分钟
********************************************/
AS
 v_str VARCHAR2(200);
  v_username v$session.username%TYPE;  
  v_status v$session.status%TYPE;
  v_machine v$session.machine%TYPE;
  v_operators varchar2(200);
   
CURSOR C_users IS 
SELECT s.username,
 s.status, s.machine, 'alter system kill session '
 ||''''||s.sid||','||s.serial# ||'''' operates
 FROM v$session s, v$process p
 WHERE TYPE = 'USER'
 AND p.addr = s.paddr
 AND status != 'KILLED'
 AND SUBSTR (machine, 1, 7) NOT IN ('RUNHEIT')
 AND last_call_et > 3600
 ORDER BY last_call_et desc;BEGINLOOP  
               FETCH C_users INTO v_username,v_status,v_machine,v_operators;
               EXIT WHEN C_users%NOTFOUND;  
               v_str := v_operators;
               EXECUTE IMMEDIATE v_str;
END LOOP;  
END P_MONITOR;----------------------
我找不出错误,请朋友指点下!

解决方案 »

  1.   

     s.status, s.machine, 'alter system kill session ' 
     ||''''||s.sid||','||s.serial# ||'''' operates ----->
    试下:
     s.status, s.machine, 'alter system kill session ' 
     ||''''||to_char(s.sid)||','||s.serial# ||'''' operates 
      

  2.   

    在loop之前应该加上  FETCH C_users INTO v_username,v_status,v_machine,v_operators
    这样才能保证游标是有数据的
      

  3.   


    你说错了吧,fetch..... 应该放在循环里面才对啊,因为每行的fecth...都是变化的
      

  4.   


    打开游标后,一定要先取出数据,这时用fetch
    再循环的时候,也需要用fetch
    再进入循环之前不用fetch,游标不能定位
      

  5.   

    游标用法都错了:
    CREATE OR REPLACE PROCEDURE P_MONITOR
    --(AN_MINUTES NUMBER DEFAULT 60)
    /*******************************************
    存储过程用途:识别出系统中超过一定空闲连接时间(
      AS_MINUTES)的用户,并将其kill掉参数:
      AN_MINUTES 空闲时间数,单位为分钟,默认为60分钟
    ********************************************/
    AS
     v_str VARCHAR2(200);
      v_username v$session.username%TYPE; 
      v_status v$session.status%TYPE;
      v_machine v$session.machine%TYPE;
      v_operators varchar2(200);
     
    CURSOR C_users IS
    SELECT s.username,
     s.status, s.machine, 'alter system kill session '
     ||''''||s.sid||','||s.serial# ||'''' operates
     FROM v$session s, v$process p
     WHERE TYPE = 'USER'
     AND p.addr = s.paddr
     AND status != 'KILLED'
     AND SUBSTR (machine, 1, 7) NOT IN ('RUNHEIT')
     AND last_call_et > 3600
     ORDER BY last_call_et desc;BEGIN
    OPEN C_users;
    LOOP 
                  FETCH C_users INTO v_username,v_status,v_machine,v_operators;
                  EXIT WHEN C_users%NOTFOUND; 
                  v_str := v_operators;
                  EXECUTE IMMEDIATE v_str;
    END LOOP; 
    CLOSE C_users;END P_MONITOR; 
      

  6.   

    CREATE OR REPLACE PROCEDURE P_MONITOR
    --(AN_MINUTES NUMBER DEFAULT 60)
    /*******************************************
    存储过程用途:识别出系统中超过一定空闲连接时间(
      AS_MINUTES)的用户,并将其kill掉参数:
      AN_MINUTES 空闲时间数,单位为分钟,默认为60分钟
    ********************************************/
    AS
     v_str VARCHAR2(200);
      v_username v$session.username%TYPE; 
      v_status v$session.status%TYPE;
      v_machine v$session.machine%TYPE;
      v_operators varchar2(200);
     
    CURSOR C_users IS
    SELECT s.username,
     s.status, s.machine, 'alter system kill session '
     ||''''||s.sid||','||s.serial# ||'''' operates
     FROM v$session s, v$process p
     WHERE TYPE = 'USER'
     AND p.addr = s.paddr
     AND status != 'KILLED'
     AND SUBSTR (machine, 1, 7) NOT IN ('RUNHEIT')
     AND last_call_et > 3600
     ORDER BY last_call_et desc;BEGIN
    OPEN C_users;
    LOOP 
                  FETCH C_users INTO v_username,v_status,v_machine,v_operators;
                  EXIT WHEN C_users%NOTFOUND; 
                  v_str := v_operators;
                  EXECUTE IMMEDIATE v_str;
    END LOOP; 
    CLOSE C_users;END P_MONITOR; 
      

  7.   

    CREATE OR REPLACE PROCEDURE P_MONITOR 
    --(AN_MINUTES NUMBER DEFAULT 60) 
    /******************************************* 
    存储过程用途:识别出系统中超过一定空闲连接时间( 
      AS_MINUTES)的用户,并将其kill掉参数: 
      AN_MINUTES 空闲时间数,单位为分钟,默认为60分钟 
    ********************************************/ 
    AS 
     v_str VARCHAR2(200); 
      v_username v$session.username%TYPE; 
      v_status v$session.status%TYPE; 
      v_machine v$session.machine%TYPE; 
      v_operators varchar2(200); CURSOR C_users IS 
    SELECT s.username, 
     s.status, s.machine, 'alter system kill session ' 
     ||''''||s.sid||','||s.serial# ||'''' operates 
     FROM v$session s, v$process p 
     WHERE TYPE = 'USER' 
     AND p.addr = s.paddr 
     AND status != 'KILLED' 
     AND SUBSTR (machine, 1, 7) NOT IN ('RUNHEIT') 
     AND last_call_et > 3600 
     ORDER BY last_call_et desc; BEGIN 
    OPEN C_users; 
    FETCH C_users INTO v_username,v_status,v_machine,v_operators;
    LOOP 
                  FETCH C_users INTO v_username,v_status,v_machine,v_operators; 
                  EXIT WHEN C_users%NOTFOUND; 
                  v_str := v_operators; 
                  EXECUTE IMMEDIATE v_str; 
    END LOOP; 
    CLOSE C_users; END P_MONITOR; 这样应该就对了
      

  8.   

    select s.username
         , s.status
         , s.machine 
         , 'alter system kill session ' ||''''||s.sid||','||s.serial# ||'''' operates
    from   v$session s
         , v$process p 
    where  p.addr = s.paddr 
    and    s.TYPE = 'USER'
    and    status != 'killed' 
    and    substr (machine, 1, 7) not in ('runheit') 
    and    last_call_et > 3600 
    order by last_call_et desc;你的query有问题,在我机器上跑没通过,好像有特殊字符,用上面这个替换掉你的sql再编译一次。有错误的话show err以下贴出来