1: 先看看数据库的emp表的数据类型
2: 错误的姿势
create procedure update_sal(in_name in varchar2,in_new_sal in number) is
begin
update emp set sal=in_new_sal where ename=in_name;
dbms_output.put_line(‘更新成功!’);
end;
为什么去年正确,今年却不正确?
因为去年表emp的字段ename是varchar2类型,今年是char类型。
所以无法识别数据类型,造成不能成功修改。
有一种方式:就是直接把输入参数类型 varchar2修改成char(数据库ename的类型)
第二种方式:如果依然用varchar2,那么按照如下姿势即可:
3:正确的姿势
昨晚折腾了整整两个小时多,今早又折腾,最后,经过网友崔*的帮忙下,他给了我
正确的姿势,再次特别感谢素不相识,却耐心搭救的这位朋友。
create or replace procedure update_sal(in_name in varchar2,in_new_sal in number)
is
new_name char(10); //定义两个变量,完全按照数据库里的数据类型
new_sal number(9,2); //可以不定义这个的,number类型没啥问题
begin
new_name := in_name; //给变量赋值,【这里居然自动把varchar2变成了char类型】
new_sal := in_new_sal;
update emp set sal=new_sal where ename=new_name; //使用变量
commit;
dbms_output.put_line(‘更新成功!’);
dbms_output.put_line(SQL%ROWCOUNT);
end;
测试成功。
总结:解决问题的过程
1:刚开始存储过程显示正确,执行不报错,但是影响行数为0
create or replace procedure update_sal(in_name in varchar2,in_new_sal in number) is
begin
update emp set sal=in_new_sal where ename=in_name;
commit;
dbms_output.put_line(‘更新成功!’);
dbms_output.put_line(SQL%ROWCOUNT);//输出受影响的行数
end;
要显示dbms_output.put_line的输出,可以在sqlplus中执行
set serveroutput on;
//之后dbms_output.put_line的结果直接可以打印出来。
2:然后我们把存储过程修改成固定值
create or replace procedure update_sal is
begin
update emp set sal=3000 where ename=’SMITH’;
commit;
dbms_output.put_line(‘更新成功!’);
dbms_output.put_line(SQL%ROWCOUNT);//输出受影响的行数
end;
调用存储过程,结果能正常修改。
3:猜猜应该是数据类型不匹配了,就这样找到了正确的答案。