这是一个故事~~
鄙人在玩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';
之后再进行操作,就没事了