CREATE OR REPLACE PROCEDURE SP_KILL_SESSION
AS
    V_DATE                   VARCHAR2(11);
    V_SID                    NUMBER;
    V_SERIAL#                NUMBER;  
    v_mm                     varchar2(40); 
        
        
    CURSOR CUR_KILL_SESSION IS
    SELECT SID,SERIAL# FROM V$SESSION
    WHERE TO_CHAR(LOGON_TIME,'YYYY/MM/DD') LIKE V_DATE;
BEGIN
    SELECT TO_CHAR(SYSDATE - 1,'YYYY/MM/DD') into V_DATE FROM DUAL;
    
    OPEN CUR_KILL_SESSION;
    LOOP
    FETCH CUR_KILL_SESSION INTO V_SID,V_SERIAL#;
    EXIT WHEN CUR_KILL_SESSION%NOTFOUND;   
    v_mm:=to_char(v_sid)||','||to_char(v_serial#);
    
    if v_mm is not null or v_mm<>'' then
    ALTER SYSTEM KILL SESSION 'v_mm';
    end if;
    END LOOP;
    CLOSE CUR_KILL_SESSION;END;

解决方案 »

  1.   

    select * from user_errors;
    看一下是哪一行吧。
      

  2.   

    是下面这一行
    ALTER SYSTEM KILL SESSION 'v_mm';
      

  3.   

    過程体中好像不能有Alter,Create這樣的命令
      

  4.   

    hyljqr(秋林),thanks!   那用过程怎么处理,怎么写呢?
      

  5.   

    execute immediate string
      

  6.   

    luckysxn(风子) ,我不明白,能再说清楚一点吗
      

  7.   

    string 是动态的SQL,可以将‘alter’之类的SQL写进去!
    ----------------------------
    declare
    string varchar2(1000);
    begin
    string:='alter................';
    execute immediate string;
    end;
      

  8.   

    string是保留字,不可以拿来作变量
      

  9.   

    这样试试:CREATE OR REPLACE PROCEDURE SP_KILL_SESSION
    AS
        v_date                   VARCHAR2(11);
        v_sid                    NUMBER;
        v_serial#                NUMBER;  
        v_mm                     VARCHAR2(40); 
        sql_stmt      VARCHAR2(200);
        CURSOR cur_kill_session(v_date1 VARCHAR2) IS
        SELECT sid,serial# 
          FROM v$session
         WHERE TO_CHAR(logon_time,'YYYY/MM/DD')=v_date1;
    BEGIN
        SELECT TO_CHAR(SYSDATE-1,'YYYY/MM/DD') into v_date FROM DUAL;
        OPEN CUR_KILL_SESSION(v_date);
        LOOP
        FETCH CUR_KILL_SESSION INTO V_SID,V_SERIAL#;
        EXIT WHEN CUR_KILL_SESSION%NOTFOUND;
        sql_stmt := 'ALTER SYSTEM KILL SESSION '||CHR(39)||v_sid||','||v_serial#||CHR(39);
        EXECUTE IMMEDIATE sql_stmt;
        END LOOP;
        CLOSE CUR_KILL_SESSION;
    END;
    /
      

  10.   

    存储过程中不支持alter,你可以将存储过程写在包中,用execute immediate 来实现。
      

  11.   

    不能这样子杀进程的,至少你要先判断一下进程时候active,如果进程在active状态,是不能直接杀死的,而且当前进程也不可能直接杀掉