一、创建存储过程

存储过程是在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. 吴裕雄--天生自然python学习笔记:Python3 数据结构

    列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能. list.append(x) 把一个元素添加到列表的结尾,相当于 a[len ...

  2. vue-cli 项目结构介绍

    感谢:https://www.jianshu.com/p/7006a663fb9f 总体框架 一个vue-cli的项目结构如下,其中src文件夹是需要掌握的,所以本文也重点讲解其中的文件,至于其他相关 ...

  3. bubble chart|Matrix Scatter|Overlay Scatter|Scatterplots|drop-line|box plot|Stem-and-leaf plot|Histogram|Bar chart|Pareto chart|Pie chart|doughnut chart|

    应用统计学 对类别数据要分类处理: Bar chart复式条形图便于对比: Pareto chart:对类别变量依据频数高低排列: Pie chart:饼图用于一个样本,可以区分类别数据 doughn ...

  4. 深入 Java 调试体系: 第 1 部分,JPDA 体系概览

    JPDA 概述 所有的程序员都会遇到 bug,对于运行态的错误,我们往往需要一些方法来观察和测试运行态中的环境.在 Java 程序中,最简单的,您是否尝试过使用 System.out.println( ...

  5. Android蓝牙----打开,关闭操作

    ① 我们先在AndroidManifest里面增加我们的Bluetooth权限 <uses-permission android:name="android.permission.BL ...

  6. 吴裕雄--天生自然 python数据分析:基于Keras使用CNN神经网络处理手写数据集

    import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mp ...

  7. find_in_set 函数的语法

    find_in_set 函数的语法: FIND_IN_SET(str,strList) str 要查询的字符串 strList 字段名,参数以“,”分隔,如(1,2,6,8) 查询字段(strList ...

  8. MyBatis之ResultMap的association和collection标签(一)

    1.先说resultMap比较容易混淆的点, 2. Map结尾是映射,Type是类型  resultType 和restltMap restulyType: 1.对应的是java对象中的属性,大小写不 ...

  9. JavaScript中的document.fullscreenEnabled

    本文主要讲述了: 什么是document.fullscreenEnabled 作用 兼容性 正文 什么是document.fullscreenEnabled document.fullscreenEn ...

  10. 先治再扶,重灾区后的P2P你还敢投吗?

    ​ 互联网强大的包容性和创新性,给予很多新生事物成长的空间.而其全面普及与快速传播的特性,也让任何事物都像被放在放大镜乃至显微镜下,几乎无形遁形.这样一来,新生事物很容易被"神化" ...