首页 > 代码库 > Oracle 中包的应用
Oracle 中包的应用
包由两个分离的部分组成:包头(PACKAGE)和包体(PACKAGEBODY)。包头是包的说明部分,是对外的操作接口,对应用是可见的;包体是包的代码和实现部分,对应用来说是不可见的黑盒。
出现在包头中的称为公有元素,出现在包体中的称为私有元素,出现在包体的过程(或函数)中的称为局部变量。
创建包头的简要语句如下:
CREATE [OR REPLACE] PACKAGE 包名{IS|AS}公有变量定义公有类型定义公有游标定义公有异常定义函数说明过程说明END;
创建包体的简要语法如下:
CREATE [OR REPLACE] PACKAGE BODY 包名{IS|AS}私有变量定义私有类型定义私有游标定义私有异常定义函数定义过程定义END;
其它操作:
删除包头:DROP PACKAGE 包头名删除包体:DROP PACKAGE BODY 包体名重新编译包头:ALTER PACKAGE 包名 COMPILE PACKAGE重新编译包体:ALTER PACKAGE 包名 COMPILE PACKAGE BODY
案例:对学生表infos提供一个增删改查的包,infos表内容如下图所示:
包中的内容结构如下:
程序结构 | 类型 | 参数 | 说明 |
v_infos_count | 公有变量 | 学生总总数量,number类型 | |
p_init | 公有过程 | p_max number p_min number | 最大值,最小值 |
p_list_infos | 公有过程 | 显示学生列表数据 | |
p_add_infos | 公有过程 | p_stuid infos.stuid%type, | 增加一条学生记录 |
p_delete_infos | 公有过程 | p_stuid infos.stuid%type | 根据stuid删除一条学生记录 |
p_edit_infos_name | 公有过程 | p_stuid infos.stuid%type | 根据stuid修改学生的姓名 |
v_msg | 私有变量 | show message | |
v_max_age | 私有变量 | max age ,number | |
v_min_age | 私有变量 | min age ,number | |
f_exist_infos | 私有函数 | p_stuid infos.stuid%type | 判断学生是否存在, return boolean |
p_show_msg | 私有过程 | show msg |
包SQL:
(1)创建包头create or replace package pck_infosas --总数量 v_infos_count number; --初始化操作 procedure p_init(p_max number, p_min number); --显示学生列表数据 procedure p_list_infos; --增加一条学生记录 procedure p_add_infos( p_stuid infos.stuid%type, p_stuname infos.stuname%type, p_gender infos.gender%type, p_age infos.age%type, p_seat infos.seat%type, p_enrolldate infos.enrolldate%type, p_stuaddress infos.stuaddress%type, p_classno infos.classno%type); --删除一条学生记录 procedure p_delete_infos(p_stuid infos.stuid%type); --根据stuid修改学生的姓名 procedure p_edit_infos_name( p_stuid infos.stuid%type, p_stuname infos.stuname%type);end;(2)创建包体create or replace package body pck_infosas v_msg varchar2(100); --show message v_max_age number; --max age v_min_age number; --min age --判断学生是否存在 function f_exist_infos(p_stuid infos.stuid%type) return boolean; --show msg procedure p_show_msg; --初始化操作 procedure p_init(p_max number, p_min number) as begin select count(stuid) into v_infos_count from infos; v_max_age:=p_max; v_min_age:=p_min; v_msg:=‘init finished!‘; p_show_msg; end p_init; --显示信息 procedure p_show_msg as begin dbms_output.put_line(v_msg); end p_show_msg; --判断学生是否存在 function f_exist_infos(p_stuid infos.stuid%type) return boolean as v_num number; begin select count(stuid) into v_num from infos where stuid=p_stuid; if v_num=1 then return true; else return false; end if; end f_exist_infos; --显示学生列表数据 procedure p_list_infos as v_infos_record infos%rowtype; cursor cur_infos is select * from infos; begin open cur_infos; loop fetch cur_infos into v_infos_record; exit when cur_infos%notfound; dbms_output.put_line(‘stuid:‘||v_infos_record.stuid); end loop; close cur_infos; end p_list_infos; --增加一条学生记录 procedure p_add_infos( p_stuid infos.stuid%type, p_stuname infos.stuname%type, p_gender infos.gender%type, p_age infos.age%type, p_seat infos.seat%type, p_enrolldate infos.enrolldate%type, p_stuaddress infos.stuaddress%type, p_classno infos.classno%type) as begin if not f_exist_infos(p_stuid) then insert into infos(stuid,stuname,gender,age,seat,enrolldate,stuaddress,classno) values(p_stuid,p_stuname,p_gender,p_age,p_seat,p_enrolldate,p_stuaddress,p_classno); commit; v_infos_count:=v_infos_count+1; else v_msg:=‘already exist!‘; end if; end p_add_infos; --删除一条学生记录 procedure p_delete_infos(p_stuid infos.stuid%type) as begin if f_exist_infos(p_stuid) then delete from infos where stuid=p_stuid; commit; v_infos_count:=v_infos_count-1; else v_msg:=‘not exist infos!‘; end if; end p_delete_infos; --根据stuid修改学生的姓名 procedure p_edit_infos_name( p_stuid infos.stuid%type, p_stuname infos.stuname%type) as begin if f_exist_infos(p_stuid) then update infos set stuname=p_stuname where stuid=p_stuid; commit; else v_msg:=‘not exists infos‘; end if; end p_edit_infos_name; end;
Oracle 中包的应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。