PLSQL入門到精通(第6章 異常)

2021-10-19 18:23:52 字數 3817 閱讀 5282

前一次我們針對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.邏輯錯誤 程式沒有實現程式設計人員的設計意圖和功能,這類程式可以執行,但結果不符合預期,一般是演算法...