今天在建立update存储过程时,调用一直没能存储进去,虽然显示存储成功,但是在查询后显示表未被修改,在参考了http://lin49940.iteye.com/blog/466626文章后进行了修改,终于发现了错误的几个原因:
1、对于预定义变量不能与表中列名相同(参考http://lin49940.iteye.com/blog/466626)
这是一个很简单的更新语句, 简单到一开始对为什么发生这样的错误不知所措. 其实出错的原因是在于 变量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' 是不对等的, 这也是容易犯的一个错误, 在此记录下)
2、对于 参数变量要区别对待:(1)对于要记性set赋值的变量同样是不能重名的;
这个在http://lin49940.iteye.com/blog/466626文章中未提到,刚开始我以为也是可以的~最后发现自己的原因就是出在这上面
SQL> create or replace procedure update_young(
2 pat_ID VARCHAR2,
3 young_1 INTEGER,
4 young_2 INTEGER,
5 young_3 INTEGER,
6 young_4 INTEGER,
7 young_5 INTEGER,
8 young_6 INTEGER,
9 young_7 INTEGER,
10 young_8 INTEGER,
11 young_Score INTEGER)
12 is
13 begin
14 update admin.young_tab set
15 admin.young_tab.young_1= young_1,
16 admin.young_tab.young_2= young_2, admin.young_tab.young_3 = young_3, admin.young_tab.young_4 = young_4, admin.young_tab.young_5=young_5 ,
17 admin.young_tab.young_6=young_6,admin.young_tab.young_7=young_7,admin.young_tab.young_8=young_8,admin.young_tab.young_Score=young_Score
18 where admin.young_tab.pat_id=pat_ID;
19 commit;
20 end update_young;
21 /
Procedure created
进行调用: exec update_young('p2',1,1,1,1,1,1,1,1,9);同样表未被修改存储,在修改复制变量名字后就好了
(2) 对于是要在where语句中进行判断的语句则是可以重名的;
这个在http://lin49940.iteye.com/blog/466626中进行了实验。