认识FUNCTION,PROCEDURE,PACKAGE

我们先来了解一下Oracle中FUNCTION,PROCEDURE,PACKAGE分别是什么,有什么作用。

1. FUNCTION
  • 函数用于计算和返回一个结果值,把经常需要进行的计算写成函数,函数的调用是表达式的一部分。
  • 只在创建时进行编译,以后每次执行函数都不需要重新编译。
  • 函数必须有一个返回值,而过程没有做强制的规定。
  • RETURN在声明部分需要定义一个返回参数的类型,而在函数体中必须有一个RETURN语句。如果函数结束时还没有遇到返回语句,就会发生错误。
2. PROCEDURE
  • 只在创建时进行编译,以后每次执行存储过程都不需再重新编译。
  • 当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3. PACKAGE
  • PACKAGE可以将存储过程分门别类,且可以在包内定义公共变量及类型,供包内存过使用

FUNCTION,PROCEDURE,PACKAGE的区别

  • 标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。
  • 有无返回值不同。函数中有且必须有一个返回值,而存过中没有返回值。
  • 类型说明不同。因为函数需要返回值所以需要给函数设置类型说明,但存过中没有。
  • 调用方式不同。函数的调用可以出现在表达式中,但存过必须单独调用
  • 而PACKAGE则与FUNCTIONS和PROCEDURES可以说完全没有关系,他只是函数与存过的一个集合容器

FUNCTION,PROCEDURE,PACKAGE的创建

FUNCTION的基本结构创建

Oracle函数包含三部分:函数声明,执行部分,返回的参数
简单的基本结构可以使用工具PL\SQL创建,File->New->Program Window->Function。输入函数名,以及参数,就能自动生成。

create or replace function dayTime(time in date) return varchar2 is
  FunctionResult varchar2;
begin
  //这里写业务逻辑
  return(FunctionResult);
end dayTime;
  • 以上示例中,用PL\SQL创建了一个名为DAYTIME的函数time是参数,in表示入参,date是参数类型,然后定义了类型为varchar2的返回参数FunctionResult。
  • SQL只能调用带有输入参数,不能带有输出,输入输出函数。
  • SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句。
PROCEDURE的基本结构创建

Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常(可写可不写,要增强脚本的容错性和调试的方便性那就写上异常处理)
简单的基本结构可以使用工具PL\SQL创建,File->New->Program Window->Procedure。输入过程名,以及参数,就能自动生成。

create or replace procedure demo(param in number,total out number) is
begin
	//在这里写业务逻辑
exception
	where others then
		rollback;
end demo;
  • 在以上的示例中,用PL\SQL创建了一个名为demo的存储过程,同时补充了exception部分(PL\SQL不会创建exception部分),当出现异常时,进行rollback处理。
  • 其中的参数(无参存过就是去掉"()"的部分)
  • IN表示输入参数,参数默认为IN
  • OUT表示输出参数,在过程内部赋值,返回给调用它的过程
PACKAGE的基本结构创建

当我们用PL\SQL创建PACKAGE时,发现有PACKAGE还有一个Package body。分别是File->New->Program Window->Package和File->New->Program Window->Package body。创建之后,示例如下

//这里创建的是package
create or replace package test is

  -- Author  : KEVIN
  -- Purpose : demo
  
  -- Public type declarations
  type <TypeName> is <Datatype>;
  
  -- Public constant declarations
  <ConstantName> constant <Datatype> := <Value>;

  -- Public variable declarations
  <VariableName> <Datatype>;

  -- Public function and procedure declarations
  function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;

end test;
//这里创建的是package body
create or replace package body test is

  -- Private type declarations
  type <TypeName> is <Datatype>;
  
  -- Private constant declarations
  <ConstantName> constant <Datatype> := <Value>;

  -- Private variable declarations
  <VariableName> <Datatype>;

  -- Function and procedure implementations
  function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is
    <LocalVariable> <Datatype>;
  begin
    <Statement>;
    return(<Result>);
  end;

begin
  -- Initialization
  <Statement>;
end test;

那么它们有什么区别呢?
用面向对象的说法就是PACKAGE是一个抽象类,它不具体实现方法。而PACKAGE BODY是一个私有实现类,它里面的方法只有自己能调用。