加入收藏 | 设为首页 | 会员中心 | 我要投稿 上饶站长网 (https://www.0793zz.com.cn/)- 数据库平台、视觉智能、智能搜索、决策智能、迁移!
当前位置: 首页 > 站长百科 > 正文

oracle中的创建过程,函数,包

发布时间:2021-03-16 13:15:14 所属栏目:站长百科 来源:网络整理
导读:一、创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块。存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次。命名块可以多次使用。 ? 创建存储过程的语法: crea

一、创建存储过程

存储过程是在oracle中存取完成特定业务逻辑的代码块。存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次。命名块可以多次使用。

?

创建存储过程的语法:

create [or replace] procedure 存储过程的名称(参数名[in/out/inout] 参数类型,参数名...)]

is/as?

变量声明部分

begin

业务逻辑处理部分

exception

异常处理部分

end;

注意:

1、存储过程名称一般以pro_开头。

2、存储过程可以没有参数,如果没有参数不用加()。

3、过程的参数分三种,入参in出参out出入参inout如果不写,默认是in。通过定义多个出参过程可以返回多个参数。

4、过程或者函数的参数定义类型的时候,不能有精度。

例子:使用plsql声明一个存储过程,传一个员工编号的参数,返回员工的姓名和基本工资。

 1 我们可以使用匿名块调用存储过程:
 2 -- 创建存储过程 输入员工编号 返回员工姓名 基本工资
 3 create or replace procedure pro_emp_test(v_empno number,v_ename
 4 out varchar2,v_sal out number)
 5 is
 6 --变量声明部分
 7 begin
 8 --业务逻辑处理部分
 9 select ename,sal into v_ename,v_sal from emp where empno=v_empno;
10 end;--匿名块中调用存储过程
11 declare
12 -- 声明参数用来接收出参
13 v_ename emp.ename%type;
14 v_sal emp.sal%type;
15 begin
16 --调用存储过程
17 pro_emp_test(7369,v_ename,v_sal);
18 -- 调用过程之后 v_ename 和v_sal就有值了 可以打印结果
19 dbms_output.put_line(‘员工姓名:‘||v_ename||‘员工基本工资:‘||v_sal);
20 end;

二、创建函数

创建函数和过程非常类似

语法:

create [or replace] function 函数名[(参数名1[in/out/inout] 参数类型...)]

return 返回值的类型

as/is

变量声明部分

begin

业务逻辑处理部分

return 变量/常量

exception

异常处理部分

end;

注意:同形参类型一样,返回值类型不能有精度

例子:创建一个函数,返回0到10之间的一个随机整数

?

 1 调用函数一般使用匿名块:
 2 create or replace function fun_random return number
 3 is
 4 -- 声明随机数变量
 5 v_num number(5);
 6 begin
 7 --获取0到10之间的一个随机数
 8 v_num:=trunc(dbms_random.value(0,10));
 9 return v_num;
10 end;
11 --通过匿名块调用函数
12 declare
13 -- 声明变量接收函数的返回值
14 v_num number(5);
15 begin
16 -- 调用函数
17 v_num:=fun_random();
18 --打印结果
19 dbms_output.put_line(‘随机数:‘||v_num);
20 end;

?

三、创建包

在开发中,如果业务逻辑比较复杂,需要定义很多过程或者函数。有可能需要定义几十个过程或者函数,这些过程或者函数如果都放到一起,不好管理,一般使用包来管理过程或者函数,一个包中可以定义多个函数或者过程。

?

一个包包括包和包体,需要同时定义包和包体,这种写法类似于java中的接口和接口的实现。包相当于接口,包体相当于接口的实现类。

?

创建包的语法:

create [or replace] package 包名 is

-- 声明常量

-- 声明函数或者过程,但是不能有实现

end;

?

创建包体的语法:

create [or replace ] package body 包名 is

-- 包的实现

end;

例子:定义包,计算圆的面积

定义包:

1 -- 定义包 计算圆的面积
2 create or replace package pac_area is
3 -- 定义pi常量
4 v_pi constant number(5,2):=3.14;
5 --定义计算圆的面积的过程,打印圆的面procedure pro_area(v_r number);
6 --定义一个获取圆的面积的函数
7 function fun_area return number;
8 end;

?

创建包体:

 1 -- 定义包体,用来实现包
 2 create or replace package body pac_area is
 3 --把面积参数定义成包体的成员变量,这样函数也可以使用这个变量
 4 v_area number(5,2);
 5 -- 实现过程
 6 procedure pro_area(v_r number) is
 7 begin
 8 v_area:=v_pi*v_r*v_r;
 9 dbms_output.put_line(‘圆的面积是:‘||v_area);
10 end;
11 --实现函数,注意,调用该函数前,一定要先调用过程
12 function fun_area return number ibegin
13 return v_area;
14 end;
15 end;调用包中的过程或者函数,在函数或者过程前加上包名就可以了:
16 --使用匿名块调用包中的过程和函数
17 declare
18 v_area number(5,2);
19 begin
20 -- 调用打印圆的面积的过程
21 pac_area.pro_area(2);
22 -- 调用获取圆的面积的函数
23 v_area :=pac_area.fun_area();
24 dbms_output.put_line(‘函数计算的圆的面积是:‘||v_area);
25 end;

?

四、管理 过程、函数、包

删除:

drop procedure 过程名;

drop function 函数名;

drop package 包名;

查询oracle中定义的包,函数,过程从user_source 表查找。

select * from user_source where type=‘PACKAGE BODY‘ and name = ‘PAC_AREA‘;

?

五、面试题

一、过程和函数什么时候用

过程一般用于返回多个参数,函数一般用户返回一个参数。

二、在pl/sql中 包的作用是什么

包的作用 封装,方便管理过程和函数。

(编辑:上饶站长网)

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

    热点阅读