原文链接: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. Listview的条目item内的点击响应事件

    还是这张图 这里的历史列表就是一个ListView,抛开该界面中ScrollView或者RecycleView与该ListView会有冲突,所谓的冲突,说白了就是父控件与子控件两者间的关系冲突,该冲突 ...

  2. DOM 事件监听 事件冒泡 事件捕获

    addEventListener() 方法 实例: // 当用户点击按钮时触发监听事件: document.getElementById("myBtn").addEventList ...

  3. web前端学习(四)JavaScript学习笔记部分(4)-- JavaScriptDOM对象

    1.Javascript-DOM简介 1.1.HTML DOM 1.2.DOM操作HTML 1.2.1.JavaScript能够改变页面中的所有HTML元素 1.2.2.JavaScript能够改变页 ...

  4. listView中的button控件获取索引

    1.在listitem中初始化button的时候,给该button添加一个setTag方法,将此时的索引值传进去,然后在button的onclick事件中调用view的getTag方法,即可将list ...

  5. django的admin后台管理

    Admin后台管理 要进入admin后台管理首先要创建管理员账户 createsuperuser 其中密码要大于8位 使用之前要到应用下的admin.py中注册要管理的模型表 from django. ...

  6. (实现)vue.js最简实现

    Vue.winward.js vue.js最简实现(the most simple vue.js) 让所有人都看得懂Vue原理 建议看完Vue.winward.js后,结合mpvue源码解读单页应用路 ...

  7. Future Maker | 领跑亚太 进击的阿里云数据库

    7月31日,阿里云马来西亚峰会在吉隆坡召开,阿里巴巴集团副总裁.阿里云智能数据库事业部总裁李飞飞在演讲中表示:“作为亚太地区第一的云服务提供商,阿里云数据库已为多家马来西亚知名企业提供技术支持,助力企 ...

  8. 【转】MySQL的btree索引和hash索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...

  10. ajax请求与form表单提交共存的时候status为canceled

    chrome浏览器调试,发现,status竟然是canceled状态 网上总论: 1.在URL变更后,会对当前正在执行的ajax进求进行中止操作.中止后该请求的状态码将为canceled 2.在使用到 ...