`

Oracle 子程序参数模式,IN,OUT,NOCOPY ( 转)

 
阅读更多

Oracle 子程序参数模式主要有IN,OUT,NOCOPY,IN和OUT可以组合,OUT和NOCOPY也可以组合使用.

IN主要用于传入参数,可以是变量,常量,表达式,在子程序内部不能改变其值.

 

DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 IN NUMBER) IS
BEGIN
dbms_output.put_line(n1); -- prints 10

--n1:=20; --illegal assignment.

END;

BEGIN
do_something(n);
do_something(20);
END;

 

OUT模式用于返回值,必须传入变量调用,变量的初始的值不会传给形式参数,如<<1>>所示.

形参的值在子程序返回时(不是在形式参数改变时)才copy给实参,,如<<2>>所示,如果在返回之前发生异常,实际参数的值不会被改变.


DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 OUT NUMBER) IS
BEGIN
dbms_output.put_line('before assign: ' || n1); -- prints none <<1>>
n1:=20;
dbms_output.put_line('before return: ' || n); -- prints 10 <<2>>
END;

BEGIN
do_something(n);
dbms_output.put_line('after return: ' || n); -- prints 20
END;

 

NOCOPY模式用于限定OUT模式在调用时是不是以传引用的方式进行(它只是一个编译器暗示,不一定总是起作用),默认情况下,OUT模式的参数是以传值的方式进行调用的.

IN主要用于传入参数的,虽然n2 := 20被调用,但是要到返回的时候才生效.如<<1>>所示.

NOCOPY是传引用,会在赋值的时候立即生效,如<<2>>所示,如果在返回之前发生异常,实际参数的值也会被改变<<See exception test>>.

由于OUT参数在子程序返回的时候会将值copy到实际参数,所以调用完后n的值为20,如<<3>>所示.


DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 IN NUMBER,
n2 IN OUT NUMBER,
n3 IN OUT NOCOPY NUMBER) IS
BEGIN
n2 := 20;
dbms_output.put_line(n1); -- prints 10<<1>>
n3 := 30;
dbms_output.put_line(n1); -- prints 30 <<2>>
END;
BEGIN
do_something(n, n, n);
dbms_output.put_line(n); -- prints 20 <<3>>
END;

 

 

 

exception test:

 

DECLARE
  N NUMBER := 10;
  PROCEDURE DO_SOMETHING(N3 IN OUT NUMBER) IS
  BEGIN
    N3 := 30;
    DBMS_OUTPUT.PUT_LINE(N3);
    RAISE_APPLICATION_ERROR(-1, 'Exception ccurred!');
  END;
BEGIN
  DO_SOMETHING(N);
EXCEPTION
  WHEN OTHERS THEN
    BEGIN
      DBMS_OUTPUT.PUT_LINE('Error Code: ' || SQLCODE);
    END;
    DBMS_OUTPUT.PUT_LINE(N);
END;

分享到:
评论

相关推荐

    Oracle 子程序参数模式,IN,OUT,NOCOPY

    总结起来,Oracle 子程序参数模式IN、OUT和NOCOPY提供了灵活的数据传递机制,IN用于单向传递数据,OUT用于传出结果,而NOCOPY则是在OUT基础上尝试优化性能的一种方式,允许子程序直接修改调用者的变量。了解和正确...

    Oracle_plsql讲义:第22章 创建子程序和包.ppt

    Oracle PL/SQL 子程序和包的概念和应用 本章要点: * 理解子程序(过程、函数)及包的概念 * 掌握如何创建、执行和删除过程、函数及包的方法 * 了解形参和实参的区别以及不同参数模式的特征 * 灵活使用过程、函数...

    Oracle P/L SQL实现FTP上传、下载功能

    ac_Connection in out Nocopy Connection ); Procedure p_SendFTPCmd( ac_Connection in out Nocopy Connection, as_Command in VarChar2, as_Argument in VarChar2 Default Null, as_...

    Oracle.PL.SQL程序设计 下册

    - 子程序可以接受参数,并可以通过参数模式(IN, OUT, IN OUT)控制数据流向。 6. **游标** - 游标用于处理SQL查询结果集,通过DECLARE声明,OPEN打开,FETCH获取数据,CLOSE关闭来操作游标。 - FOR LOOP结构...

    oracle 创建wm_concat函数

    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT NOCOPY string_sum_obj, v_next IN string_sum_obj) RETURN NUMBER, -- 结束时调用的函数 MEMBER FUNCTION ODCIAggregateTerminate(self IN string_sum_obj, ...

    Oracle sdo_geometry空间坐标系转换

    geometry IN OUT NOCOPY MDSYS.SDO_GEOMETRY, from_srs_id IN NUMBER, to_srs_id IN NUMBER ) ``` - `geometry`: 需要转换的几何对象。 - `from_srs_id`: 当前几何对象所在的坐标系统ID。 - `to_srs_id`: 目标...

    Oracle_plsql基本语法笔记.txt

    标题 参数的调用(in 模式为按址调用,out / in out模式为按值调用。NOCOPY 强行转换成按址调用)。 标题 软件包及封装 软件包(PACKAGE)的建立和调用 软件包的全局结构 封装函数的纯度 标题 查看源代码及...

    计算机软件及应用应用程序结构PPT课件.pptx

    【计算机软件及应用应用程序结构】中的知识点主要围绕PL/SQL的子程序展开,包括子程序的概念、分类、优点、创建方法以及相关的参数模式。以下是详细的解释: 1. **子程序**:在PL/SQL中,子程序指的是过程和函数。...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    ac_Conn in Out Nocopy UTL_SMTP.Connection, as_Boundary in VarChar2, as_Encode in VarChar2 Default 'base64', as_SignatureLogo in VarChar2 Default Null, as_SignatureText in VarChar2 ...

    从Oracle的FORM中调用REPORT.rar

    parameter_list IN OUT NOCOPY PARAM_LIST, return_code OUT NUMBER, return_message OUT VARCHAR2); ``` 其中,`report_name`是报表的名称,`parameter_list`用于传递报表所需的参数,`return_code`和`...

    应用程序结构PPT学习教案.pptx

    - **参数模式**:参数可以是`IN`(只读)、`OUT`(只写)或`IN OUT`(读写)。 - **值传递**:参数值可以从调用者传入子程序,也可以从子程序传出。 - **异常处理**:子程序内部的异常需要在异常处理段中进行处理...

    oracle存储过程学习经典[语法+实例+调用]

    - `NOCOPY`:当参数类型为`INOUT`时,使用`NOCOPY`关键字可避免复制参数的值,从而节省内存资源。 - **权限管理**: - `AUTHID CURRENT_USER`:表示存储过程内的操作权限与当前执行用户相同。 - `AUTHID DEFINER...

    计算机软件及应用应用程序结构PPT学习教案.pptx

    在处理子程序参数时,我们需要考虑参数模式(IN、OUT、IN OUT),如何传递值,以及可能的异常处理。参数可以按值传递,此时传递的是参数值的副本,对参数的修改不会影响原始值;按引用传递时,参数变化会影响原始值...

    Oracle 中PLSQL应用优化.pdf

    通常,参数有`IN`、`OUT`和`NOCOPY`三种模式。`IN`参数只用于传入,内部无法修改;`OUT`参数用于返回值,需要传入变量;而`NOCOPY`修饰符则允许直接传递参数的地址,从而减少CPU和内存的开销。通过使用`NOCOPY`,...

    Oracle PLSQL编程最佳实践中文版

    - 在存储过程中使用OUT参数来明确指示哪些变量将用于返回值。 - **变量对应表字段**: - 变量命名应与所对应的表字段保持一致,以便于理解和维护。 - **常量使用**: - 使用常量来代替硬编码的值,增加代码的灵活...

    Oracle_PLSQL_存储过程

    - **INOUT:** 可读写参数。 - **NOCOPY:** 标志,表明参数不应被复制。 - **AUTHID:** 定义执行权限类型。 **示例:** ```sql CREATE OR REPLACE PROCEDURE sam.credit ( acc_no IN NUMBER, amount IN NUMBER...

    Oracle PLSQL调优

    **NOCOPY的作用**:即使不显式使用`IN`模式,参数也会按照地址传递。这意味着当参数大小较大时,使用`NOCOPY`可以带来明显的性能提升。 #### 三、其他高级调优技术 除了上述基本的编程技巧外,还有一些高级技术可以...

    Oracle Stream + AQ + JMS 搭建步骤

    1. 创建结构数据消息处理器:`SQL&gt; create or replace procedure enq_jms_lcr(lcr in dbms_streams.aq$_lcr, payload out nocopy dev_payload) is begin payload.table_name := lcr.object_name; payload.operation ...

Global site tag (gtag.js) - Google Analytics