不正确退出会话后,怎么删除有问题会话(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';

之后再进行操作,就没事了

你可能感兴趣的:(不正确退出会话后,怎么删除有问题会话(ora-01013))