您的位置:首页 > 数据库 > Oracle

oracle存储过程--参数类型研究(in,out,in out)

2013-07-10 11:46 288 查看
###########################in############################

create or replace procedure pro_eight(p_one   in varchar2,
p_two   out varchar2,
p_three in out varchar2) is
v_str1 varchar2(32) := '';
v_str2 varchar2(32) default '';
v_str3 varchar2(32);
begin
dbms_output.put_line('传参:' || 'p_one:' || p_one|| ',p_two:' || p_two|| ',p_three:' || p_three);
-- in类型变量不能接收赋值
p_one:='one changed';
--打印变量
dbms_output.put_line('变量:' || 'v_str1:' || v_str1|| ',v_str2:' || v_str2|| ',v_str3:' || v_str3);
exception
when others then dbms_output.put_line('exception!');
end pro_eight;




###########################out############################

create or replace procedure pro_eight(p_one   in varchar2,
p_two   out varchar2,
p_three in out varchar2) is
v_str1 varchar2(32) := '';
v_str2 varchar2(32) default '';
v_str3 varchar2(32);
begin
dbms_output.put_line('传参:' || 'p_one:' || p_one|| ',p_two:' || p_two|| ',p_three:' || p_three);
-- in类型变量不能接收赋值
--p_one:='one changed';

-- out类型只能接收赋值,不能给其他变量赋值。
-- 这样赋值的语句虽然编译和执行都不报错,但是被赋值的变量就是为空,根本没接收到值。
v_str2 :=p_two;
dbms_output.put_line('变量:' ||  ',v_str2:' || v_str2);
--打印变量
dbms_output.put_line('变量:' || 'v_str1:' || v_str1|| ',v_str2:' || v_str2|| ',v_str3:' || v_str3);
exception
when others then dbms_output.put_line('exception!');
end pro_eight;








###########################in out############################

create or replace procedure pro_eight(p_one   in varchar2,
p_two   out varchar2,
p_three in out varchar2) is
v_str1 varchar2(32) := '';
v_str2 varchar2(32) default '';
v_str3 varchar2(32);
begin
dbms_output.put_line('传参:' || 'p_one:' || p_one|| ',p_two:' || p_two|| ',p_three:' || p_three);
-- in类型变量不能接收赋值
--p_one:='one changed';

-- out类型只能接收赋值,不能给其他变量赋值。
-- 这样赋值的语句虽然编译和执行都不报错,但是被赋值的变量就是为空,根本没接收到值。
--v_str2 :=p_two;
--dbms_output.put_line('变量:' ||  ',v_str2:' || v_str2);

-- in  out 类型可以接收赋值,也可以给其他变量赋值
v_str3:=p_three;
v_str3:=v_str3||' changed';
dbms_output.put_line('变量:' ||  'v_str3:' || v_str3);
p_three:=v_str3||' again.';
dbms_output.put_line('参数:' ||  'p_three:' || p_three);
--打印变量
dbms_output.put_line('变量:' || 'v_str1:' || v_str1|| ',v_str2:' || v_str2|| ',v_str3:' || v_str3);
exception
when others then dbms_output.put_line('exception!');
end pro_eight;








@@@@@@@@@@@@@@@@分割@@@@@@@@@@@@@@@@@@@

测试时in out传参的区别

create or replace procedure pro_nine(p_one in varchar2) is
v_str1 varchar2(32) := '';
begin
dbms_output.put_line('传参:' || 'p_one:' || p_one);

v_str1:=p_one;--变量的赋值
-- v_str2=>p_one;--报错,=>只用于在调用时往参数列表传参。
dbms_output.put_line('变量:' ||  'v_str1:' || v_str1);

exception
when others then dbms_output.put_line('exception!');
end pro_nine;


Sql windows 调用

call pro_nine('11');

-- exec pro_nine('11');--报错,这不是sql,是命令,应该在命令窗口执行


Command window 调用

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as uddrb@MYORCL

SQL> exec pro_nine('11');
PL/SQL procedure successfully completed

SQL>


如果参数中有out和in out类型参数,就不能直接传参,必须传入变量。

create or replace procedure pro_nine(p_one in varchar2,p_two out varchar2) is
begin
dbms_output.put_line('传参:' || 'p_one:' || p_one);
p_two:=p_one||'  plus one.';
dbms_output.put_line('传参:' || 'p_two:' || p_two);
exception
when others then dbms_output.put_line('exception!');
end pro_nine;




Sql windows 调用

-- out参数必须绑定变量
declare
v_res varchar2(32);
begin
pro_nine('11',v_res);
dbms_output.put_line('结果:' || 'v_res:' || v_res);
end;

这里正确执行了,但是想要看到打印语句需要把这些代码放到test winddow执行。

Command window 调用

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as uddrb@MYORCL

SQL> var v_str varchar2(32);
SQL> exec :v_str :='222';
PL/SQL procedure successfully completed
v_str
---------
222

SQL> exec pro_nine('111',p_two => :v_str);
PL/SQL procedure successfully completed
v_str
---------
111  plus one.

SQL>


注意变量的声明和赋值方式,以及传参方式。

在command命令窗口模式下,变量的声明var v_str varchar2(32);

执行存储过程语句需要使用命令exec。

使用变量时前面需要加一个冒号:v_str。

例如:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as uddrb@MYORCL

SQL> var v_str varchar2(32):='222';
SQL> exec dbms_output.put_line('v_str:'||:v_str);
PL/SQL procedure successfully completed
v_str
---------

SQL>

上面的值没打印出来,说明这样赋值是不对的。应该用

exec :v_str :='222';

参数列表参数指定使用=>指定变量。

exec pro_nine('111',p_two => :v_str);

----------------------------------------

总结就不写了,有些东西自己做一下实验比看十本书都强。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐