PL-SQL程式設計基礎(1)
一、什麼是PL-SQL
PL-SQL是結合了Oracle過程語言和結構化查詢語言(SQL)的一種擴充套件語言。具體來說,PL-SQL就是在普通的SQL語句的基礎上增加了程式語言的特點,將資料操作和查詢語句組織在PL-SQL程式碼的過程性單元中,通過邏輯判斷、迴圈等操作實現複雜的功能或者計算的程式語言。
使用PL-SQL有以下優點:
1、能夠把一組SQL語句放到一個模組中。使其更具模組化特點。
2、可以在PL-SQL中增加邏輯結構判斷、迴圈等程式結構。
3、具有異常處理功能。使程式不會中斷。
4、減少網路互動,提高效能。
5、具有更好的移植性。
二、PL-SQL程式塊
PL-SQL程式塊包括五個部分,宣告部分,程式段開始,程式碼主體部分,異常部分,程式結束。
DECLARE --宣告部分
宣告變數、常量、遊標、使用者自定義異常的宣告
....
BEGIN --程式開始部分
SQL語句和PL-SQL語句構成的執行語句 --程式碼主體部分
...
EXCEPTION
程式出現異常時,捕獲異常並處理異常。 --異常部分
...
END; --程式結束部分
注意:
1、其中宣告部分和異常部分是可選的。
2、DELCARE,BEGIN和EXCEPTION後沒有分號,而END和其他所有的PL-SQL語句後必須以分號結束!
三、變數的宣告與賦值
1、定義變數的語法:
DECLARE variable_name date_type(size) [not null][:=value]
DECLARE:定義變數所使用的關鍵字。
variable_name:變數的名稱。
date_type(size):變數的型別,size表示資料長度。
[not null]:變數不允許為空。
[:=value]:為變數賦初始值。
示例:
DECLARE v_name varchar2(20); --宣告一個字串型別的變數 v_age number:=&age; --宣告一個數字型別的變數 &age表示輸入資料,會臨時彈出一個輸入框讓我們輸入資料。
PL-SQL中的變數命名規則:
1、變數名首字母必須是英文字母,後面可以跟上字母、數字、下劃線,#,$。
2、變數名長度不超過30個字元。
3、變數名中不能有空格。
4、不能使用關鍵字命名。
注意:
變數的宣告只在當前程式塊中有效。
2、變數的使用和賦值
a.使用:=進行賦值
v_name := 'wangwu'; --直接將'wangwu'賦值給變數v_name;
b.使用select..into..進行賦值
DECLARE
PROID NUMBER := &ID;
PNAME VARCHAR(20);
BEGIN
SELECT NAME INTO PNAME FROM ES_PRODUCT WHERE ID = PROID; --將name列的值賦給pname
DBMS_OUTPUT.PUT_LINE(PNAME);
END;
注意:
1) 查詢結果只能返回單條記錄,多條或者0條都會返回異常。
2) into語句必須是在select 和 from 字句之間。
3)into所檢索出的資料型別必須和變數的型別一致。
4) into後賦值變數的個數必須和select查詢出的變數個數一致。
如果使用命令列執行PL-SQL程式碼塊,使用/表示執行程式碼塊,然後通過 set serveroutput on;開啟輸出內容!
c.一次對多個變數進行賦值,並且變數的型別使用表中的型別。
DECLARE
v_id NUMBER := &ID; --定義輸入變數
v_name es_product.Name%TYPE; --定義變數,和es_product.name的型別一致
v_price es_product.Price%TYPE;
BEGIN
SELECT p.name,p.price
INTO v_name, v_price
FROM es_product p
WHERE ID=v_id; --對多個變數進行賦值,這裡只能返回單條記錄。
DBMS_OUTPUT.PUT_LINE('id:' || v_id || 'name:' || v_name || 'price:' || v_price); --輸出內容
END;
d.定義資料行,使用資料行可以儲存多個變數的值。以一個整體儲存一條記錄的列的資訊。(類似物件的方式)
DECLARE
v_id NUMBER := &ID;
v_row es_product%ROWTYPE; --定義變數,es_product.rowtype為esproduct的行型別
BEGIN
SELECT p.name,p.price
INTO v_row.name, v_row.price
FROM es_product p
WHERE ID=v_id;
DBMS_OUTPUT.PUT_LINE('id:' || v_id || 'name:' || v_row.name || 'price:' || v_row.price);
END;