PL/SQL的基本語法
- PL/SQL 是 Procedure Language & Structured Query Language 的縮寫PL/SQL是對 SQL 語言存儲過程語言的擴展,它現在已經成爲一種過程處理語言
- PL/SQL 是 是 ORACLE 系統的核心語言,現在 ORACLE 的許多部件都是由 PL/SQL 寫成。在 PL/SQL 中可以使用的 SQL 語句有:
INSERT,UPDATE,DELETE,SELECT … INTO,COMMIT,ROLLBACK,SAVEPOINT。 - 提示:在 PL/SQL 中只能用 SQL 語句中的 DML 部分,不能用 DDL 部分,如果要在 PL/SQL 中使用 DDL( 如CREATE table 等 ) 的話,只能以動態的方式來使用。
- PL/SQL 程序由三個塊組成,即聲明部分、執行部分、異常處理部分
- PL/SQL 塊的結構如下:
DECLARE
/* 聲明部分 : 在此聲明 PL/SQL 用到的變量 , 類型及遊標,以及局部的存儲過程和函數 */
BEGIN
/* 執行部分 : 過程及 SQL 語句 , 即程序的主要部分 */
EXCEPTION
/* 執行異常部分 : 錯誤處理 */
END;
-
PL/SQL 塊可以分爲三類 :
①, 無名塊:動態構造,只能執行一次。
②,子程序:存儲在數據庫中的 存儲過程、函數及包等。當在數據庫上建立好後可以在其它程序中調用它們。
③,觸發器:當數據庫發生操作時,會觸發一些事件,從而自動執行相應的程序。 -
建議的命名方法:
記錄類型
- 記錄類型是把 邏輯相關 的數據作爲一個單元存儲起來 ,稱作 PL/SQL RECORD 的域(FIELD) ,其作用是存放互不相同但邏輯相關的信息。
- DBMS_OUTPUT.PUT_LINE 過程的功能類似於 Java 中的 System.out.println() 直接將輸出結果送到標準輸出中
- 定義一個變量,其數據類型與已經定義的某個 數據變量的類型相同,或者與數據庫表的某個列的數據類型相同,這時可以使用%TYPE。
- 使用%TYPE 特性的優點在於:
所引用的數據庫列的數據類型可以不必知道;
所引用的數據庫列的數據類型可以實時改變。
- PL/SQL 提供%ROWTYPE 操作符, 返回一個記錄類型, 其數據類型和數據庫表的數據結構相一致。
- 使用%ROWTYPE 特性的優點在於:
所引用的數據庫中列的個數和數據類型可以不必知道;
所引用的數據庫中列的個數和數據類型可以實時改變。
- PL/SQL 程序可使用嵌套表類型創建具有一個或多個列和無限行的變量, 這很像數據庫中的表. 聲明嵌套表類型的一般語法如下:
TYPE type_name IS TABLE OF
{datatype | {variable | table.column} % type | table%rowtype};
- 說明:
①,在使用嵌套表之前必須先使用該集合的構造器初始化它. PL/SQL 自動提供一個帶有相同名字的構造器作爲集合類型.
②, 嵌套表可以有任意數量的行. 表的大小在必要時可動態地增加或減少: extend(x) 方法添加 x 個空元素到集合末尾; trim(x) 方法爲去掉集合末尾的 x 個元素.
- 在 PL/SQL 編程中,變量賦值是一個值得注意的地方,它的語法如下:
variable := expression ;
variable 是一個 PL/SQL 變量, expression 是一個 PL/SQL 表達式.
- 數據庫賦值
數據庫賦值是 通過 SELECT 語句來完成的,每次執行 SELECT語句就賦值一次, 一般要求被賦值的變量與SELECT 中的列名要一一對應。如
DECLARE
emp_id emp.empno%TYPE :=7788;
emp_name emp.ename%TYPE;
wages emp.sal%TYPE;
BEGIN
SELECT ename, NVL(sal,0) + NVL(comm,0) INTO emp_name, wages
FROM emp WHERE empno = emp_id;
DBMS_OUTPUT.PUT_LINE(emp_name||’----‘||to_char(wages));
END;
PL/SQL 流程控制語句
- PL/SQL 的流程控制語句, 包括如下三類:
控制語句: IF 語句
循環語句: LOOP 語句, EXIT 語句
順序語句: GOTO 語句, NULL 語句
IF <布爾表達式> THEN
PL/SQL 和 SQL 語句;
END IF;
IF <布爾表達式> THEN
PL/SQL 和 SQL 語句;
ELSE
其它語句;
END IF;
IF <布爾表達式> THEN
PL/SQL 和 SQL 語句;
ELSIF < 其它布爾表達式> THEN
其它語句;
ELSIF < 其它布爾表達式> THEN
其它語句;
ELSE
其它語句;
END IF;
DECLARE
v_empno emp.empno%TYPE;
V_salary emp.sal%TYPE;
V_comment VARCHAR2(35);
BEGIN
SELECT sal INTO v_salary FROM emp WHERE empno=v_empno;
IF v_salary<1500 THEN
V_comment:= ‘Fairly less’;
ELSIF v_salary <3000 THEN
V_comment:= ‘A little more’;
ELSE
V_comment:= ‘Lots of salary’;
END IF;
DBMS_OUTPUT.PUT_LINE(V_comment);
END;
DECLARE
V_grade char(1) ;
V_appraisal VARCHAR2(20);
BEGIN
V_appraisal :=
CASE v_grade
WHEN ‘A’ THEN ‘Excellent’
WHEN ‘B’ THEN ‘Very Good’
WHEN ‘C’ THEN ‘Good’
ELSE ‘No such grade’
END;
DBMS_OUTPUT.PUT_LINE(‘Grade:‘||v_grade||’ Appraisal: ‘|| v_appraisal);
END;
- 簡單循環LOOP
DECLARE
int NUMBER(2) :=0;
BEGIN
LOOP
int := int + 1;
DBMS_OUTPUT.PUT_LINE('int 的當前值爲:'||int);
EXIT WHEN int =10;
END LOOP;
END;
- WHILE 循環( 相較 LOOP推薦使用 )
DECLARE
x NUMBER :=1;
BEGIN
WHILE x<=10 LOOP
DBMS_OUTPUT.PUT_LINE('X 的當前值爲:'||x);
x:= x+1;
END LOOP;
END;
- 數字式循環(每循環一次,循環變量自動加 1;使用關鍵字 REVERSE,循環變量自動減 1。跟在 IN REVERSE 後面的數字必須是從小到大的順序, 而且必須是整數,不能是變量或表達式。可以使用 EXIT 退出循環。)
BEGIN
FOR int in 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('int 的當前值爲: '||int);
END LOOP;
END;
- 標號和 GOTO(PL/SQL 中 GOTO 語句是無條件跳轉到指定的標號去的意思)
DECLARE
V_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('V_counter 的當前值爲:'||V_counter);
V_counter := v_counter + 1;
IF v_counter > 10 THEN
GOTO l_ENDofLOOP;
END IF;
END LOOP;
<<l_ENDofLOOP>>
DBMS_OUTPUT.PUT_LINE('V_counter 的當前值爲:'||V_counter);
END ;