一、创建存储过程

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

创建存储过程的语法:

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

is/as

变量声明部分

begin

业务逻辑处理部分

exception

异常处理部分

end;

注意:

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

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

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

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

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

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

二、创建函数

创建函数和过程非常类似

语法:

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

return 返回值的类型

as/is

变量声明部分

begin

业务逻辑处理部分

return 变量/常量

exception

异常处理部分

end;

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

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

 调用函数一般使用匿名块:
create or replace function fun_random return number
is
-- 声明随机数变量
v_num number(5);
begin
--获取0到10之间的一个随机数
v_num:=trunc(dbms_random.value(0,10));
return v_num;
end;
--通过匿名块调用函数
declare
-- 声明变量接收函数的返回值
v_num number(5);
begin
-- 调用函数
v_num:=fun_random();
--打印结果
dbms_output.put_line('随机数:'||v_num);
end;

三、创建包

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

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

创建包的语法:

create [or replace] package 包名 is

-- 声明常量

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

end;

创建包体的语法:

create [or replace ] package body 包名 is

-- 包的实现

end;

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

定义包:

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

创建包体:

 -- 定义包体,用来实现包
create or replace package body pac_area is
--把面积参数定义成包体的成员变量,这样函数也可以使用这个变量
v_area number(5,2);
-- 实现过程
procedure pro_area(v_r number) is
begin
v_area:=v_pi*v_r*v_r;
dbms_output.put_line('圆的面积是:'||v_area);
end;
--实现函数,注意,调用该函数前,一定要先调用过程
function fun_area return number ibegin
return v_area;
end;
end;调用包中的过程或者函数,在函数或者过程前加上包名就可以了:
--使用匿名块调用包中的过程和函数
declare
v_area number(5,2);
begin
-- 调用打印圆的面积的过程
pac_area.pro_area(2);
-- 调用获取圆的面积的函数
v_area :=pac_area.fun_area();
dbms_output.put_line('函数计算的圆的面积是:'||v_area);
end;

四、管理 过程、函数、包

删除:

drop procedure 过程名;

drop function 函数名;

drop package 包名;

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

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

五、面试题

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

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

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

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

oracle中的创建过程,函数,包的更多相关文章

  1. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  2. 用sql语句导出oracle中的存储过程和函数

    用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' repl ...

  3. Oracle中常用的系统函数

    本文主要来梳理下Oracle中的常用的系统函数,掌握这些函数的使用,对于我们编写SQL语句或PL/SQL代码时很有帮助,所以这也是必须掌握的知识点. 本文主要包括以下函数介绍:1.字符串函数2. 数值 ...

  4. Oracle中生成随机数的函数(转载)

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

  5. oracle中110个常用函数介绍

    1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...

  6. Oracle中生成随机数的函数

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

  7. Java中对象创建过程

    本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...

  8. Oracle中如何使用REGEXP_SUBSTR函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcst ...

  9. Oracle中如何使用REGEXP_SUBSTR函数动态截取字符串

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

随机推荐

  1. C语言学习笔记之动态分配数组空间

    本文为原创文章,转载请标明出处 高级语言写多了,再拿起C语言的时候,自己已经傻了... C语言中数组大小不能为变量,即使这个变量已经被赋过值了,应该使用malloc方法进行数组空间动态分配. 如下: ...

  2. iOS(Swift)学习笔记之SnapKit+自定义UI组件

    本文为原创文章,转载请标明出处 1. 通过CocoaPods安装SnapKit platform :ios, '10.0' target '<Your Target Name>' do u ...

  3. POJ 1815 网络流之拆点(这个题还需要枚举)

    传送门:http://poj.org/problem?id=1815 题意:给N个点,已知S与T,和邻接矩阵,求拆掉那些点会减小最大流. 思路:点之间有线连接的在网络中的权值为inf,没有的就不用管, ...

  4. 阿里云服务器上搭建seafile专业版

    因为官方一键安装教程在阿里云服务器上无法安装,由于水平有限,无法解决,所以选择手动安装 参考资料: 1,.腾讯云搭建seafile服务器 2.How to Install Seafile with N ...

  5. LLDB奇巧淫技

    打印视图层级 这个相信很多人都会了,是ta是ta就是ta recursiveDescription 用法大概就是如下 123 po [self.view recursiveDescription] p ...

  6. ES:在线迁移集群索引,数据不丢失

    一.背景 生产环境由于某些原因需要跨机房迁移ES集群,或者同机房原有集群中所有节点全部更换,期间ES索引要求完整,客户端请求中断不超过五分钟. 二.应用场景 1.同机房不同集群之间数据迁移: 2.跨机 ...

  7. 【转载】(String)、toString、String.valueOf的区别

    用于个人参考,查看请前往原地址http://blog.csdn.net/springk/article/details/6414017 问题讨论http://bbs.csdn.net/topics/2 ...

  8. 安卓权威编程指南 挑战练习:实现高效RecyclerView刷新

    Adapter的notifyDataSetChanged方法会通知RecyclerView刷新全部的可见列表项. 在CriminalIntent应用里,这个方法不够高效,我们知道,返回CrimeLis ...

  9. 初识Arduino

    Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬件(各种型号的Arduino板)和软件(Arduino IDE).由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Ba ...

  10. 在高德地图上用svg.js绘制简单图形

    这段时间做的一个项目,需要在地图上绘制简单的图形.在学习高德地图JS API的过程中,发现高德地图提供的点.线等API并不能满足我的需求,还好它开放了自定义图层CustomLayer,官方说自定义图层 ...