PLSQL中的三种参数模式IN、OUT、IN OUT

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简单来说就是过程调用处传递的实参,在过程体内会被接收到。并且在过程体内为形参赋的值也会被传递到过程调用处。

初学理解太浅请指出错误!

时间: 2024-10-12 09:28:27

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

详解 Java 中的三种代理模式

代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.      这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法.      举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎

详解 Java 中的三种代理模式!

作者:岑宇 https://www.cnblogs.com/cenyu/p/6289209.html 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法. 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的

VMware中的三种网络模式-----Host-only模式

3.Host-only模式(仅主机模式) Host-only模式:是一种封闭的网络模式,虚拟机只能与宿主机通过VMnet1进行通信.这种模式适合于在一个独立的环境中进行各种网络实验.这种模式与NAT模式的区别是没有地址转换服务,虚拟机只能访问到宿主机. 下面是一个关于Host-only使用的例子: ①虚拟机中编辑网络模式,选择Host-only模式: ②将虚拟机中网络连接的IP地址设置为: ③宿主机的VMnet1的网络连接IP设置为: ④网络拓扑图: 虚拟机通过VMNet1与宿主机进行通讯,但不

Java中的三种工厂模式

/** * 设计模式之工厂模式,用户创建对象的,通过工厂模式来降低代码的耦合度 * @author  */ //简单工厂模式 public class SimpleFactory{        /**     * 根据不过的String参数 name返回不同的汽车对象name     * @param name     * @return     */    public Car getCar(String name){                /*         * 利用equals

Vmware中的三种网络模式

安装好 VMware workstation 后,在物理机的网络连接里面你可以看到多了两块网卡: VMnet1 是虚拟机Host-only模式的网络接口 VMnet8 是虚拟机 NAT 模式的网络接口 1.桥接模式(Bridged) 桥接模式:桥接模式下,VMware虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问虚拟机局域网内的任何一台机器.不过你需要多于一个的IP地址,并且需要手工为虚拟系统配置IP地址.子网掩码,而且还要和宿主机器处于同一个网段,这样虚拟系统才能和宿主机器以及和

VMware中的三种网络模式-----NAT模式

2.NAT模式(网络地址转换模式) NAT模式:使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网.也就是说使用NAT模式可以实现在虚拟系统里访问互联网. 例子: ①虚拟机中编辑网络模式,选择NAT模式: ②虚拟机中设置为网络连接的IP地址设置为自动获得: ③宿主机的VMnet8的网络连接IP设置为: ④网络拓扑图: 虚拟机通过VMnet8网卡与宿主机进行通信,在VMnet8的两端宿主机与虚拟机在同一网段. 虚拟机想要与外界网络进行通信,通过VMnet

IOS中的三种弹窗模式

#pragma mark 方法1 /** *  用在IOS7,用到了代理 */ - (void)use1 { // 1.创建一个中间弹框,有“取消”和“确定按钮”,设置代理为当前控制器,由控制器监听点击了“取消”还是“确定”按钮 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"点击了图片按钮" delegate:self cancelButtonTitle:@"

vmware中的三种联网模式

创建多个虚拟机,并把它们组在一个网络里面,并且让自己的windows能够访问 NAT:由vmware提供一个虚拟交换机,将多个虚拟机和自己的windows连接在一起,在这种模式下,vmware可以让虚拟机也能访问windows连接的网络,因为此时vmware可以进行地址转发. bridge桥接:是直接连在自己电脑本地连接所连的真实交换机上,此时虚拟交换机的网段和所连的真实交换机一样. HOSTONLY:和NAT极为相似,也是内部存在一个虚拟的网段:所有虚拟机都连在windows的vmnet1上,

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

前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调,Block回调.具体的内容请参考之前的博客:“Objective-C中的Block回调模式”,“Target-Action回调模式”,“Objective-C中的委托(代理)模式”.在接下来要封装的button中将要用到上面的知识点.之前在做新浪微博中的Cell的时候用到了Block回调来确定是那