一、In、out、in out模式

在Oracle中过程与函数都可以有参数,参数的类型可以指定为in、out、in out三种模式。

三种参数的具体说明,如下图所示:

(1)in模式

in模式是引用传递。调用过程时实际参数将值以引用方式传递给存储过程的形式参数,形式参数在过程中是只读模式的,也就是说:只能通过形式参数读取到实际参数的值。当过程执行完毕后,实际参数的值不会发生任何变化。

过程:

create or replace procedure MyProcedure(param1 in INTEGER)    --param1形式参数

AS

BEGIN

……..

END

调用:

num:=100;

MyProcedure(num);        --num 实际参数

分析:

实际参数num将其值100传递给过程的形式参数param1,param1的值变为100,过程执行完后返回到调用过程的语句,实际参数num的值不会发生任何变化。

(2)out模式

out模式是值传递。调用过程的时候,形式参数会忽略实际参数的值,而被初始化为null值,形式参数是可读写的,所以在过程中形式参数的值可以被修改,过程执行完毕后,形式参数会将其值赋值给实际参数。

过程

create or replace procedure MyProcedure(param1 out INTEGER)    --param1形式参数

AS

BEGIN

DBMS_OUTPUT.PUT_LINE(param1);    --param1为null

param1:=1;                --修改param1的值为1

END

调用:

num:=100;

MyProcedure(num);        --num 实际参数

分析:

实际参数并不能将其值传给过程的形式参数,相反过程的形式参数的初始值为null,等过程执行完后param1的值变为1,过程返回时将形式参数的值赋值给实际参数,所以num的值从100变为了1;

(3)in out模式

in out模式是值传递的。调用过程的时候,实际参数的值会以值传递的方式赋值给形式参数,在过程中形式参数的值可以被修改,等过程执行完毕后,形式参数又会将其值赋值给实际参数。

过程:

create or replace procedure MyProcedure(param1 in out INTEGER)    --param1形式参数,能接受实际参数传来的值

AS

BEGIN

DBMS_OUTPUT.PUT_LINE(param1);    --param1为null

param1:=1;

END

调用:

num:=100;

MyProcedure(num);        --num 实际参数

分析:

实际参数num将其值100传递给过程的形式参数param1,param1的值初始化为100,过程执行中param1的值变为1,等过程执行完毕返回时又将形式参数param1的值赋值给了实际参数num,所以num的值从100变为了1;

将字面值或常量当作实际参数,由于存在值的复制。所以与out或in out模式的形式参数相关联的实际参数必须是一个变量,而不能是一个常量或表达式。必须有一个可以存储返回值的位置。

out模式和in out模式的主要区别就是:in out模式能将实际参数的值传递给过程的形式参数,out模式的形式参数的初始值只能为null。

二、传值和传引用

默认情况下,缺省为in模式,in接收常量、变量、表达式,out/in out只能接受变量。

引用传递的方式效率比较高,传递大型PL/SQL数组时表现尤为突出。

IN OUT IN OUT
The default Must be specified Must be specified
Passes values to a subprogram Returns values to the caller Passes initial values to a subprogram and returns updated values to the caller
Formal parameter acts like a constant Formal parameter acts like an uninitialized variable Formal parameter acts like an initialized variable
Formal parameter cannot be assigned a value Formal parameter must be assigned a value Formal parameter should be assigned a value
Actual parameter can be a constant, initialized variable, literal, or expression Actual parameter must be a variable Actual parameter must be a variable
Actual parameter is passed by reference (a pointer to the value is passed in) Actual parameter is passed by value (a copy of the value is passed out) unless NOCOPY is specified Actual parameter is passed by value (a copy of the value is passed in and out) unless NOCOPY is specified

NOCOPY提示

·in模式总是以引用方式传递参数,所以不允许在in模式上使用NOCOPY提示;

·out、in out模式可以通过NOCOPY关键字来告诉PL/SQL编译器采用引用方式来传递参数值;NOCOPY只是一个编译器提示,而不是编译指令,所以它并不是总是有效;

·以下几种情况会忽略NOCOPY的存在,如下图所示:

Oracle过程及函数的参数模式详解的更多相关文章

  1. Oracle过程及函数的参数模式,In、out、in out模式

    Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...

  2. 机器学习——随机森林,RandomForestClassifier参数含义详解

    1.随机森林模型 clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=4) rf_clf = c ...

  3. 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数

      1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...

  4. Oracle GoldenGate中HANDLECOLLISIONS参数使用详解

    Oracle GoldenGate中HANDLECOLLISIONS参数使用详解   HANDLECOLLISIONS 是一个 replicat 进程参数,主要在 initial load 中使用.在 ...

  5. Oracle Statspack报告中各项指标含义详解~~学习性能必看!!!

    Oracle Statspack报告中各项指标含义详解~~学习性能必看!!! Data Buffer Hit Ratio#<#90# 数据块在数据缓冲区中的命中率,通常应该在90%以上,否则考虑 ...

  6. MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解

    MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Mycat介绍 1>.什么是Mycat Mycat背后是 ...

  7. DES加密模式详解

    DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...

  8. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  9. Oracle 数据库启动与关闭 各种方式详解整理

    概述 只有具备sysdba和sysoper系统特权的用户才能启动和关闭数据库. 在启动数据库之前应该启动监听程序,否则就不能利用命令方式来管理数据库,包括启动和关闭数据库. 虽然数据库正常运行,但如果 ...

随机推荐

  1. js操作checkbox(复选框)的方法总结

    收集了一些用js代码操作checkbox复选框的代码,分享出来,供需要的朋友参考: <script> //复选框checkbox 处理方法 //搜集整理 www.jbxue.com fun ...

  2. [k8s]如何处理dockerfile无expose情况下在k8s里暴漏访问

    做镜像时候忘记expose端口了, 或者要做一个通用的镜像, expose端口不固定, 又要在k8s环境里跑并暴漏服务访问,怎么破? 实际上: yaml的 ports: - containerPort ...

  3. [svc]kill pkill killall管理进程

    进程讲解 操作配置 http://www.centoscn.com/CentOS/help/2013/0809/1218.html 终止一个进程或终止一个正在运行的程序,一般是通过 kill .kil ...

  4. RednaxelaFX写的文章/回答的导航帖

    https://www.zhihu.com/people/rednaxelafx/answers http://hllvm.group.iteye.com/group/topic/44381#post ...

  5. HBase性能优化方法总结(三):读表操作

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第三部分内容:读表操作相关的优化方法 ...

  6. django 线上线下使用不同的数据库 上线:mysql 线下sqlite3 以及debug模式的开和关

    hostname = socket.gethostname() 获取主机名称 import os import socket hostname = socket.gethostname() if ho ...

  7. Linux五种I/O模型性能分析

    转载自:http://blog.csdn.net/jay900323/article/details/18141217/ socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理 ...

  8. xcode常见报错调试

    转载来自于:http://www.cnblogs.com/g-ios/p/4625912.html(广_ios博客园) BMKGeoCodeSearch 反向地理编码一直失败 Location 申请的 ...

  9. socket编程函数

    连接 TCP/IP协议规定网络数据传输应采用大端字节序 socket地址 struct sockaddr{ unsigned short sa_family; char sa_data[14]; }; ...

  10. libtommath.a: could not read symbols: Bad value 编译错误

    最近做个项目需要RSA,便调用了tommath,平时开发环境都在32位的系统上,编译运行一切都没问题,但当把程序换到一台64位系统上编译时出现: /usr/bin/ld: /usr/lib/gcc/x ...