方括號里的內容為可選項
大括號是必填
1PL/SQL結構塊
DECLARE /* * 聲明部分——定義常量、變量、復雜數據類型、游標、用戶自定義異常 */ BEGIN /* * 執行部分——PL/SQL語句和SQL語句 */ EXCEPTION /* * 異常處理部分——處理運行異常 */ END; /*塊結束標記 */
2 創建序列
1 CREATE SEQUENCE [ schema. ] sequence_name 2 [ { INCREMENT BY | START WITH } integer 3 | { MAXVALUE integer | NOMAXVALUE } 4 | { MINVALUE integer | NOMINVALUE } 5 | { CYCLE | NOCYCLE } 6 | { CACHE integer | NOCACHE } 7 | ... 8 ]... 9 ;
- schema:模式,即用戶名稱
- sequence_name:序列名稱
- INCREMENT BY:定義序列的步長,如果省略,則默認為1,如果出現負值,則代表Oracle序列的值是按照此步長遞減的。
- START WITH:定義序列的初始值,默認為1。
- MAXVALUE:序列生成器能產生的最大值。NOMAXVALUE是默認選項,代表沒有最大值定義。
- MINVALUE:序列生成器能產生的最小值。NOMINVALUE是默認選項,代表沒有最小值定義。
- CYCLE和NOCYCLE:當序列生成器的值達到限制值后是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值,最小值為1。對於遞減序列達到最小值時,循環到最大值。如果不循環,達到限制值后,繼續產生新值就會發生錯誤。
- CACHE:定義存放序列的內存塊的大小,默認為20,相當於預加載。緩沖部分序列計數以便更快獲取序列值,可以改善序列的性能,但緩存選項可能會造成數據丟失。NOCACHE表示不緩沖
3 刪除序列
1 DROP SEQUENCE [ schema. ] sequence_name ;
4 修改序列
1 ALTER SEQUENCE [ schema. ] sequence_name 2 { INCREMENT BY integer 3 | { MAXVALUE integer | NOMAXVALUE } 4 | { MINVALUE integer | NOMINVALUE } 5 | { CYCLE | NOCYCLE } 6 | { CACHE integer | NOCACHE } 7 | ... 8 } ... 9 ;
注意,不能修改序列的初始值,否則會報ORA-02283。如果需要修改初始值,先刪除序列再重新創建序列設定初始值。
復合數據類型
5.1. 記錄(Record)
1 TYPE record_name IS RECORD( 2 varable1 data_type1 [NOT NULL] [:= default_value ], 3 varable2 data_type2 [NOT NULL] [:= default_value ], 4 ......, 5 varablen data_typen [NOT NULL] [:= default_value ] 6 );
5.2. 表(TABLE)
5.2.1. 索引表
1 TYPE table_name IS TABLE OF element_type [NOT NULL] 2 INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2];
5.2.2 嵌套表
1 TYPE type_name IS TABLE OF element_type;
5.3. 數組(VARRAY)
1 TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];
6 顯式游標
6.1聲明/定義游標
1 CURSOR cursor_name 2 [(parameter_dec [, parameter_dec ]…)] 3 [RETURN datatype] 4 IS 5 select_statement;
6.2 打開游標
1 OPEN cursor_name [ ( cursor_parameter [ [,] actual_cursor_parameter ]... ) ]
6.3讀取數據
1 FETCH { cursor | cursor_variable | :host_cursor_variable } 2 { into_clause | bulk_collect_into_clause [ LIMIT numeric_expression ] } ;
6.4 關閉游標
1 CLOSE cursor_name;
7 游標FOR循環
1 FOR index_variable IN cursor_name[(value[, value]…)] LOOP 2 -- 游標處理語句 3 END LOOP;
8條件結構
1. 簡單IF結構
1 -- 簡單IF結構 2 IF <布爾表達式> THEN 3 滿足條件時執行的語句 4 END IF;
2. IF-ELSE結構
1 -- IF-ELSE結構 2 IF <布爾表達式> THEN 3 滿足條件時執行的語句 4 ELSE 5 不滿足條件時執行的語句 6 END IF;
3 多重IF
1 -- 多重IF 2 IF <布爾表達式1> THEN 3 滿足條件1時執行的語句 4 ELSIF <布爾表達式2> THEN 5 滿足條件2時執行的語句 6 ELSIF <布爾表達式3> THEN 7 滿足條件3時執行的語句 8 ELSE 9 滿足條件1、2、3均不滿足時執行的語句 10 END IF;
注意:ELSIF
不能寫成ELSEIF
9 CASE
語法一
1 CASE 條件表達式 2 WHEN 條件表達式結果1 THEN 3 語句1 4 WHEN 條件表達式結果2 THEN 5 語句2 6 ...... 7 WHEN 條件表達式結果n THEN 8 語句n 9 [ELSE 條件表達式結果] 10 END CASE;
語法二
1 CASE 2 WHEN 條件表達式1 THEN 3 語句1 4 WHEN 條件表達式2 THEN 5 語句2 6 ...... 7 WHEN 條件表達式n THEN 8 語句n 9 [ELSE 語句] 10 END CASE;
10 循環結構
簡單循環
1 LOOP 2 循環體語句; 3 [EXIT WHEN <條件語句>] 4 END LOOP;
WHILE 循環
1 WHILE <布爾表達式> LOOP 2 循環體語句; 3 END LOOP;
FOR循環
1 [<<標簽>>] 2 FOR 循環計數器 IN [ REVERSE ] 下限 .. 上限 LOOP 3 循環體語句; 4 END LOOP [<<標簽>>];
11 異常處理通常放在PL/SQL程序的后部,語法結構為
1 EXCEPTION 2 WHEN { exception [ OR exception ]... | OTHERS } 3 THEN statement [ statement ]...
11.1非預定義的異常處理
非預定義異常有錯誤號沒有名字,處理的辦法是:自己定義一個名字,綁定到錯誤號,捕獲錯誤名。處理這類異常,首先必須對非預定義的Oracle異常進行定義。
如:
1 myexcp EXCEPTION;
然后使用EXCEPTION_INIT語句與標准的ORACLE錯誤聯系起來,如:
2 PRAGMA EXCEPTION_INIT(myexcp,-02292);
說明:ORA-02292是違反完整性約束的錯誤代碼。
11.2 定義異常
1 異常名稱 EXCEPTION; 2 PRAGMA EXCEPTION_INIT(異常的名字,錯誤號);
11.3拋出異常
1 RAISE 異常的名稱
RAISE_APPLICATION_ERROR過程可用於創建用戶定義的錯誤信息,可以在可執行部分和異常處理部分使用
1 RAISE APPLICATION_ERROR(錯誤號,錯誤描述);
11.4 處理異常
1 1 EXCEPTION 2 2 WHEN { exception [ OR exception ]... | OTHERS } 3 3 THEN statement [ statement ]...
12. FORALL
使用FORALL,可以將多個DML批量發送給SQL引擎來執行,最大限度地減少上下文交互所帶來的開銷。
1 FORALL index_name IN 2 { lower_bound .. upper_bound 3 | INDICES OF collection_name [ BETWEEN lower_bound AND upper_bound ] 4 | VALUES OF index_collection 5 } 6 [ SAVE EXCEPTIONS ] dml_statement;
index_name:一個無需聲明的標識符,作為集合下標使用。
lower_bound .. upper_bound:數字表達式,來指定一組連續有效的索引數字下限和上限。該表達式只需解析一次。
INDICES OF collection_name:用於指向稀疏數組的實際下標。跳過沒有賦值的元素,例如被 DELETE 的元素,NULL 也算值。
VALUES OF index_collection_name:把該集合中的值當作下標,且該集合值的類型只能是 PLS_INTEGER/BINARY_INTEGER。
SAVE EXCEPTIONS:可選關鍵字,表示即使一些DML語句失敗,直到FORALL LOOP執行完畢才拋出異常。可以使用SQL%BULK_EXCEPTIONS 查看異常信息。
dml_statement:靜態語句,例如:UPDATE或者DELETE;或者動態(EXECUTE IMMEDIATE)DML語句
13存儲過程
1 CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name 2 [ ( parameter_declaration [, parameter_declaration ]... ) ] 3 [ invoker_rights_clause ] 4 { IS | AS } 5 { [ declare_section ] body | call_spec | EXTERNAL} ;
procedure_name:過程名稱。
parameter_declaration:參數聲明
格式如下
1 parameter_name [ [ IN ] datatype [ { := | DEFAULT } expression ] 2 | { OUT | IN OUT } [ NOCOPY ] datatype
IN:輸入參數。
OUT:輸出參數。
IN OUT:輸入輸出參數。
invoker_rights_clause:這個過程使用誰的權限運行
as或is用於開始一個PL/SQL塊
declare_section:聲明部分。
body:過程塊主體,執行部分。
一般只有在確認procedure_name過程是新過程或是要更新的過程時,才使用OR REPALCE關鍵字
13 創建函數
1 CREATE [ OR REPLACE ] FUNCTION [ schema. ] function_name 2 [ ( parameter_declaration [, parameter_declaration]... ) 3 ] 4 RETURN datatype 5 [ { invoker_rights_clause 6 | DETERMINISTIC 7 | parallel_enable_clause 8 | RESULT_CACHE [ relies_on_clause ] 9 }... 10 ] 11 { { AGGREGATE | PIPELINED } USING [ schema. ] implementation_type 12 | [ PIPELINED ] { IS | AS } { [ declare_section ] body 13 | call_spec 14 | EXTERNAL 15 } 16 } ;
14 建立包規范
1 CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ] 2 PACKAGE [ schema. ] package_name 3 [ invoker_rights_clause ] 4 { IS | AS } item_list_1 END [ package_name ] ;
package_name:包名。
invoker_rights_clause:使用誰的權限運行
item_list_1:聲明包的公用組件列表
1 { type_definition -- 數據類型 2 | cursor_declaration -- 游標 3 | item_declaration -- 變量、常量等 4 | function_declaration -- 函數 5 | procedure_declaration -- 過程 6 } 7 [ { type_definition 8 | cursor_declaration 9 | item_declaration 10 | function_declaration 11 | procedure_declaration 12 | pragma 13 } 14 ]...
15 建立包體
1 CREATE [ OR REPLACE ] PACKAGE BODY [ schema. ] package_name 2 { IS | AS } 3 BEGIN statement [ statement | pragma ]... 4 [ EXCEPTION exception_handler [ exception_handler ]... ] 5 [ initialize_section ] 6 END [ package_name ] ;
動態SQL 使用EXECUTE IMMEDIATE語句
1 EXECUTE IMMEDIATE dynamic_sql_stmt 2 [ { into_clause | bulk_collect_into_clause } [ using_clause ] 3 | using_clause [ dynamic_returning_clause ] 4 | dynamic_returning_clause 5 ] ;
dynamic_sql_stmt:是代表一條SQL語句或一個PL/SQL塊的字符串表達式。
into_clause:用於存放被選出的字段值的變量或被選出的行記錄。格式如:
INTO { variable [, variable ]... | record )
using_clause:SQL或PL/SQL字符串中包括用於參數綁定的占位符時,該子句為占位符綁定值,也可用於返回值。輸入bind_argument參數是一個表達式,它的值將被輸入(IN模式)或輸出(OUT模式)或輸入輸出(IN OUT模式)到動態SQL語句或是PL/SQL塊中。一個輸出bind_argument參數就是一個能保存動態SQL返回值的變量。格式如:
USING [ IN | OUT | IN OUT ] bind_argument
[ [,] [ [ IN | OUT | IN OUT ] bind_argument ]...
dynamic_returning_clause:指明用於存放返回值的變量或記錄。格式如:
{ RETURNING | RETURN } { into_clause | bulk_collect_into_clause }