PL/SQL过程和函数以及参数

PL/SQL过程和函数

PL/SQL中过程和函数设计的目的就是为了将代码模块化,有效的管理代码。

我写这篇文章的目的是为了在我阅读《Oracle.PL.SQL程序设计》一书是做些笔记,并分享给其他同学。


过程

我们可以把过程理解为一个或者多个动作的集合,我们可以像是调用PL/SQL中可执行语句一样来调用过程。下面来介绍一下过程的格式。

procedure [scheam.]name[(parameter)]  --scheam 可选 默认为当前用户名,如果当前用户具有权限,也可以为其他模式创建过程。
  [AUTHID DEFINER|CURRENT_USER] --AUTHID 可选 设置了当前过程的运行权限,定义者|当前用户
IS
  [declaration statement]
BEGIN
  executable statement
[EXCEPTION
  EXCEPTION HANDLERS
]

END [NAME];

下面我写了一个批量设置员工工资的过程

CREATE OR REPLACE PROCEDURE EDIT_SALARY(in_year in NUMBER,per in BINARY_DOUBLE)
IS
CURSOR  ALL_EMP IS SELECT hiredate,sal,empno FROM EMP where GET_YEAR(EMP.HIREDATE) < in_year;
BEGIN

        for cur_emp in ALL_EMP
          LOOP
            UPDATE EMP set sal =  cur_emp.sal *(1+ per) where empno = cur_emp.empno;
          end LOOP;
  end EDIT_SALARY;

首先我为这个存储过程设置了两个参数,in_year 的含义为入职年份早于此年份则可以涨工资,per 的含义为涨工资的比率是多少。
之后我声明了一个游标,取出了emp表附和可以涨工资年份的员工的信息。GET_YEAR(EMP.HIREDATE) 是一个函数,我将在下面介绍函数时讲解。
最后在执行单元中遍历游标,设置每个员工的新工资。

我们调用一个过程时,当这个过程没有参数可以这样写: “procedure_name;”不需要加上()。
在存储过程的结尾 end [name]; name 虽然是可选的,但是可以提升代码的可读性。

函数

在调用函数时更像是一种类似调用表达式的语句,他只能作为可执行语句的一部分,函数必须有RETURN的设置,提供了返回参数的功能。当然,我们也可以设置更多的RETUEN以满足我们函数的需求。
下面介绍一下函数的结构

FUNCTION [SCHEAM.]NAME[(PARAMETERS)]
      RETURN return_datatype     --设置了返回值类型。
  [AUTHID DEFINER | CURRENT_USER]
  [DETERMINISTIC]        --保留函数返回值,查询优化器可以决定直接使用结果还是重新执行
  [PARALLEL_ENABLE..]   --当函数在select语句中,可以并发执行
  [PIPELINED] --结果通过pipe row 多次返回
  [RESULT_CACHE ...] --将输入值和返回值都保存在缓存中
IS
  [declaration statement]
BEGIN
  executable statement
[EXCEPTION
  EXCEPTION HANDLERS
]

END [NAME];

在上一个过程中,我们用到了一个函数,在这里我们来一起看一下

create or replace function get_year(in_date IN DATE)
RETURN CHAR
IS
       return_year char(4,char);
BEGIN
   return_year:=substr(to_char(to_date(in_date),'yyyy-MM-dd'),0,4);
   RETURN return_year;
END get_year;

首先我们创建一个函数,并且有一个输入参数,类型为日期类型,返回值是一个char类型。在执行单元首先我们设置了日期的格式,并将它设置为字符串,然后使用substr截取年份部分并返回。

参数

不论过程还是函数,都需要参数作为由外部传递数据的载体,参数的定义和声明变量十分相似,但是不同的是参数具有传递性,而且参数是不受声明限制的。

DECLEARE
    my_variable  VARCHAR2(10);
function my_function(paramater IN VARCHAR) RETURN VARCHAR

这里可以看出,参数的定义不可以对其进行约束(将varchar后对长度的约束去掉)。

在PL/SQL中参数一共有三种模式
- IN 只可以被读取
- OUT 只可以被写入
- IN OUT 即可以被读取也可以被写入。

IN 参数模式

IN参数模式是只读的,可以把它理解为一个常量,它只是将数据传递给过程内部,并不负责将数据传递出去,并且IN模式是参数的缺省模式,当一个参数没有指定参数模式时,我们默认它就是IN模式的。

OUT 参数模式

OUT参数模式和IN模式相反,你可以通过这个参数模式将数据传递给调用者。在程序内部,out参数更像是一个没有被初始化的变量,我们只能写入一些数据,但是不能读出一些什么。在使用OUT参数模式要注意,我们不能把out参数赋值给其他甚至是他自己;我们不能为out参数提供默认值,只能在程序内部设置它的值;out参数的实参必须是一个变量,不能是常量,表达式等。我们为OUT参数赋值时,其实都是在对一个PL/SQL程序内裤创建的副本进行操作,当程序返回到调用者部分时,才会将副本中的值返回给真正的OUT参数。

IN OUT 参数模式

IN OUT 即可以被读取也可以被写入,同样的,他也不能被设置默认值,而且它的实参也必须是一个变量,除此之外就没什么要求了。

形参和实参的关联

关联方式有两种,其一时位置关联,其二是命令关联。

 function get_year(in_date IN DATE , in_varchar varchar2)
-----------------------------------------------------------------
get_yaer(date,‘asdasd’);

上面的方式就是依靠参数的位置来关联,date指向第一个参数in_date,像是这样的。

 function get_year(in_date IN DATE , in_varchar varchar2)
-----------------------------------------------------------------
get_yaer(in_date =>> date ,in_varchar =>> ‘asdasd’);

这种方式就是命令表示法,依靠 =>>指明关联关系。

这两种关联方法可以混用,在一次调用中可以用两种不同的关联方法指明参数,但是值得注意的是,一旦使用了命令关联,则后面的参数就不能使用位置关联表示了。

NOCOPY

之前我们提到过,OUT,INOUT参数模式,我们在程序中为这类参数赋值时,实际上是在对PL/SQL程序生成的参数的副本进行操作,但当我们操作一些集合等体积较大的数据时会影响我们的效率,所以可以使用NOCOPY来该县这种情况。

IN参数的缺省值

上面提到的OUT,INOUT参数模式 不能由缺省值,所以这里显示一下IN参数的缺省值

function get_year(in_varchar varchar2 := ‘asdad’)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值