PLSQL包

例题:输入两个任意数,用函数返回两数之和,用存储过程打印两数之积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
create or replace function fun_0831_a(a number,b number) return number is
d number;
begin
d:=a+b;
return d;
end;

declare
a number:=&值1;
b number:=&值2;
c number;
begin
c:=fun_0831_a(a,b);
dbms_output.put_line(c);
end;

select fun_0831_a(12,12) from dual;

create or replace procedure pro_0831_a(a number,b number) is
v number;
begin
v:=a*b;
dbms_output.put_line(v);
end;

begin
pro_0831_a(&数1,&数2);
end;

call pro_0831_a(&数1,&数2);

包 package

定义:根据业务逻辑,将游标,函数,存储过程放到一起,形成一个整体来实现某一个或者多个功能。

包声明的方法(包的头部)

create or replace package 包名 is
变量,常量,函数,过程,游标等
end;

包身创建方式

create or replace package body 包名 is
存储过程,函数
end;

调用包

1.调用包中过程
call 包名.过程名();

2.调用包中函数
select 包名.函数() from 表名;

begin
过程();
变量:=函数();
end;

例题:输入两个任意数,用函数返回两数之和,用存储过程打印两数之积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
----声明包头
create or replace package pack_0831_a is
function fun_0831_a(a number,b number) return number;
d number;

procedure pro_0831_a(a number,b number);
v number;
end;

-----声明包身
create or replace package body pack_0831_a is
function fun_0831_a(a number, b number) return number is
d number;
begin
d := a + b;
return d;
end;
procedure pro_0831_a(a number, b number) is
v number;
begin
v := a * b;
dbms_output.put_line(v);
end;
end;


----调用
select pack_0831_a.fun_0831_a(12,12) from dual;
call pack_0831_a.pro_0831_a(12,12);

select fun_0831_a(12,12) from dual;--没有写包的前缀,找不到此函数



declare
e number;
begin
e := pack_0831_a.fun_0831_a(12,12);
dbms_output.put_line(e);
pack_0831_a.pro_0831_a(12,12);
end;

注意

注意点:
1.包内允许过程或函数重名,但入参出参必须有区别
2.包与身体名称要相同,里面的过程或函数名称要对应。
3.包名不能直接调用,需要点出要点用的具体是那个过程/函数。