1. 程式人生 > >儲存過程執行成功,就是修改不了資料

儲存過程執行成功,就是修改不了資料

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:猜猜應該是資料型別不匹配了,就這樣找到了正確的答案。