目錄
包
打包了相關的PL/SQL類型、子程序到一個容器中。
兩個部分組成:
- 聲明
- 體
注意:
- 包本身不能被調用、被參數化或被嵌套
- 允許Oracle服務器一次讀多個對象到內存中
- 用戶只能訪問程序包的包頭部分,包體被隱藏
可以考慮成一個類,和麪向對象有相通之處。
包的聲明和包體可以放在不同的文件中,方便管理。
包的創建
包聲明
語法:
CREATE [OR REPLACE] PACKAGE
package name
IS| AS
公共變量、異常、遊標、子程序等聲明
END
package name;
例子:
CREATE OR REPLACE PACKAGE comm package
IS
g comm NUMBER := 100 ;
PROCEDURE reset comm(p comm IN NUMBER) ;
END comn package;
創建包體
CREATE OR REPI ACE PACKAGE BODY
package_ name
IS
私有的變量、靜態變量、遊標、異常、類型、子程序、子程序體
END package name;
這裏注意:
- 在包體中定義的標識符是私有結構,在包的外部不可見
- 在包體中先定義私有變量和子程序,後定義公共子程序
另外,創建函數和之前的函數是一樣的。
刪除包
語法:
DROP PACKAGE package_name;
DROP PACKAGE BODY package_name;//只刪除包體
開發包的原則
- 先定義包聲明,再定義包體
- 包聲明中應該只包含公共結構
- 改變包的聲明需要重新編譯每個涉及到的子程序
- 包體的變化不要求重新編譯包的聲明
- 包聲明應該儘可能包含少的內容
使用包可以獲得更好的封裝性及模塊性,另外可以提升性能。
內置包
oracle提供的包,擴展了數據庫的功能,使用時可以省略包名。
動態SQL
SQL語句經歷的階段:
- 解析(Parse)
- 綁定(Bind)
- 執行(Excute)
- 取回(Fetch)
注意:大量頻發訪問的儘量使用綁定變量,持久化數據儘量使用佔位符
動態SQL效率較低
本地動態SQL
語法
EXECUTE IMMEDIATE '動態SQL'
[INTO 變量列表]
[USING 綁定參數列表] ;
注意:只能返回一行結果
例子:
CREATE OR REPLACE PROCEDURE del rows
(p_table_name IN VARCHAR2,p_rows_deld OUT NUMBER)
IS
V_str varchar2(50);
BEGIN
v_str:= 'delete from '||I p_table_name ||' where sal> 3000';
EXECUTE IMMEDIATE v_str;
p_rows_deld := SQL%ROWCOUNT;
END;
表名在執行的時候才能確定。