目录
包
打包了相关的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;
表名在执行的时候才能确定。