参考博客:
http://blog.csdn.net/lushuaiyin/article/details/9289275
http://www.cnblogs.com/peach/archive/2009/06/10/1500242.html
写的很好,学习一下
0. 概要
在Oracle中过程与函数都可以有参数,参数的类型可以指定为in、out、in out三种模式。
in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。
out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
in out 表示高参数可以向该过程中传递值,也可以将某个值传出去
1. 声明三个参数,简单的输出
- create or replace procedure pro_demo_param(
- p_one in varchar2,
- p_two out varchar2,
- p_three in out varchar2
- ) is
-
- begin
-
- dbms_output.put_line('参数:' || 'p_one:' || p_one || ',p_two:'||p_two || ',p_three:'||p_three);
-
- end pro_demo_param;
就简单的将输入的参数输出
p_one,p_three是可以接受参数的,p_two只可以在过程里被赋值,然后将值返回
2. 对out参数赋值,并输出
- create or replace procedure pro_demo_param(
- p_one in varchar2,
- p_two out varchar2,
- p_three in out varchar2
- ) is
-
- v_str_two varchar2(20) := '路飞';
-
- begin
-
- dbms_output.put_line('参数:' || 'p_one:' || p_one || ',p_two:'||p_two || ',p_three:'||p_three);
-
- p_two := v_str_two;
-
- end pro_demo_param;
测试窗口:
执行一下:
成功返回了路飞。
3. 对in型变量赋值(错误)
上面,我们队out型参数进行了赋值,这是正确的做法,如果对in型变量进行赋值,会报错的
- create or replace procedure pro_demo_param(
- p_one in varchar2,
- p_two out varchar2,
- p_three in out varchar2
- ) is
-
- v_str_two varchar2(20) := '路飞';
-
- begin
-
- dbms_output.put_line('参数:' || 'p_one:' || p_one || ',p_two:'||p_two || ',p_three:'||p_three);
-
- p_two := v_str_two;
-
- p_one := v_str_two;
-
- end pro_demo_param;
在编辑模式下查看,会有错误提示:
- PROCEDURE FOSS.PRO_DEMO_PARAM 编译错误
-
- 错误:PLS-00363: expression 'P_ONE' cannot be used as an assignment target
- 行:15
- 文本:p_one := v_str_two;
-
- 错误:PL/SQL: Statement ignored
- 行:15
- 文本:p_one := v_str_two;
注释掉这行,就可以了。
4. 用in型变量,给其他变量赋值
- create or replace procedure pro_demo_param(
- p_one in varchar2,
- p_two out varchar2,
- p_three in out varchar2
- ) is
-
- v_str_one varchar2(20) := '';
-
- begin
-
- dbms_output.put_line('参数:' || 'p_one:' || p_one || ',p_two:'||p_two || ',p_three:'||p_three);
-
- v_str_one := p_one;
-
- dbms_output.put_line('变量:' || v_str_one);
-
- end pro_demo_param;
测试窗口:
传入2个参数,运行一下
5. 用out型变量,给其他变量赋值(编译通过,但是无法成功)
- create or replace procedure pro_demo_param(
- p_one in varchar2,
- p_two out varchar2,
- p_three in out varchar2
- ) is
-
- v_str_one varchar2(20) := '';
-
- begin
-
- dbms_output.put_line('参数:' || 'p_one:' || p_one || ',p_two:'||p_two || ',p_three:'||p_three);
-
- v_str_one := p_two;
-
- dbms_output.put_line('变量:' || v_str_one);
-
- end pro_demo_param;
这样是可以编译通过的,但是测试时: