不正確退出會話後,怎麼刪除有問題會話(ora-01013)

這是一個故事~~

鄙人在玩pl/sql時候遇到了點小問題,我的操作在sqlplus上進行,如下

SQL> set serveroutput on;
DECLARE
  v_deptno emp.deptno%TYPE;
  v_increment NUMBER(4);
  v_empno emp.empno%type;
BEGIN
  v_empno:=&x;
  SELECT deptno INTO v_deptno 
  FROM emp 
  WHERE empno=v_empno;
  IF v_deptno=10 THEN v_increment:=100;
  ELSIF v_deptno=20 THEN v_increment:=150;
  ELSIF v_deptno=30 THEN v_increment:=200;
  ELSE v_increment:=300;
  END IF;
  UPDATE emp SET sal=sal+v_increment WHERE empno=v_empno;
END;
 17  /
Enter value for x: 10
old   6:   v_empno:=&x;
new   6:   v_empno:=10;
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 7

一開始看不懂爲什麼會錯,以爲是自己寫的有錯誤,後來發現,原來是根本沒有員工號爲10的員工,判斷條件那個是部門號(汗。。。)

接着我複製粘貼了一下代碼,發現原來不用的,我想撤銷,然後忘記按了crtl+z還是crtl+c了,結果如下

DECLARE
  v_deptno emp.deptno%TYPE;
  v_increment NUMBER(4);
  v_empno emp.empno%type;
BEGIN
  v_empno:=&x;
  SELECT deptno INTO v_deptno 
  FROM emp 
  WHERE empno=v_empno;
  IF v_deptno=10 THEN v_increment:=100;
  ELSIF v_deptno=20 THEN v_increment:=150;
  ELSIF v_deptno=30 THEN v_increment:=200;
  ELSE v_increment:=300;
  END IF;
  UPDATE emp SET sal=sal+v_increment WHERE empno=v_empno;
END;
 17  
[1]+  Stopped                 rlwrap sqlplus / as sysdba

之後一直卡着

DECLARE
  v_deptno emp.deptno%TYPE;
  v_increment NUMBER(4);
  v_empno emp.empno%type;
BEGIN
  v_empno:=&x;
  SELECT deptno INTO v_deptno 
  FROM emp 
  WHERE empno=v_empno;
  IF v_deptno=10 THEN v_increment:=100;
  ELSIF v_deptno=20 THEN v_increment:=150;
  ELSIF v_deptno=30 THEN v_increment:=200;
  ELSE v_increment:=300;
  END IF;
  UPDATE emp SET sal=sal+v_increment WHERE empno=v_empno;
END;
 17  /
Enter value for x: 7900
old   6:   v_empno:=&x;
new   6:   v_empno:=7900;
DECLARE
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
ORA-06512: at line 15

卡在上面的代碼界面。然後crtl+c強制撤銷,出現ora-01013那些錯誤。之後再登錄進去,想再次測試pl/sql塊就不行了,一樣報ora-01013的錯誤

思考與解決方案

這個問題,我覺得是因爲先前的scott會話卡在DBMS裏了,沒有正常撤銷,所以只要我kill掉那個會話(其實質我還是不太清楚),應該就可以了。
之後用system用戶登錄,然後查看一下v$session,

SQL> connect system/123456
Connected.
SQL> select sid,serial#,username,type from v$session;

       SID    SERIAL# USERNAME               TYPE
---------- ---------- ------------------------------ ----------
     1      1                    BACKGROUND
     2      1                    BACKGROUND
     3      1                    BACKGROUND
     4      1                    BACKGROUND
     5      1                    BACKGROUND
     6      1                    BACKGROUND
     7      1                    BACKGROUND
     8      1                    BACKGROUND
     9      5                    BACKGROUND
    12      5                    BACKGROUND
    13      3                    BACKGROUND

       SID    SERIAL# USERNAME               TYPE
---------- ---------- ------------------------------ ----------
    17    105                    BACKGROUND
       125      7 SCOTT              USER
       126      1                    BACKGROUND
       127      1                    BACKGROUND
       128      1                    BACKGROUND
       129      1                    BACKGROUND
       130      1                    BACKGROUND
       131      1                    BACKGROUND
       132      1                    BACKGROUND
       136     47 SYSTEM                 USER
       138      7                    BACKGROUND

       SID    SERIAL# USERNAME               TYPE
---------- ---------- ------------------------------ ----------
       139     31                    BACKGROUND

23 rows selected.

顯然,那個scott就是我們要刪除的會話,刪除之


SQL> alter system kill session '125,7';

之後再進行操作,就沒事了

發佈了16 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章