--------------- package 包 包定义 包主体
---包定义
create or replace package my_package
is
--声明部分
function my_fun01 return number ;--- 声明一个无参函数 ---共有函数 全局
v_num number ;-- 变量 全局变量
end my_package;
--- 包体
create or replace package body my_package
is
------------声明部分
--私有变量
v_return number(2);
v_return1 varchar2(20);
---定义私有函数
function my_fun02 return varchar2
is
begin
dbms_output.put_line('my_fun02 私有 。。。。。。');
-- v_return:= my_fun01(); 小心递归
return '私有方发';
end my_fun02;
---- 包中声明的子程序 必须在 包体中定义
function my_fun01 return number
is
begin
dbms_output.put_line('my_fun01 共有有 。。。。。。');
v_return1:= my_fun02;
dbms_output.put_line('my_fun01调用02 返回值是: 。。。。。。'||v_return1);
return 1;
end my_fun01;
begin ---- 包中的执行体 第一次调用的时候 为了初始化 变量
dbms_output.put_line('my_package 包 执行体 。。。。。。');
v_return1:= my_fun02;
dbms_output.put_line('my_package 包 执行体 调用私有 fun02 返回值是: 。。。。。。'||v_return1);
---初始化 数据
v_num:=15;
end my_package;
declare
v_return number;
v_return1 varchar2(10);
begin
--- 包外 不访问私有的函数
--v_return1:=my_package.my_fun02;
v_return:=my_package.my_fun01;----- 在包外 访问共有的函数 子程序
dbms_output.put_line(my_package.v_num);---在包外 访问共有的变量
end;
------- 学生
create table stu_tab
(
sid number(4) primary key,
sname varchar2(20),
cid number(5)
)
---- 班级 class
create table cla_tab
(
cid number(5) primary key,
cname varchar2(20)
)
alter table stu_tab add constraint for_cid foreign key (cid) references cla_tab(cid)
--- 添加学生
insert into stu_tab values(1,'张振朝阳',1);
create or replace package stu_package
is
-----记录类型 全局
type stu_type is record(
s_id number(4),
s_name varchar2(20),
c_id number(5)
) ;
----声明 函数 返回是否添加成功
function add_stu(stu stu_tab) return boolean;
end stu_package;
create or replace package body stu_package
is
v_flag boolean;
--- 定义一个变量 接受班级
v_cla cla_tab%rowtype;
----定义 函数 返回是否添加成功
function add_stu(stu stu_type) return boolean
is
begin
select * into v_cla from cla_tab where cid=stu.c_id; -- 如果没有查到 先添加班级
insert into stu_tab values(stu.s_id ,stu.s_name,stu.c_id );
return true; ---没有结束方法
exception
when no_data_found then
insert into cla_tab values(stu.c_id,stu.c_id||'班级' ) ;
v_flag:=add_stu(stu);
return true;
when dup_val_on_index then
dbms_output.put_line (sqlcode||sqlerrm);
return false;
end add_stu;
end stu_package;
declare
---记录类型的变量 引用包定义中的 记录类型
v_stu stu_package.stu_type;
v_flag boolean;
v_sid number:=&n;
v_sname varchar2(10):=&nn;
v_scid number:=&m;
begin
v_stu.s_id:=v_sid;
v_stu.s_name:=v_sname;
v_stu.c_id :=v_scid;
v_flag:=stu_package.add_stu(v_stu);
if v_flag then
dbms_output.put_line ('添加成功');
else
dbms_output.put_line ('添加失败');
end if;
end;
select *from stu_tab;
select *from cla_tab;
------------------- 过程 方法的重载 名字 相同 作用域相同 参数列表不同
create or replace package test_package
is
---游标
type c_cursor_type is ref cursor return stu_tab%rowtype;
--- 过程 重载
procedure show_v_cur (p_info varchar2 );
procedure show_v_cur (p_info varchar2 );
procedure show_v_cur (p_info number );
procedure show_v_cur (p_info number,p_info2 varchar2 );
-- procedure show_v_cur (p_info varchar2,p_info2 number );
procedure show_v_cur (p_info2 varchar2,p_info number );
end;
create or replace package body test_package
is
--- 定义过程 重载
procedure show_v_cur (p_info varchar2 )
is
begin
dbms_output.put_line ('p_info varchar2 ');
end show_v_cur;
procedure show_v_cur (p_info number )
is
begin
dbms_output.put_line ('p_info number ');
end show_v_cur;
procedure show_v_cur (p_info number,p_info2 varchar2 )
is
begin
dbms_output.put_line ('p_info number,p_info2 varchar2 ');
end show_v_cur;
procedure show_v_cur (p_info varchar2,p_info2 number )
is
begin
dbms_output.put_line ('p_info varchar2,p_info2 number');
end show_v_cur;
procedure show_v_cur (p_info2 varchar2,p_info number )
is
begin
dbms_output.put_line ('p_info2 varchar2,p_info number');
end show_v_cur;
end;
begin
test_package.show_v_cur(111);
test_package.show_v_cur('123');
--test_package.show_v_cur(111,'123');
test_package.show_v_cur(p_info=>'123',p_info2=>111); --- 可以 实现 参数名 重载效果 定位传参
test_package.show_v_cur(p_info2=>'123',p_info=>111);
end;