请教Oracle中存储过程参数问题

霜影 2014-01-04 11:20:51
本人刚开始学习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('洗衣机');
...全文
62 点赞 收藏 2
写回复
2 条回复
forgetsam 2014年01月04日
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||'条记录。'); end if; 因为你声明的是inout 所以product_inouttype_prc结束后,out类型的参数获得了值。
回复 点赞
霜影 2014年01月04日
额,非常非常感谢 forgetsam 的热心回答,受你的启发(第二行对我有至关重要的启发)。
我问了下度娘null的相关问题解答,找到一篇解说,然后我又结合我的表来比对,总算弄明白了。
原SQL语句:
update PRODUCTINFOLXX
set productprice=productinfolxx.productprice*(1-parmparm_pric)
where productinfolxx.category=parm_ctgyid;
其中1-parmparm_pric的值是null,productprice*null的结果还是null,实际上这条更新语句是把类型是洗衣机的产品价格更新成null了。

Oracle中NULL的使用详解
回复 点赞
发动态
发帖子
Oracle 高级技术
创建于2007-09-28

2929

社区成员

1.8w+

社区内容

Oracle 高级技术相关讨论专区
社区公告
暂无公告