Oracle數據庫 中的基礎的一些語法結構


 

方括號里的內容為可選項

大括號是必填

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 ;

 

  1. schema:模式,即用戶名稱
  2. sequence_name:序列名稱
  3. INCREMENT BY:定義序列的步長,如果省略,則默認為1,如果出現負值,則代表Oracle序列的值是按照此步長遞減的。
  4. START WITH:定義序列的初始值,默認為1。
  5. MAXVALUE:序列生成器能產生的最大值。NOMAXVALUE是默認選項,代表沒有最大值定義。
  6. MINVALUE:序列生成器能產生的最小值。NOMINVALUE是默認選項,代表沒有最小值定義。
  7. CYCLE和NOCYCLE:當序列生成器的值達到限制值后是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值,最小值為1。對於遞減序列達到最小值時,循環到最大值。如果不循環,達到限制值后,繼續產生新值就會發生錯誤。
  8. 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.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; 

游標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

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM