前一次我們針對select into做了簡單的說明,本次針對他的異常處理進行解釋。
我們用文字的方式進行編輯,儲存到 test.sql檔案中。
可以通過sql*plusl來執行text.sql。(執行方法不在敘述)
▼▼▼ test.sql檔案的內容▼▼
set serveroutput on
set verify off
declare v_empno emp.empno%type :=&員工編號;
v_ename emp.ename%type;
v_deptno dept.deptno%type;
v_dname dept.dname%type;
begin
/根據指定的員工編號獲取員工名稱和部門編號/
select
ename,
deptno
into
v_ename,
v_deptno
from
empwhere
empno = v_empno;
/以該部門編號詢問部門表,取得部門名稱/
select
dname
into
v_dname
from
dept
where
deptno = v_deptno;
dbms_output.put_line(『諮詢公司職員的名字是』 || v ename || 『。所屬部門是』 || v dnpame || 『。』);
end;
/▲▲▲▲到此結束▲▲▲▲
執行test.sql檔案,因為**裡邊有「&職員編號」,將其置換為指定字串(以下示例中為「7934」)後傳送給伺服器。
結果顯示了從伺服器返回的員工的資訊。
▼▼▼▼ test.sql的執行結果▼▼
sql> @test
請在職員編號中輸入值:7934 ←輸入
諮詢公司的職員名是miller。所屬部門是accounting。←輸出
pl/sql成功完成。
▲▲▲▲到此結束▲▲▲▲
程式解釋如下:
該程式首先輸入員工編號,傳遞給程式。
將員工名和部門號取到,通過slect into放到變數裡邊.
根據部門號取得部門名,最後畫面顯示該員工的職員名和所屬部門名。
但是,這個程式有問題。
作為乙個完整的程式,如果指定乙個不存在的員工,select into就沒有記錄沒找出來。結果為0件。
程式就會發生錯誤。
譬如:▼▼▼▼從這裡開始▼▼▼▼
sql> @test
請在員工編號中輸入值:9999←不存在的員工編號
declare * 第1行發生錯誤。:
ora-01403:找不到資料。
ora-06612:行8
▲▲▲▲到此結束▲▲▲▲
如果該程式是發布給使用者的程式,從使用者的角度來看,不知道錯誤的原因。
在這種情況下,希望顯示「員工編號9999不存在」這樣易懂的錯誤資訊。
為此需要追加異常處理。
以下是設定了異常處理部的修正後的test.sql檔案。
▼▼▼修改後的test.sql▼▼▼▼▼▼▼▼▼
set serveroutput on
set verify off
declare
v_empno emp.empno%type :=&員工編號;
v_ename emp.ename%type;
v_deptno dept.deptno%type;
v_dname dept.dname%type;
begin
/根據指定的員工編號獲取員工名稱和部門編號/
select
ename,
deptno
into
v_ename,
v_deptno
from
empwhere
empno = v_empno;
/以該部門編號詢問部門表,取得部門名稱/
select
dname
into
v_dname
from
dept
where
deptno = v_deptno;
dbms_output.put_line(『諮詢公司職員的名字是』 || v ename || 『。 所屬部門是』 || v dnpame || 『。』);
/以下為追加的異常處理部/
exception
when no_data_found then
dbms_output.put_line(『員工編號』|| v empno ||』不存在』);
end;
/▲▲▲▲到此結束▲▲▲▲
執行結果如下:
▼▼▼▼從這裡開始▼▼▼▼▼
sql> @test
請在職員編號中輸入值:9999
員工編號9999不存在
pl/sql過程成功完成。
▲▲▲▲到此結束▲▲▲▲
這樣,即使指定了不存在的職員編號,也可以輸出通知資訊,表示員工編號不存在,而不是錯誤。
要說修改前後有什麼不同,那就是設定了異常處理(exception以下的記述)。
沒有異常處理部的情況下,執行部發生錯誤時,異常結束。
但是,如果有異常處理部的話,通過異常處理可以正常結束。
這次的錯誤是「找不到資料。」
但是,關於這個「oria-01403」錯誤,有「no data found」的名字。像這樣錯誤的名字叫做異常名。
並不是所有的錯誤都有異常名,但是我們再程式設計的時候,經常都要用到錯誤的異常名。
這時候需要我們自己定義異常名,這個被稱為事前定義異常。
異常處理部使用異常名稱記述異常處理程式。
下面是常用的異常處理寫法:
exception
when 異常名1 then ←異常處理程式1
處理1when 異常名2 then ←異常處理程式2
處理2
・・・・ others處理程式
其他處理
end;(←pl/sql塊的結束)
您可以看到多個異常處理程式。
書寫順序是任意的,發生錯誤時實際執行的異常處理程式只有乙個。
執行異常處理程式後,pl/sql塊正常結束。
另外,最後可以記述為「when others then」,這個部分叫做others處理程式。
others處理程式是在沒有相應異常處理程式的情況下處理的異常處理程式。
例如,對於沒有異常名的錯誤,可以通過others處理程式進行異常處理。
也可以給沒有異常名的錯誤加上異常名。
關於非事前定義異常,我們其他時間進行說明。
另外,題外話,為了使這次的專案更具特色,關於上述plsql塊是分別進行2個表的查詢。
我們可以通過外連線的方式,寫成乙個sql:
select
e.ename ,
d.dname
into
v_ename,
v_dname
from
emp e,
dept d
where
e.deptno = d.deptno
and e.empno = v_empno;
這樣效率就提高很多。
但是,這也是乙個簡單的例子。實際開發過程中會有非常複雜的select語句,也可以不用非要寫成乙個select語句。
不管怎麼說,pl/sql塊無論是無名的plsql塊還是有名的plsql程式,一般都要在資料庫上執行,
對網路的負荷幾乎沒有影響。
這章到此為止。下次針對游標進行解釋。
PLSQL入門與精通(第4章 變數之 TYPE)
上一章,介紹了變數的定義,這一次繼續深入介紹變數。變數定義域 變數名 變數型別 除此之外,我們介紹一下變數定義中經常使用的東西。以下是變數定義的新的一種方法 變數定義域 變數名 表名.列名 type 該方法是變數定義是 用指定表 或檢視 中指定列的型別來定義變數和型別 也就是說,不是直接指定資料型別...
PLSQL入門與精通(第33章 包的本質)
我們一直在列舉說明pl sql的包的用途。但是包的本質是什麼的?個人理解,pl sql包的本質就是 全區域性 換句話來講全域性使用的東西,需要在包來定義。一般來說,在無名塊 或者過程和函式的本地定義部中定義的內容只能在本pl sql塊中使用。從這個意義上來說,這是乙個本地 區域性 的定義部。所謂本地...
《C 從入門到精通》第7章 異常處理與程式除錯
一 型別 1.語法錯誤 2.執行時錯誤 3.邏輯錯誤 二 具體講解 1.語法錯誤 不符合c 語言的語句 2.執行時錯誤 在程式執行時出現的錯誤,也就是異常,例如 陣列下標越界,開啟的檔案不存在等 3.邏輯錯誤 程式沒有實現程式設計人員的設計意圖和功能,這類程式可以執行,但結果不符合預期,一般是演算法...