加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle中包的使用

发布时间:2020-12-12 16:42:30 所属栏目:百科 来源:网络整理
导读:Oracle中包的使用 包头 创建语法 create [ or replace ] package package_name { IS | AS } type_definition | procedure_specification | function_specification | variable_declaration | exception_declaration | cursor_declaration | pragma_declarati

create [or replace] package package_name {IS|AS}

type_definition |

procedure_specification |

function_specification |

variable_declaration |

exception_declaration |

cursor_declaration |

pragma_declaration

end [package_name];

简单案例

包作用:

可以把一些过程和函数组织到一起,把PL/SQL代码模块化,构建其他人员重用的代码

包的说明

也叫包头,包含了有关包内容的信息

create or replace ClassPackage As

--Add a new student into the specified class

PROCEDURE AddStudent (p_studentID in students.id%type,

p_department in classes.department%type,

p_course in classes.course%type);

--Remove the specified student from the specified class

PROCEDURE RemoveStudent (p_studentID in students.id%type,

p_course in classes.course%type);

--Exception raised by RemoveStudent

e_studentNotRegistered EXCEPTION;

--Table type used to hold student info

TYPE t_studentIDTable is table of students.id%type

index by binary_integer;

--Return a PL.SQL table containing the students.id%type

--in the specified class

PROCEDURE ClassList(p_department in classes.department%type,

p_course in classes.course%type,

p_IDs out t_studentIDTable,

p_NumStudents in out binary_integer);

end ClassPackage;

包体

包体是独立于包头的数据字典对象,包头完成编译之后才能进行编译,包体中带有实现包头中描述的前向子程序的代码段。

------------------创建包头----------------------------

create or replace ClassPackage As

--Add a new student into the specified class

PROCEDURE AddStudent (p_studentID in students.id%type,

p_NumStudents in out binary_integer);

end ClassPackage;

---------------创建包体------------------------------

create or replace package BODY ClassPackage AS

---------------添加学生------------------------------

procedure AddStudent

(

p_studentID in students.id%type,

p_course in classes.course%type

) IS

begin

insert into registered_students (student_id,department,couse)

values (p_studentID,p_department,p_course);

end AddStudent;

---------------删除学生-------------------------------

procedure RemoveStudent

(

p_studentID in students.id%type,

p_course in classes.course%type

) IS

begin

delete from registered_students

where student_id = p_studentID

and department = p_department

and couse = p_course

if SQL%NOTFOUND then

raise e_StudentNotRegistered;

endif;

end RemoveStudent;

-------------这里可以使用包头中声明的变量,异常等----

procedure ClassList

(

p_department in classes.department%type,

p_IDs out t_studentIDTable,

p_NumStudents in out binary_integer

) IS

v_studentID registered_students.student_id%type;

CURSOR c_registeredStudents IS

select student_id

from registered_students

where department = p_dapartment

and course = p_course;

begin

p_NumStudents:=0;

open c_registeredStudents;

loop

fetch c_registeredStudents into v_StudentID;

exit when c_registeredStudents%NOTFOUND;

p_NumStudents:=p_NumStudents+1;

p_IDs(p_NumStudents):=v_StudentID;

end loop;

end ClassList;

end ClassPackage;

重载

在包的内部,过程和函数可以被重载,也就是说,可以存在多个名称相同的,但是参数不同的过程和函数。重载允许相同的操作执行在不同的对象上。

重载过程

create or replace package ClassPackage AS

----方式一:

procedure AddStudent

(

p_StudentId in students.id%type,

p_Department in classes.department%type,

p_Course in classes.course

)

----方式二:

procedure AddStudent

(

p_FirstName in students.first_name%type,

p_LastName in students.last_name,

p_Course in classes.course%type

)

.....

end ClassPackage;

create or replace packageBODY ClassPackage AS

----重载:第一种方式添加学生

procedure AddStudent

(

p_StudentId in students.id%type,

p_Course in classes.course

) IS

begin

insert into register_student(student_id,course)

value (p_StudentId,p_Department,p_Course);

end AddStudent;

----重载:第二种方式添加学生

procedure AddStudent

(

p_FirstName in students.first_name%type,

p_LastName in students.last_name%type,

p_Course in classes.course%type

) IS

v_StudentID students.ID%type;

begin

select ID into v_StudentID

where first_name=p_FirstName

and last_name=p_LastName;

insert into register_student(student_id,course)

value (v_StudentID,p_Deparment,p_Course);

end AddStudent;

....

end ClassPackage;

使用重载

----过程一:

Begin

ClassPackage.AddStudent('10001','财务','6666');

end;

----过程二:

Begin

ClassPackage.AddStudent('hello','world','事业','7777');

end;

Oracle的内置包

1. DBMS_ALERT:数据库报警,允许会话间通讯

2. DBMS_JOB:任务调度服务

3. DBMS_LOB:大型对象操作

4. DBMS_PIPE:数据库管道,允许会话间通讯

5. DBMS_SQL:执行动态SQL

6. UTL_FILE:文本文件的输入输出

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

Oracle中包的使用

包头

创建语法

    推荐文章
      热点阅读