存储过程参数学习心的

今天写了个存储过程,单步调试不报错,但是update始终不成功,后来上网看了下原来是

写道
今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操作不能完成更新的操作, 但是又不会报错.



如一个表 A(id, code, name, type)



在存储过程中的更新操作的语句: update A x set x.type = 变量A where x.code = 变量B;



变量A 和 变量B 都定义好了, 并且都成功赋值了.



这是一个很简单的更新语句, 简单到一开始对为什么发生这样的错误不知所措. 其实出错的原因是在于 变量A 或 变量B 的定义上, 如:



creat or replace procedure p_AA

is

t_type varchar2(20);

code number(10);

begin

t_type := 'AA';

code := 100

update A x set x.type = t_type where x.code = code ;

commit;

end;



执行成功, 但是update 操作没有成功, 没有报什么错误. 其实原因在于变量code 跟 表A 中的字段code 的名字相同造成的. 看下面的:





creat or replace procedure p_AA

is

t_type varchar2(20);

t_code number(10);

begin

t_type := 'AA';

t_code := 100

update A x set x.type = t_type where x.code = t_code ;

commit;

end;



执行成功, update操作也成功. 所以原因在与变量的名称上面(还有一个值得注意的地方, 如果code字段是char型的, 变量的长度跟字段code的长度如果不一致, 比较会不成功,' 100' 和 '100' 是不对等的, 这也是容易犯的一个错误, 在此记录下)



还有一个地方要注意:

creat or replace procedure p_AA(code in number) --code作为参数, 就算跟表A 的字段名称一样, 也不会有影响

is

t_type varchar2(20);

begin

t_type := 'AA';

update A x set x.type = t_type where x.code = code ;

commit;

end;



执行 execute p_AA(100) 成功, 更新操作也成功. code如果是参数, 跟表A 的字段名称一样, 也不会有影响.



我一般变量都会加t_ 或 p_, 所以以前没遇到这个问题, 为了防止以后可能再次遇到这个问题和也遇到这个问题的朋友, 在此留下这篇博客作为备忘.

 

 

犯了第一个错误,所以存储过程始终update不成功,但是,同样的select into中出现重名则不会影响赋值,只用update时候发现了这个问题,

此外在使用pl sql时候,我构造了一个10W+的循环,但是每每700多次就挂掉了,后来发现是        DBMS_OUTPUT.PUT_LINE('XXXXXXXXX'||m);惹的祸,估计是缓存溢出了,我的plsql dbms输出缓冲区大小是10000,原因在这里。一旦超过了就报错。。

 

此外很多人肯定对plsql或者说DBMS_OUTPUT.PUT_LINE的怨念,因为他是最后输出,而很多时候我们是要求在中间观察进度的,这个是没招的,只能自行设计方案了,无非邮件通知,写表,写文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值