oracle學習(十一)——PLSQL開發

PLSQL是數據庫開發過程中的常用技能,本文主要介紹了PLSQL開發過程中的一些常用知識點,包括:塊、過程、函數、觸發器、變量、包、遊標、基本語法、視圖以及分頁技術,在知識的廣度上做了一些總結,另有一些常用的案例。

1、PLSQL基礎:

可以用plsql進行過程、函數、觸發器的編寫等;

提高應用程序的運行性能:

傳統的操作數據庫的方法是:

Java將sql傳給數據庫,數據庫編譯這些語句纔會進行查詢,這個過程需要花一些時間,結果返回也需要一定的時間;

而用PLSQL開發時,寫一個過程,這個過程之前已經編譯好了,速度就會提上去;

減少網絡傳輸量:

主要減少網絡的交互量,一次傳輸。

PLSQL的特性:

1)過程、函數、觸發器是由PLSQL編寫的;

2)過程、函數、觸發器是存放在oracle中的;

3)PLSQL是強大的數據庫過程語言;

4)通過plsql寫的函數、過程可以在java中調用;

他的不足之處在於:

移植性不好,oracle移植到DB2時,過程需要重新寫;

舉一個簡單的案例:

此爲最簡單的一個過程;

如果過程有重名,則替換,語句爲:

那麼,如何調用該過程:

1)exec 過程名(參數1, 參數2);

2)call 過程名(參數1, 參數2);

此時在mytest表中就有了上面的內容。

如果用PLSQL開發,則爲:

命令窗口下的editer選項卡爲:

然後複製在對話框中執行:

基於上面的介紹,可以瞭解到一些plsql的介紹,對plsql進行一個深度瞭解:

Plsql編程的基礎單位是:塊;

編寫規範:

2、塊的結構:

塊的示意圖:

塊與java程序結構的比較:

實例:

1)只包括執行部分的plsql塊:

上面的put_line(「hello」)類似於java中的system.out.print();

2)包含定義部分和執行部分的plsql塊:

Select ename into v_ename from emp whereempno=$no;

即將查出的值放入到v_ename中。

將上面的語句複製到對話框:

SQL>Setserveroutput on;

此時就會有輸入框跳出來,輸入參數後,就會執行上面的過程。

如果要輸出多個結果,則可以按照順序寫下面的語句:

3)包含定義部分、執行部分和例外處理部分:

如果異常沒有處理,則查找的條件沒有結果,則會報錯:

此時會報錯,我們需要處理爲:

3、過程:

上面塊的變量放在declare與begin之間,如果構建processdure,則可以將變量定義在is與begin之間。

例如(小雪人上面的例子):

複製到對話框中,過程就會被創建;

對應的調用方式也已經給出。

在java中如何調用過程:

主要是使用{}來包裹過程的調用語句;

4、函數:

輸入僱員的姓名,返回該僱員的年薪:

函數寫完成後,執行,此時會在數據庫中生成一個function,然後調用這個函數即可。

5、包:

實例:

執行這個包,就會提示包已建成。

下一步開始創建包體:

第一行中也可用:create or replace package………

那麼,如何調用包的過程和函數:

調用時可以用call,也可以用exec調用函數。

6、觸發器:

觸發器的定義就是說某個條件成立的時候,觸發器裏面所定義的語句就會被自動的執行,不需要人爲的去調用,也不能調用;觸發器的觸發條件其實在你定義的時候就已經設定好了。

觸發器可以分爲:

語句級觸發器:可以在某些語句執行前或執行後被觸發

行級觸發器:在定義了觸發器的表中的行數據改變時就會被觸發一次

觸發器結構:

1)下面的觸發器在更新表tb_emp之前觸發,目的是不允許在週末修改表:

2)寫一個複雜的觸發器:

7、定義並使用變量:

標量(scalar):即類似於java中的變量。

舉例說明:

例如:


上面定義的變量都是以固定的樣式定義的,這樣存在一定的問題,比如,姓名e_name長度爲5,當長度超過這個值時,就會產生報錯,爲解決這個問題,可以將定義方式修改爲:

v_ename emp.ename%type;

意思爲:定義的類型長度與表emp中ename的字段長度一致;

複合變量:

現在主要用前兩種:

1)pl/sql記錄:類似於java中的類。

其中:

爲一個type記錄類型,名稱爲emp_record_type;

然後在下方定義一個emp_record_type的變量:

下面select中可以一次將三個數據一次放到sp_record字段中。

2)PL/SQL表:

實例:

如果去掉上面的where empno=7788字段,會報錯,因爲返回的值與sp_table(0)的結果不一致。

此時用到參照變量:

先介紹遊標變量:

1)使用plsql編寫的塊,可以輸入部門號,並顯示該部門所有員工的姓名和他們的工資:

遊標的功能即爲,當查詢出的數據爲多條時,此時查詢的結果需要一條條顯示,就需要遊標逐一遍歷,一般會結合循環使用。

8、PLSQL的條件語句:

例如:

執行之後會在數據庫中建一個procedure;

調用這個procedure即可:

另外再舉一個複雜點的條件語句:

PLSQL的循環結構:

1)loop結構:

例如:

2)while結構:

例如:

3)for循環結構:

順序控制語句:

1)goto語句:

如果語句有多層循環,此時會用到goto語句,goto語句一般不會用到。

例如:

Goto到end_loop中;

<<end_loop>>爲目的地;

2)null語句:

9、總體案例:

1)請寫一個過程,可以向book表中添加書,要求可以通過java程序調用該過程:

第一步:建一張book表:

第二步:編寫一個過程:

第三步:在java中調用:

2)有輸入和輸出的存儲過程:

傳入spno,運行的結果會返回給spName變量。

在java中的調用爲:

如果返回是多個值,則修改一下爲:

此時java的調用爲:

 

如果返回的值是多條記錄,即返回一個結果集:

第一步:建包:創建一個包,在該包中,定義一個類型test_cursor,是個遊標。

第二步:建立存儲過程:

第三步:如何在java中調用:

對結果集的接受是用的:getobject(2),即對象接收。

2)分頁技術:

先回顧一下分頁語句:

然後我們來看一下分頁的過程該怎麼寫:

Pagesize:一頁顯示記錄數。

接下來查看java中如何使用這個語句:

如果要按照薪水從低到高排序,然後取出6-10個人,只需要修改一個地方:

做上面的修改即可。

10、例外處理:

1)例外處理:

例如:

此時,執行會顯示「編號沒有!」

2)預定義例外:

Case_not_found:

例如:

如果薪水是3000,就會拋出case_not_found例外。

Cursor_already_open:

當遊標被打開兩次的時候,就會報錯。

Dup_val_on_index:

Invalid_cursor:

Invalid_number:

No_data_found:

Too_many_rows:

Zero_divide:

Value_error:

其他預定義例外:

3)處理自定義例外:

例如:


11、視圖:

視圖本質上是一個映射關係,沒有存儲實質的數據。

1)創建視圖:

視圖之間可以作爲兩個表,進行聯合查詢。

2)創建或修改視圖:

3)刪除視圖: