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)刪除視圖: