PLSQL中的三种参数模式IN、OUT、IN OUT
原文链接: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的更多相关文章
- VMWare中的三种联网模式图解
网络基础及局域网配置 1.简单的局域网结构 2.VMWare中的三种联网模式 NAT模式 桥接模式 VMnet1
- [Swift实际操作]八、实用进阶-(2)Swift语言中的三种消息传递模式
本文将通过响应按钮的点击事件,来演示Target-Action消息传递机制,该机制主要用于响应用户的界面操作.打开创建的空白项目.然后在左侧的项目导航区,打开视图控制器的代码文件:ViewContro ...
- Http中的三种请求处理模式(MPM)的区别
MPM---包括基于事件/异步,线程化和预分叉 MPM(multi-processing module)多种请求处理模式,分为三种工作模式: prefork worker event prefork- ...
- 详解 Java 中的三种代理模式
代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用 ...
- http请求中的三种参数类型
1.URL参数:实际就是querry string的方式,参数拼接在url之后以?隔开,参数之间以&连接. 优点:简单,页面跳转比较快. 缺点:1.基于浏览器对urk长度有限制,不能超过204 ...
- IOS开发之自定义Button(集成三种回调模式)
前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...
- 初识云计算的三种服务模式 (IaaS SaaS PaaS)
近期公司在使用其它云服务的同一时候.要封装自己的云服务,以下作为开发产品前的热身.来了解云计算中的三种服务模式,笔者也是从网络上查找,进行综合总结.请拍.. 三种服务模式 依据如今最经常使用.也就是比 ...
- 三种Model模式
目前项目中可能出现的三种Model模式,对于我们现在开发的一个项目,我觉得使用DDD的思想来设计模型比较清晰,使用DDD的思想把模型model分成了如下三种:ViewModel,它与页面相关,Doma ...
- .net core 注入中的三种模式:Singleton、Scoped 和 Transient
从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...
随机推荐
- 模拟21 题解(waiting)
留坑待填 效率!!! 题还没改Oh,NO!!!
- Hadoop 无法启动的问题
最近乱搞把本来就快要挂了的hdfs又给弄坏了.问题如下, 应该是节点没有启动. [hadoop@namenode hadoop]$ hadoop dfsadmin -report Configured ...
- cmd操作oracle
利用cmd的操作命令导出,详情如下(备注:方法二是转载网上的教程):1:G:\Oracle\product\10.1.0\Client_1\NETWORK\ADMIN目录下有个tnsname.ora文 ...
- awss3
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...
- js日历
html部分 <div class="div"> <p><span onclick="syn()">上一年</span ...
- 小爬爬4:12306自动登录&&pyppeteer基本使用
超级鹰(更简单的操作验证) - 超级鹰 - 注册:普通用户 - 登陆: - 创建一个软件(id) - 下载示例代码 1.12306自动登录 # Author: studybrother sun fro ...
- 用Sketch和PaintCode快速得到绘制代码
http://www.cocoachina.com/ios/20150901/13155.html 作者:codeGlider 授权本站转载. 在我的上一篇文章中 swift10分钟实现炫酷的导航控制 ...
- Flask学习之七 单元测试
英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing 中文翻译地址:http ...
- python 检测目录
#!/usr/bin/env python# -*- coding:utf-8 -*-import osimport win32fileimport win32con ACTIONS = { 1 : ...
- js中setInterval与setTimeout用法 实现实时刷新每秒刷新
setTimeout 定义和用法: setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式. 语法: setTimeout(code,millisec) 参数: ...