OraclePL/SQL通俗的講就是過程語言(Procedural Language)和結構化查詢的相關語言(SQL)相結合而演變成的編程語言,OraclePL/SQL其實就是對SQL 的擴展,它支持多種數據類型,如大對象和集合類型可以使用條件和循環等控制結構。
可以創建存儲過程,觸發器和程序包,給SQL 語句的執行添加程序邏輯!他與Oracle服務器
和Oracle工具緊密集成,具備可移植,靈活性和安全性。
PL/SQL 的優點
支持 SQL
數據操縱命令
事務控制命令
游標控制
SQL 函數和 SQL 運算符
支持面向對象編程 (OOP)
可移植性
可運行在任何操作系統和平台上的Oralce 數據庫。
更佳的性能
與 SQL 緊密集成,簡化數據處理
支持所有 SQL 數據類型
支持 NULL 值
支持 %TYPE 和 %ROWTYPE 屬性類型
安全性
可以通過存儲過程限制用戶對數據的訪問。
PL/SQL 的體系結構
PL/SQL引擎駐留在Oracle服務器中,該引擎接受PL/SQL塊,並且對起
進行編譯執行!
PL/SQL 塊簡介
OraclePL/SQL塊是構成程序的基本單位,每一個塊都包含有PL/SQL和SQL語句,典型的PL/SQL代碼塊包含如下結構:
(1).聲明部分
(2)可執行部分
(3)異常處理
語法結構如下:
[DECLARE
declarations]—聲明部分
BEGIN
executable statements---可執行部分
[EXCEPTION –異常處理
- handlers]
- END;
代碼示例:
DECLARE
qty_on_hand NUMBER(5); --程序聲明部分,定義變量,游標和自定義常量
- BEGIN
- SELECT quantity INTO qty_on_hand -
- FROM Products -
- WHERE product = '芭比娃娃' -
- FOR UPDATE OF quantity; -
- IF qty_on_hand > 0 THEN -
- UPDATE Products SET quantityquantity = quantity + 1 -
WHERE product = '芭比娃娃'; 程序執行部分
- INSERT INTO purchase_record -
- VALUES ('已購買芭比娃娃', SYSDATE); -
- END IF; -
- COMMIT; -
EXCEPTION /* 異常處理語句 * / -----------------------異常處理
- WHEN OTHERS THEN -
- DBMS_OUTPUT.PUT_LINE('出錯:'|| SQLERRM); -
- END;
變量和常量
OraclePL/SQL 塊中可以使用變量和常量
在聲明部分聲明,使用前必須先聲明
聲明時必須指定數據類型,每行聲明一個標識符
在可執行部分的 SQL 語句和過程語句中使用
聲明變量和常量的語法
- identifIEr [CONSTANT] datatype [NOT NULL]
- [:= | DEFAULT expr];
給變量賦值有兩種方法
使用賦值語句 :=
使用 select into 語句
代碼示例:
- DECLARE
- icode VARCHAR2(6);
- p_catg VARCHAR2(20);
- p_rate NUMBER;
- c_rate CONSTANT NUMBER := 0.10;
- BEGIN
- ...
- icode := 'i205';
- SELECT p_category, itemrate * c_rate
- INTO p_catg, p_rate
- FROM itemfile WHERE itemcode = icode;
- ...
- END;
數據類型
OraclePL/SQL支持的內置數據類型有如下幾種:
如圖:
標量類型
數字
字符
CHAR
VARCHAR2
LONG
RAW
LONG RAW
結構如圖:
日期時間類型
日期時間類型
存儲日期和時間數據
常用的兩種日期時間類型
DATE
TIMESTAMP
布爾類型
此類別只有一種類型,即BOOLEAN類型
用於存儲邏輯值(TRUE、FALSE和NULL)
不能向數據庫中插入BOOLEAN數據
不能將列值保存到BOOLEAN變量中
只能對BOOLEAN變量執行邏輯操作
如圖:
LOB類型
用於存儲大文本、圖像、視頻剪輯和聲音剪輯等非結構化數據。
LOB數據類型可存儲最大 4GB的數據。
LOB 類型包括:
BLOB 將大型二進制對象存儲在數據庫中
CLOB 將大型字符數據存儲在數據庫中
NCLOB 存儲大型UNICODE字符數據
BFILE 將大型二進制對象存儲在操作系統文件中
LOB 類型的數據庫列僅存儲定位符,該定位符指向大型對象的存儲位置
DBMS_LOB程序包用於操縱 LOB 數據
代碼示例:
- SET SERVEROUTPUT ON
- DECLARE
- clob_var CLOB;
- amount INTEGER;
- offset INTEGER;
- output_var VARCHAR2(100);
- BEGIN
- SELECT chapter_text INTO clob_var
- FROM my_book_text
- WHERE chapter_id=5;
amount := 24; -- 要讀取的字符數
offset := 1; -- 起始位置
- DBMS_LOB.READ(clob_var,amount,offset,output_var);
- DBMS_OUTPUT.PUT_LINE(output_var);
- END;
- /