惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - yellowwood

cmder简单使用 回想一下2013中国软件技术大会 Should Assertion Library 数字用千分位表示 从AD( Active Directory )读取 Email 报表产生方式之二比较 报表产生方式之一图示 报表订阅 報表部署 via VS2005 报表参数 报表rdl嵌入网页(ASP.NET) 報表与子報表 RDL之矩陣 [Oracle整理]数据类型大全 [Oracle整理].NET 调用 Oracle之REF Cursor [Oracle整理]Oracle游标(显示游标&隐式游标&动态游标&参数游标) [Oracle整理]Oracle之数组 [Oracle整理]Oracle之ROWTYPE和RECORD [Oracle整理]synonym及其应用
[Oracle整理]Oracle之Procedure参数类型
yellowwood · 2012-02-11 · via 博客园 - yellowwood

说明:本内容是工作用到的知识点整理,来自工作中和网络。
代码于Oracle9上测试。

OracleProcedure参数类型

一.实参与形参

形参:procedure定义的时候,宣告的参数

实参:在引用procedure的时候,从外部传入(出)的参数

形参是实参值的预留位置,实参的值是被用在procedure中的值。

在程序内,实参会借由形参来参照,当程序传回时,形参的值会被指定给实参。

二.形参的三种模式(IN OUTIN OUT

IN当程序被呼叫时,实参的值会被传入procedure中。 在程序内部,形参就像PL/SQL常数一样,是只读的,不能更改。当程序结束,且控制权传回给进行呼叫的环境时,实参值不会被改变。

OUTprocedure被呼叫时,任何实参的值都会被忽略。在procedure内,形参就像是未被初始化PL/SQL参数,因此具有NULL值。它可以被读取写入。当procedure结束且控制权交给进行呼叫的环境时,形参内容就会被指定给实参。

IN OUT此模式是INOUT的结合。当procedure被呼叫时,实参值被传递到procedure内。在procedure内,形参就像是已经被初始化的变量,可以被读取写入。当procedure结束且控制权传回给呼叫的环境时,形参的内容就会被指定给实参。

三.测试

测试OUT

1 Create Procedure

create or replace procedure putNum(P_Date in date, P_year out varchar2) is
  v_num  number(8) := 1;
  v_days number;
  v_date date;
begin
  dbms_output.put_line('intput value:' || P_year);
  v_num  := 1;
  v_days := 1;
  v_days := to_number(to_char(P_Date, 'dd')); -- to_char(sysdate-20,'dd')
  for i in 1 .. v_days Loop
    v_date := to_date('2011/11/' || to_char(i), 'yyyy/MM/dd');
    --dbms_output.put_line(v_date);
  end loop;
  P_year := '2012';
end;

2 TestScript

declare
  v_yy varchar2(4);
begin
  v_yy := '2010';
  putnum(sysdate, v_yy);
  dbms_output.put_line('Output value:' || v_yy);
end;

3 执行结果

4 分析

使用in传入参数,实参的值被忽略——不会使用传入参数的值。所以输入为空。形参的值是NULL。编译器认为没初始化。

测试IN OUT

1 上面的putNum(P_Date in date, P_year out varchar2) is 改为:

putNum(P_Date in date, P_year in out varchar2) is

2 输出结果

四.总结

1 形参的三种模式:in , out, in out。默认是in

2 一个函数需要返回一个值并且需要DML时(commit时,需使用自治事务),可以考慮OUTIN OUT

Oracle Procedure 參數传递方式

以传址和传值方式传递参数

当参数是以传址(By Reference)方式传递时,指向实参的指针就会被传递给相对应的形参。

当参数是以传值(By Value)方式传递时,它就会从实参复制到形参中。

预设PL/SQL会以传址方式传递IN参数,以传值方式传递OUTIN OUT参数。

使用NOCOPY编译器指示:

语法:procedure procedure_name (parameter_name [mode] NOCOPY datatype)

说明:parameter_name---->参数名称

mode                 ----->参数模式(IN / OUT / IN OUT

datatype           ------>参数的数据类型

NOCOPY         ------->NOcopy出现,PL/SQL编译器就会尝试传地址方式来传递参数,而不是用传值的方式。

限制:

在某些情况下,NOCOPY会被忽略,而参数还是会以传值的方式传递。

在这些情况下,不会有错误产生。

请记住,NOCOPY是个指示,编译器没义务遵循它。

在以下情况会被忽略:

1.实参是组合阵列的成员。当实参为这个阵列时,此限制条件不适用

2.实参被精确度准确度、或者NOT NULL限制条件所限制时。但是此限制对于由最大长度所限制的字元参数不适用。

3.实参和形参都是记录,且它们是被内隐的作为循环控制的变量,或者是使用%ROWTYPE来宣告,在对应栏位上的限制不同。

4.传递实参需要有内隐的数据类型转换

5.副程式牵涉到远端程序呼叫RPC)。由于参数必须在网络上传递,所以要用传址方式来传递它们是不可能的。

效能:

在所需时间上,以传值方式传递IN OUT参数,会远远大于以传址方式传递IN IN OUT NOCOPY参数。