zoukankan      html  css  js  c++  java
  • Oracle过程及函数的参数模式

    一、In、out、in out模式

    在Oracle中过程与函数都可以有参数,参数的类型可以指定为in、out、in out三种模式。

    三种参数的具体说明,如下图所示:

    (1)in模式

    in模式是引用传递。调用过程时实际参数将值以引用方式传递给存储过程的形式参数,形式参数在过程中是只读模式的,也就是说:只能通过形式参数读取到实际参数的值。当过程执行完毕后,实际参数的值不会发生任何变化。

    过程:

    create or replace procedure MyProcedure(param1 in INTEGER)    --param1形式参数

    AS

    BEGIN

        ……..

    END

    调用:

    num:=100;

    MyProcedure(num);        --num 实际参数

    分析:

    实际参数num将其值100传递给过程的形式参数param1,param1的值变为100,过程执行完后返回到调用过程的语句,实际参数num的值不会发生任何变化。

    (2)out模式

    out模式是传递。调用过程的时候,形式参数会忽略实际参数的值,而被初始化为null值,形式参数是可读写的,所以在过程中形式参数的值可以被修改,过程执行完毕后,形式参数会将其值赋值给实际参数。

    过程

    create or replace procedure MyProcedure(param1 out INTEGER)    --param1形式参数

    AS

    BEGIN

        DBMS_OUTPUT.PUT_LINE(param1);    --param1为null

        param1:=1;                --修改param1的值为1

    END

    调用:

    num:=100;

    MyProcedure(num);        --num 实际参数

    分析:

    实际参数并不能将其值传给过程的形式参数,相反过程的形式参数的初始值为null,等过程执行完后param1的值变为1,过程返回时将形式参数的值赋值给实际参数,所以num的值从100变为了1;

    (3)in out模式

    in out模式是传递的。调用过程的时候,实际参数的值会以值传递的方式赋值给形式参数,在过程中形式参数的值可以被修改,等过程执行完毕后,形式参数又会将其值赋值给实际参数。

    过程:

    create or replace procedure MyProcedure(param1 in out INTEGER)    --param1形式参数,能接受实际参数传来的值

    AS

    BEGIN

        DBMS_OUTPUT.PUT_LINE(param1);    --param1为null

        param1:=1;

    END

    调用:

    num:=100;

    MyProcedure(num);        --num 实际参数

    分析:

    实际参数num将其值100传递给过程的形式参数param1,param1的值初始化为100,过程执行中param1的值变为1,等过程执行完毕返回时又将形式参数param1的值赋值给了实际参数num,所以num的值从100变为了1;

    将字面值或常量当作实际参数,由于存在值的复制。所以与out或in out模式的形式参数相关联的实际参数必须是一个变量,而不能是一个常量或表达式。必须有一个可以存储返回值的位置。

    out模式和in out模式的主要区别就是:in out模式能将实际参数的值传递给过程的形式参数,out模式的形式参数的初始值只能为null。

    二、传值和传引用

    默认情况下,PL/SQL的in模式为传值方式,ou、in out模式为传引用方式。

    引用传递的方式效率比较高,传递大型PL/SQL数组时表现尤为突出。

    NOCOPY提示

    ·in模式总是以引用方式传递参数,所以不允许在in模式上使用NOCOPY提示;

    ·out、in out模式可以通过NOCOPY关键字来告诉PL/SQL编译器采用引用方式来传递参数值;NOCOPY只是一个编译器提示,而不是编译指令,所以它并不是总是有效;

    ·以下几种情况会忽略NOCOPY的存在,如下图所示:

  • 相关阅读:
    Linux和Docker常用命令
    学习docker on windows (1): 为什么要使用docker
    使用xUnit为.net core程序进行单元测试(4)
    使用xUnit为.net core程序进行单元测试(3)
    高效地使用搜索引擎
    充分条件和必要条件
    上海全球“编程一小时”活动记
    C#.NET股票历史数据采集,【附18年历史数据和源代码】
    R学习笔记 ---- 系列文章
    平方根的原理
  • 原文地址:https://www.cnblogs.com/peach/p/1500242.html
Copyright © 2011-2022 走看看