Oracle过程及函数的参数模式详解
一、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过程及函数的参数模式详解的更多相关文章
- Oracle过程及函数的参数模式,In、out、in out模式
Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...
- 机器学习——随机森林,RandomForestClassifier参数含义详解
1.随机森林模型 clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=4) rf_clf = c ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- Oracle GoldenGate中HANDLECOLLISIONS参数使用详解
Oracle GoldenGate中HANDLECOLLISIONS参数使用详解 HANDLECOLLISIONS 是一个 replicat 进程参数,主要在 initial load 中使用.在 ...
- Oracle Statspack报告中各项指标含义详解~~学习性能必看!!!
Oracle Statspack报告中各项指标含义详解~~学习性能必看!!! Data Buffer Hit Ratio#<#90# 数据块在数据缓冲区中的命中率,通常应该在90%以上,否则考虑 ...
- MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解
MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Mycat介绍 1>.什么是Mycat Mycat背后是 ...
- DES加密模式详解
DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...
- Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例
Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13| 分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...
- Oracle 数据库启动与关闭 各种方式详解整理
概述 只有具备sysdba和sysoper系统特权的用户才能启动和关闭数据库. 在启动数据库之前应该启动监听程序,否则就不能利用命令方式来管理数据库,包括启动和关闭数据库. 虽然数据库正常运行,但如果 ...
随机推荐
- mysql5.7启动slave报错 ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
原因:检查my.cnf,原来没指定relay_log,mysql默认产生的relay_log名被该server上的另一个mysql slave占用了. 解决方法:1.在my.cnf中添加 relay_ ...
- 【DSP】CCS中.dat文件的格式
转自“http://e2e.ti.com/support/development_tools/code_composer_studio/f/81/t/168292” Here is the infor ...
- HTML的级联Select
系统开发中,经常遇到级联Select的状况,而级联的Select Option数据一般记录于DB,如果每次都重新写一套级联Select,工作将是繁琐滴... 一般来说,写一套级联的Select的几个步 ...
- MySQL常见的库操作,表操作,数据操作集锦及一些注意事项
一 库操作(文件夹) 1 数据库命名规则 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数字 最长128位 2 数据库相关操作 创 ...
- Alluxio 内存存储系统部署
一.文件下载和解压 1)下载地址:http://www.alluxio.org/download 2) 解压命令如下: $ wget http://alluxio.org/downloads/file ...
- Mixing ASP.NET Webforms and ASP.NET MVC
https://www.packtpub.com/books/content/mixing-aspnet-webforms-and-aspnet-mvc *********************** ...
- Accumulator
Accumulator简介 Accumulator是spark提供的累加器,顾名思义,该变量只能够增加. 只有driver能获取到Accumulator的值(使用value方法),Task只能对其做增 ...
- Unity3D中的序列化测试
Unity3D中序列化字段常使用[SerializeField],序列化类常采用[System.Serializable],非序列化采用[System.NonSerialized]. 序列化类使用时发 ...
- 【Visual Studio】报错SignTool Error: No certificates were found that met all the given criteria.
问题:Virtual Studio如果证书或SignTool.exe签名工具出了问题,编译运行项目时会报这个错误. 解决:参考下面内容. http://stackoverflow.com/questi ...
- win8.1 64位安装oracle10g客户端心得
方法同win7 64位安装方法(http://www.cnblogs.com/winkey4986/p/3683568.html)下载Oracle 10g的客户端程序,文件名是 10201_clien ...