Plsql 如果表未退出,则无法获取异常

Plsql 如果表未退出,则无法获取异常,plsql,Plsql,我必须结束我在桌子上的一些会议。如果表不存在,我试图抛出一个异常,但我没有得到异常。有人能帮我吗?这是我的代码: DECLARE table_not_found EXCEPTION; PRAGMA EXCEPTION_INIT(table_not_found, -00942); BEGIN FOR c IN (SELECT sid, serial FROM xxxxxx ) LOOP EXECUTE IMMEDIATE 'alter system

我必须结束我在桌子上的一些会议。如果表不存在,我试图抛出一个异常,但我没有得到异常。有人能帮我吗?这是我的代码:

DECLARE
table_not_found EXCEPTION;
PRAGMA EXCEPTION_INIT(table_not_found, -00942);
BEGIN
    FOR c IN (SELECT sid, serial FROM xxxxxx )
        LOOP
             EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' 
                                                     || c.serial || ''' IMMEDIATE';                         
        END LOOP;
EXCEPTION
      WHEN table_not_found THEN
              dbms_output.put_line('Table not found');
      WHEN OTHERS THEN
         dbms_output.put_line('Other');
END;
/
如果表xxxxxx不存在,那么您的代码甚至不会编译,因此它不会运行,您也不会得到运行时异常

要使其成为运行时异常,您需要使用动态SQL从表中选择:

DECLARE
table_not_found EXCEPTION;
PRAGMA EXCEPTION_INIT(table_not_found, -00942);
cur SYS_REFCURSOR;
v_sid INTEGER;
v_serial INTEGER;
BEGIN
    OPEN cur FOR 'SELECT sid, serial FROM xxxxxx' ;
    LOOP
         FETCH cur INTO v_sid, v_serial;
         EXIT WHEN cur%NOTFOUND;
         EXECUTE IMMEDIATE 'alter system kill session ''' || v_sid || ',' || v_serial || ''' IMMEDIATE';
    END LOOP;
    CLOSE cur;
EXCEPTION
      WHEN table_not_found THEN
              dbms_output.put_line('Table not found');
      WHEN OTHERS THEN
         dbms_output.put_line('Other');
END;
如果表xxxxxx不存在,那么您的代码甚至不会编译,因此它不会运行,您也不会得到运行时异常

要使其成为运行时异常,您需要使用动态SQL从表中选择:

DECLARE
table_not_found EXCEPTION;
PRAGMA EXCEPTION_INIT(table_not_found, -00942);
cur SYS_REFCURSOR;
v_sid INTEGER;
v_serial INTEGER;
BEGIN
    OPEN cur FOR 'SELECT sid, serial FROM xxxxxx' ;
    LOOP
         FETCH cur INTO v_sid, v_serial;
         EXIT WHEN cur%NOTFOUND;
         EXECUTE IMMEDIATE 'alter system kill session ''' || v_sid || ',' || v_serial || ''' IMMEDIATE';
    END LOOP;
    CLOSE cur;
EXCEPTION
      WHEN table_not_found THEN
              dbms_output.put_line('Table not found');
      WHEN OTHERS THEN
         dbms_output.put_line('Other');
END;
如果表xxxxxx不存在,那么您的代码甚至不会编译,因此它不会运行,您也不会得到运行时异常

要使其成为运行时异常,您需要使用动态SQL从表中选择:

DECLARE
table_not_found EXCEPTION;
PRAGMA EXCEPTION_INIT(table_not_found, -00942);
cur SYS_REFCURSOR;
v_sid INTEGER;
v_serial INTEGER;
BEGIN
    OPEN cur FOR 'SELECT sid, serial FROM xxxxxx' ;
    LOOP
         FETCH cur INTO v_sid, v_serial;
         EXIT WHEN cur%NOTFOUND;
         EXECUTE IMMEDIATE 'alter system kill session ''' || v_sid || ',' || v_serial || ''' IMMEDIATE';
    END LOOP;
    CLOSE cur;
EXCEPTION
      WHEN table_not_found THEN
              dbms_output.put_line('Table not found');
      WHEN OTHERS THEN
         dbms_output.put_line('Other');
END;
如果表xxxxxx不存在,那么您的代码甚至不会编译,因此它不会运行,您也不会得到运行时异常

要使其成为运行时异常,您需要使用动态SQL从表中选择:

DECLARE
table_not_found EXCEPTION;
PRAGMA EXCEPTION_INIT(table_not_found, -00942);
cur SYS_REFCURSOR;
v_sid INTEGER;
v_serial INTEGER;
BEGIN
    OPEN cur FOR 'SELECT sid, serial FROM xxxxxx' ;
    LOOP
         FETCH cur INTO v_sid, v_serial;
         EXIT WHEN cur%NOTFOUND;
         EXECUTE IMMEDIATE 'alter system kill session ''' || v_sid || ',' || v_serial || ''' IMMEDIATE';
    END LOOP;
    CLOSE cur;
EXCEPTION
      WHEN table_not_found THEN
              dbms_output.put_line('Table not found');
      WHEN OTHERS THEN
         dbms_output.put_line('Other');
END;

这没有道理。您正试图终止一个会话-为什么希望这会引发ORA-00942:表或视图不存在?没有涉及任何表格。您可能会得到一个例外:ORA-00030:用户会话ID不存在。我在for语句中得到了表的sid和序列号。可能是这些表不存在。这是因为我需要控制这些异常sid和串行标识一个会话,而不是一个表。每次用户连接到Oracle时,都可以在v$session view中看到他们的会话。是。我知道。我说我以前做过一次选择来提取我搜索的v$会话的sid和序列号,我把这些数据放在一个表中,所以我必须在一个带有forOK的表中查找,所以你的意思是这个表可能不存在:select sid,serial FROM xxxxxx?在这种情况下,代码甚至不会编译,因此它不会运行,您也不会得到运行时异常。我现在就回答……这没有道理。您正试图终止一个会话-为什么希望这会引发ORA-00942:表或视图不存在?没有涉及任何表格。您可能会得到一个例外:ORA-00030:用户会话ID不存在。我在for语句中得到了表的sid和序列号。可能是这些表不存在。这是因为我需要控制这些异常sid和串行标识一个会话,而不是一个表。每次用户连接到Oracle时,都可以在v$session view中看到他们的会话。是。我知道。我说我以前做过一次选择来提取我搜索的v$会话的sid和序列号,我把这些数据放在一个表中,所以我必须在一个带有forOK的表中查找,所以你的意思是这个表可能不存在:select sid,serial FROM xxxxxx?在这种情况下,代码甚至不会编译,因此它不会运行,您也不会得到运行时异常。我现在就回答……这没有道理。您正试图终止一个会话-为什么希望这会引发ORA-00942:表或视图不存在?没有涉及任何表格。您可能会得到一个例外:ORA-00030:用户会话ID不存在。我在for语句中得到了表的sid和序列号。可能是这些表不存在。这是因为我需要控制这些异常sid和串行标识一个会话,而不是一个表。每次用户连接到Oracle时,都可以在v$session view中看到他们的会话。是。我知道。我说我以前做过一次选择来提取我搜索的v$会话的sid和序列号,我把这些数据放在一个表中,所以我必须在一个带有forOK的表中查找,所以你的意思是这个表可能不存在:select sid,serial FROM xxxxxx?在这种情况下,代码甚至不会编译,因此它不会运行,您也不会得到运行时异常。我现在就回答……这没有道理。您正试图终止一个会话-为什么希望这会引发ORA-00942:表或视图不存在?没有涉及任何表格。您可能会得到一个例外:ORA-00030:用户会话ID不存在。我在for语句中得到了表的sid和序列号。可能是这些表不存在。这是因为我需要控制这些异常sid和串行标识一个会话,而不是一个表。每次用户连接到Oracle时,都可以在v$session view中看到他们的会话。是。我知道。我说我以前做过一次选择来提取我搜索的v$会话的sid和序列号,我把这些数据放在一个表中,所以我必须在一个带有forOK的表中查找,所以你的意思是这个表可能不存在:select sid,serial FROM xxxxxx?在这种情况下,代码甚至不会编译,因此它不会运行,您也不会得到运行时异常。我现在就回答。。。