日期:2014-05-16  浏览次数:20833 次

请教Oracle中存储过程参数问题
本人刚开始学习Oracle不久,现在遇到个问题,很是困惑,希望知道的各位BOSS级人物能帮我解答下,在此先谢谢各位热心人了
下面是两个存储过程的语句,不用看的特别仔细,大体上知道是怎么个逻辑就可以了:
1、过程名:product_inouttype_prc
create or replace procedure product_inouttype_prc(parm_ctgyid in varchar2,parmparm_pric in out number)
as
begin
update PRODUCTINFOLXX
set productprice=productinfolxx.productprice*(1-parmparm_pric)
where productinfolxx.category=parm_ctgyid;
SYS.DBMS_OUTPUT.PUT_LINE('parmparm_pric的值是:'||parmparm_pric);
SYS.DBMS_OUTPUT.PUT_LINE('1-parmparm_pric的值是:'||(1-parmparm_pric));
if SQL%found then
parmparm_pric:=SQL%rowcount;
end if;
end product_inouttype_prc;


2、过程名:product_clinouttype_prc
create or replace procedure product_clinouttype_prc(parm_ctgyname in varchar2)
as
cur_ctgyid categoryinfolxx.categoryid%type;
cur_pric number;
begin
select categoryinfolxx.categoryid into cur_ctgyid
from categoryinfolxx
where categoryinfolxx.categoryname=parm_ctgyname;

product_inouttype_prc(cur_ctgyid,cur_pric);
if cur_pric>0 then
SYS.DBMS_OUTPUT.PUT_LINE('共修改'||cur_pric||'条记录。');
end if;
exception
when no_data_found then
SYS.DBMS_OUTPUT.PUT_LINE('没有数据!');
when too_many_rows then
SYS.DBMS_OUTPUT.PUT_LINE('数据过多!');
end;


第二过程中调用了第一个过程,第一个过程的第二个参数是inout类型的。
第二个过程中声明了一个变量cur_pric,但没有赋值。在调用第二个过程时,直接当参数传了进去。这里我就不懂了,不给变量赋值也能当参数传给其他过程吗?还是说在没赋值的情况下当成参数传给其他过程时,Oracle会给这个没赋值只声明的变量自动赋个初始值吗?
可我在第一个过程中输出了这个参数的值,以及涉及这个参数的运算结果,可运行后输出的是空的,啥也没有。
我调用第二个过程来运行,也没有出现报错,都正常。
我这里就是不理解,那个cur_pric变量在第一个过程中是如何计算的,居然不报错?
希望各位帮我解惑!!!
下图是我运行后的结果:

我的执行语句是:exec PRODUCT_CLINOUTTYPE_PRC('洗衣机');

------解决方案--------------------
cur_pric number;
未赋值就是null

product_inouttype_prc(cur_ctgyid,cur_pric);
进入第一个存储过程 传入了一个null

SYS.DBMS_OUTPUT.PUT_LINE('parmparm_pric的值是:'
------解决方案--------------------
parmparm_pric);
SYS.DBMS_OUTPUT.PUT_LINE('1-parmparm_pric的值是:'
------解决方案--------------------
(1-parmparm_pric));

你打印的就是传入的null

if SQL%found then
parmparm_pric:=SQL%rowcount;
end if;

这里类型inout的第二个参数被赋值为3


product_inouttype_prc(cur_ctgyid,cur_pric);
第一个存储过程结束 cur_pric获得传出的值:3

if cur_pric>0 then
SYS.DBMS_OUTPUT.PUT_LINE('共修改'
------解决方案--------------------
cur_pric