博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle PL/SQL之IN OUT NOCOPY
阅读量:6806 次
发布时间:2019-06-26

本文共 2068 字,大约阅读时间需要 6 分钟。

  hot3.png

Suppose a subprogram declares an IN parameter, an OUT parameter, and an IN OUT parameter. When you call the subprogram, the IN parameter is passed by reference. That is, a pointer to the IN actual parameter is passed to the corresponding formal parameter. So, both parameters reference the same memory location, which holds the value of the actual parameter.

By default, the OUT and IN OUT parameters are passed by value. That is, the value of the IN OUT actual parameter is copied into the corresponding formal parameter. Then, if the subprogram exits normally, the values assigned to the OUT and IN OUT formal parameters are copied into the corresponding actual parameters.

 

当我们声明一个参数是IN类型时,进行传参是将传给该参数一个实参的指针;

当我们声明一个参数是OUT或者IN OUT类型时,进行传参是将传给该参数一个实参的拷贝;

只有当程序正常结束时,赋给OUT或者IN OUT类型参数的值才会返回(除非使用了NOCOPY)。

将NOCOPY应用在传递数据量很大的参数(such as collections, records, and instances of object types)时,可起到优化性能的作用。

当参数是OUT或者IN OUT类型时:没有NOCOPY=按值传递(ByVal);加上NOCOPY=按引用传递(ByRef)。

 

Test Code:

 

DECLARE  l_1 NUMBER := 10;  l_2 NUMBER := 20;  l_3 NUMBER := 30;  PROCEDURE test_out  (    p1 IN NUMBER   ,x1 IN OUT NUMBER   ,x2 IN OUT NOCOPY NUMBER  ) IS  BEGIN    x1 := p1;    dbms_output.put_line('inside test_out, x1=' || x1);    x2 := p1;    dbms_output.put_line('inside test_out, x2=' || x2);    raise_application_error(-20001, 'test NOCOPY');  END;BEGIN  dbms_output.put_line('before, l_1=' || l_1 || ', l_2=' || l_2 ||                       ', l_3=' || l_3);  BEGIN    --the OUT parameter has no value at all until the program terminates successfully,    --unless you have requested use of the NOCOPY hint    test_out(l_1, l_2, l_3);  EXCEPTION    WHEN OTHERS THEN      dbms_output.put_line('SQLCODE => ' || SQLCODE || ', SQLERRM => ' ||                           SQLERRM);  END;  dbms_output.put_line('after, l_1=' || l_1 || ', l_2=' || l_2 || ', l_3=' || l_3);END;

 

Output:

 

before, l_1=10, l_2=20, l_3=30inside test_out, x1=10inside test_out, x2=10SQLCODE => -20001, SQLERRM => ORA-20001: test NOCOPYafter, l_1=10, l_2=20, l_3=10

 

Ref:

原文链接:

转载于:https://my.oschina.net/dtec/blog/46720

你可能感兴趣的文章
当linux找不到eth0时
查看>>
[转] HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换
查看>>
java反射
查看>>
用Chrome 浏览器调试移动端网页 chrome://inspect/#devices
查看>>
js中页面加载完成后执行的几种方式及执行顺序
查看>>
移动端 --- 布局
查看>>
关于Myeclipse自带JDK与本机安装JDK的的区别
查看>>
$(document) 和 $(e.target)实现div的显示和隐藏
查看>>
转 Python多版本管理-pyenv
查看>>
C#异步编程
查看>>
html5,表单的综合案例
查看>>
tableView
查看>>
git 入门 1
查看>>
BZOJ1432: [ZJOI2009]Function
查看>>
CSMA/CD工作原理
查看>>
Torch7在Ubuntu下的安装与配置
查看>>
铁大好青年一队绩效评价
查看>>
Markdon 作图语法 CSDN
查看>>
超越最常用的快捷键
查看>>
GYOJ_1812_股票(stock)
查看>>