原文链接:https://www.cnblogs.com/zbj815/p/6854108.html

1、IN模式

IN模式是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。

错误例子:

 1  create or replace procedure in_proc (
2 p_a in number , -- 形参, 这里的值是调用处传递的实参
3 p_b in number
4 )as
5 begin
6 p_a := 10 ; --实参被传递进来以后,在这个程序体中值就不可能被改变了
7 p_b := 20 ;
8 DBMS_OUTPUT.PUT_LINE(p_a) ;
9 DBMS_OUTPUT.PUT_LINE(p_b) ;
10 end ;

错误日志:

1 LINE/COL ERROR
2 -------- -------------------------------------------
3 6/5 PL/SQL: Statement ignored
4 6/5 PLS-00363: 表达式 'P_A' 不能用作赋值目标
5 7/5 PL/SQL: Statement ignored
6 7/5 PLS-00363: 表达式 'P_B' 不能用作赋值目标

注意:红色区域是错误的代码,值传递到程序体中值就不会改变了。

2、OUT模式

out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递到存储过程的调用处。

错误例子:

1 create or replace procedure out_proc (
2 p_a out number , --使用OUT模式
3 p_b out number
4 ) as
5 begin
6 DBMS_OUTPUT.PUT_LINE('p_a : ' || p_a) ; --输出参数值
7 DBMS_OUTPUT.PUT_LINE('p_b : ' || p_b) ;
8 end ;

目前out_proc过程体内并没有对参数进行赋值,编写一个PLSQL块,进行验证该过程。

1 declare
2 v_a number ; --定义变量
3 v_b number ;
4 begin
5 v_a := 10 ; --为变量赋值
6 v_b := 20 ;
7 out_proc(v_a , v_b) ; --调用out_proc过程
8 end ;

可以发现此时根本没有把参数传递的值打印出来,这样就可以验证使用OUT模式不可以传值的问题。

程序修改:

 1 create or replace procedure out_proc (
2 p_a out number , --使用OUT模式
3 p_b out number
4 ) as
5 begin
6 DBMS_OUTPUT.PUT_LINE('p_a : ' || p_a) ; -- OUT模式修饰的参数是不会接收从外部过程调用处传递进来的值
7 DBMS_OUTPUT.PUT_LINE('p_b : ' || p_b) ;
8 p_a := 100 ; -- 在过程体内为参数赋值
9 p_b := 200 ;
10 end ;

编写PLSQL块验证:

 1 declare
2 v_a number ; --定义变量
3 v_b number ;
4 begin
5 v_a := 10 ;
6 v_b := 20 ;
7 out_proc(v_a , v_b) ; --调用out_proc过程
8 DBMS_OUTPUT.PUT_LINE(v_a) ;
9 DBMS_OUTPUT.PUT_LINE(v_b) ;
10 end ;

这次值被成功输出了。这就验证了前面提出的问题(out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递到存储过程的调用处)。

简单来说就是OUT不可以接收从该过程的调用处传递进来的值,只能在过程体内部对参数进行赋值,而后才能把过程体内部的值传递到该过程的被调用处。

3、IN OUT模式

IN OUT 通俗来说就表示既可以向过程体外传递参数也可以从过程体内传出数值  。

例子:

 1 create or replace procedure inout_proc (
2 p_a in out number , -- 定义形参
3 p_b in out number
4 )as
5 begin
6 DBMS_OUTPUT.PUT_LINE('传递到过程体内的 p_a : ' || p_a ) ; --打印输出过程调用出传递进来的实参
7 DBMS_OUTPUT.PUT_LINE('传递到过程体内的 p_b : ' || p_b ) ;
8 p_a := 100 ; -- 在过程体内为参数赋值
9 p_b := 200 ;
10 end ;

编写PLSQL块验该过程

 1 declare
2 v_a number ; -- 定义变量
3 v_b number ;
4 begin
5 v_a := 10 ; --为变量赋值
6 v_b := 20 ;
7 inout_proc(v_a , v_b) ; --调用inout_proc 传递实参进去
8 DBMS_OUTPUT.PUT_LINE('传递到过程体内的 v_a : ' || v_a ) ; -- 输出在过程体内被修改的值
9 DBMS_OUTPUT.PUT_LINE('传递到过程体内的 v_b : ' || v_b ) ;
10 end ;

执行结果:

1 传递到过程体内的 v_a : 10
2 传递到过程体内的 v_b : 20
3 传递到过程体内的 v_a : 100
4 传递到过程体内的 v_b : 200

IN OUT简单来说就是过程调用处传递的实参,在过程体内会被接收到。并且在过程体内为形参赋的值也会被传递到过程调用处。

PLSQL中的三种参数模式IN、OUT、IN OUT的更多相关文章

  1. VMWare中的三种联网模式图解

    网络基础及局域网配置 1.简单的局域网结构 2.VMWare中的三种联网模式 NAT模式 桥接模式 VMnet1

  2. [Swift实际操作]八、实用进阶-(2)Swift语言中的三种消息传递模式

    本文将通过响应按钮的点击事件,来演示Target-Action消息传递机制,该机制主要用于响应用户的界面操作.打开创建的空白项目.然后在左侧的项目导航区,打开视图控制器的代码文件:ViewContro ...

  3. Http中的三种请求处理模式(MPM)的区别

    MPM---包括基于事件/异步,线程化和预分叉 MPM(multi-processing module)多种请求处理模式,分为三种工作模式: prefork worker event prefork- ...

  4. 详解 Java 中的三种代理模式

    代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用 ...

  5. http请求中的三种参数类型

    1.URL参数:实际就是querry string的方式,参数拼接在url之后以?隔开,参数之间以&连接. 优点:简单,页面跳转比较快. 缺点:1.基于浏览器对urk长度有限制,不能超过204 ...

  6. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  7. 初识云计算的三种服务模式 (IaaS SaaS PaaS)

    近期公司在使用其它云服务的同一时候.要封装自己的云服务,以下作为开发产品前的热身.来了解云计算中的三种服务模式,笔者也是从网络上查找,进行综合总结.请拍.. 三种服务模式 依据如今最经常使用.也就是比 ...

  8. 三种Model模式

    目前项目中可能出现的三种Model模式,对于我们现在开发的一个项目,我觉得使用DDD的思想来设计模型比较清晰,使用DDD的思想把模型model分成了如下三种:ViewModel,它与页面相关,Doma ...

  9. .net core 注入中的三种模式:Singleton、Scoped 和 Transient

    从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...

随机推荐

  1. 助力深度学习!阿里开源可插拔 GPU 共享调度工具

    根据 Gartner 对全球 CIO 的调查结果显示,人工智能将成为 2019 年组织革命的颠覆性力量.对于人工智能来说,算力即正义,成本即能力,利用 Docker 和 Kubernetes 代表云原 ...

  2. 阿里云杨敬宇:5G时代,边缘计算将发挥更大价值

    “5G时代,边缘计算将发挥更大价值.”3月8日,阿里云边缘计算技术负责人杨敬宇向媒体表示,边缘计算作为5G时代的一项关键技术,未来将成为不可或缺的基础设施之一. 5G时代万物智联将真正成为现实,但对计 ...

  3. 陈云川的OPENLDAP系列

    前言 本 来,我应该准备一篇精彩的演说辞,从LDAP应用的方方面面讲起,细数LDAP在各种场合应用的成功案例,大肆渲染LDAP应用的辉煌前景,指出有多少机 构和组织的关键业务是建立在LDAP的基础上的 ...

  4. Hdu 3603

    Coach Yehr’s punishment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  5. WPF 触发器例子

    WPF的触发器很强大,这里简单附上触发器的一个小例子,分别用XMAL和CS代码来实现一个功能,鼠标悬停在button上时改变字体颜色 1.XMAL代码如下: <Window x:Class=&q ...

  6. 2019-8-31-dotnet-core-用值初始化整个数组

    title author date CreateTime categories dotnet core 用值初始化整个数组 lindexi 2019-08-31 16:55:58 +0800 2019 ...

  7. 【水滴石穿】react-native-book

    先推荐一个学习的地址:https://ke.qq.com/webcourse/index.html#cid=203313&term_id=100240778&taid=12778558 ...

  8. python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

    网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(meth ...

  9. JavaScript--函数对象的属性caller与callee

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Ubuntu16.04安装Caffe最全最详细教程(CPU)

    转载请附上本文链接:https://www.cnblogs.com/acgoto/p/11570188.html 一.前言 为了安装caffe,本人已经在centos7.x上试错了1次,目前弃疗~:在 ...