這是一個故事~~
鄙人在玩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';
之後再進行操作,就沒事了