• [Oracle整理]Oracle之Procedure参数类型


    说明:本内容是工作用到的知识点整理,来自工作中和网络。
    代码于Oracle9上测试。

    OracleProcedure参数类型

    一.实参与形参

    形参:procedure定义的时候,宣告的参数

    实参:在引用procedure的时候,从外部传入(出)的参数

    形参是实参值的预留位置,实参的值是被用在procedure中的值。

    在程序内,实参会借由形参来参照,当程序传回时,形参的值会被指定给实参。

    二.形参的三种模式(IN OUTIN OUT

    IN当程序被呼叫时,实参的值会被传入procedure中。 在程序内部,形参就像PL/SQL常数一样,是只读的,不能更改。当程序结束,且控制权传回给进行呼叫的环境时,实参值不会被改变。

    OUTprocedure被呼叫时,任何实参的值都会被忽略。在procedure内,形参就像是未被初始化PL/SQL参数,因此具有NULL值。它可以被读取写入。当procedure结束且控制权交给进行呼叫的环境时,形参内容就会被指定给实参。

    IN OUT此模式是INOUT的结合。当procedure被呼叫时,实参值被传递到procedure内。在procedure内,形参就像是已经被初始化的变量,可以被读取写入。当procedure结束且控制权传回给呼叫的环境时,形参的内容就会被指定给实参。

    三.测试

    测试OUT

    1 Create Procedure

    create or replace procedure putNum(P_Date in date, P_year out varchar2) is
      v_num  number(8) := 1;
      v_days number;
      v_date date;
    begin
      dbms_output.put_line('intput value:' || P_year);
      v_num  := 1;
      v_days := 1;
      v_days := to_number(to_char(P_Date, 'dd')); -- to_char(sysdate-20,'dd')
      for i in 1 .. v_days Loop
        v_date := to_date('2011/11/' || to_char(i), 'yyyy/MM/dd');
        --dbms_output.put_line(v_date);
      end loop;
      P_year := '2012';
    end;

    2 TestScript

    declare
      v_yy varchar2(4);
    begin
      v_yy := '2010';
      putnum(sysdate, v_yy);
      dbms_output.put_line('Output value:' || v_yy);
    end;

    3 执行结果

    4 分析

    使用in传入参数,实参的值被忽略——不会使用传入参数的值。所以输入为空。形参的值是NULL。编译器认为没初始化。

    测试IN OUT

    1 上面的putNum(P_Date in date, P_year out varchar2) is 改为:

    putNum(P_Date in date, P_year in out varchar2) is

    2 输出结果

    四.总结

    1 形参的三种模式:in , out, in out。默认是in

    2 一个函数需要返回一个值并且需要DML时(commit时,需使用自治事务),可以考慮OUTIN OUT

    Oracle Procedure 參數传递方式

    以传址和传值方式传递参数

    当参数是以传址(By Reference)方式传递时,指向实参的指针就会被传递给相对应的形参。

    当参数是以传值(By Value)方式传递时,它就会从实参复制到形参中。

    预设PL/SQL会以传址方式传递IN参数,以传值方式传递OUTIN OUT参数。

    使用NOCOPY编译器指示:

    语法:procedure procedure_name (parameter_name [mode] NOCOPY datatype)

    说明:parameter_name---->参数名称

    mode                 ----->参数模式(IN / OUT / IN OUT

    datatype           ------>参数的数据类型

    NOCOPY         ------->NOcopy出现,PL/SQL编译器就会尝试传地址方式来传递参数,而不是用传值的方式。

    限制:

    在某些情况下,NOCOPY会被忽略,而参数还是会以传值的方式传递。

    在这些情况下,不会有错误产生。

    请记住,NOCOPY是个指示,编译器没义务遵循它。

    在以下情况会被忽略:

    1.实参是组合阵列的成员。当实参为这个阵列时,此限制条件不适用

    2.实参被精确度准确度、或者NOT NULL限制条件所限制时。但是此限制对于由最大长度所限制的字元参数不适用。

    3.实参和形参都是记录,且它们是被内隐的作为循环控制的变量,或者是使用%ROWTYPE来宣告,在对应栏位上的限制不同。

    4.传递实参需要有内隐的数据类型转换

    5.副程式牵涉到远端程序呼叫RPC)。由于参数必须在网络上传递,所以要用传址方式来传递它们是不可能的。

    效能:

    在所需时间上,以传值方式传递IN OUT参数,会远远大于以传址方式传递IN IN OUT NOCOPY参数。

    人的一生应该这样度过:当他回首往事的时候,不会因为虚度年华而悔恨,也不会因为碌碌无为而羞愧。
  • 相关阅读:
    C++11的enum class & enum struct和enum
    c++11 中成员变量初始化的顺序
    c++11 lambda
    Java-NIO
    .Net之路(十五)图解LoadRunner压力測试
    activiti入门3排他网关,并行网管,包括网关,事件网关
    [移动端]移动端上遇到的各种坑与相对解决方式
    《软件调试艺术》读后感四
    [C++设计模式] command 命令模式
    iOS学习笔记23-音效与音乐
  • 原文地址:https://www.cnblogs.com/htht66/p/2346745.html
Copyright © 2020-2023  润新知