2017-03-09 17 views
-5
create or replace procedure updateStudentResult(id int) 
as 
m1 number(4); 
m2 number(4); 
m3 number(4); 
tot number(4); 
avg float; 
grd char(1); 
begin 
select marks1,marks2,marks3 into m1,m2,m3 from students where sid=id; 
tot:=m1+m2+m3; 
avg:=tot/3; 
if(avg>=85.0) then 
grd:='A'; 
elsif(avg>=65.0) then 
grd:='B'; 
elsif(avg>=50.0) then 
grd:='C'; 
else 
grd:='D'; 
end if; 
update students set total=tot,average=avg,grade=grd where sid=id; 
end; 
/
+0

正在試圖通過SID爲ID的方法計算總,平均和更新的DB學生 –

+0

PL-0103遇到「=」,而在需要下列( –

+0

在這行是遇到錯誤?讀整個錯誤信息,這是非常有用的!然後,除了任何錯誤之外,你爲什麼要在一個過程中完成所有這些,而不是在普通的SQL UPDATE語句中?更好的是,爲什麼不保存這些計算,無論是在表本身(作爲虛擬列)還是在視圖中? – mathguy

回答

0

所有程序代碼和初始選擇是不必要的。這就足夠了;

CREATE OR REPLACE PROCEDURE updatestudentresult(id INT) AS 

BEGIN 
    UPDATE students 
    SET total = mark1+mark2+mark3, 
    average = (mark1+mark2+mark3)/3, 
    grd = CASE 
      WHEN (mark1+mark2+mark3)/3 > 85 THEN 'A' 
      WHEN (mark1+mark2+mark3)/3 > 65 THEN 'B' 
      WHEN (mark1+mark2+mark3)/3 > 50 THEN 'C' 
      ELSE 'D' 
      END 
    WHERE sid = id; 
END; 
+0

哇,相隔12秒。 – unleashed

+0

12秒和一個海洋! – BriteSponge

0

avg是一個保留字(它是一個函數)。您不能在plsql中將其用作變量名稱。爲您的平均值使用另一個變量名稱。

create or replace procedure updatestudentresult(id int) as 
    m1 number(4); 
    m2 number(4); 
    m3 number(4); 
    tot number(4); 
    l_avg float; 
    grd char(1); 
begin 
    select marks1 
     ,marks2 
     ,marks3 
    into m1 
     ,m2 
     ,m3 
    from students 
    where sid = id; 

    tot := m1 + m2 + m3; 

    l_avg := tot/3; 

    if l_avg > 85.0 
    then 
     grd := 'A'; 
    elsif (l_avg >= 65.0) 
    then 
     grd := 'B'; 
    elsif (l_avg >= 50.0) 
    then 
     grd := 'C'; 
    else 
     grd := 'D'; 
    end if; 

    update students 
     set total = tot 
     ,average = l_avg 
     ,grade = grd 
    where sid = id; 
end; 
+0

l_avg> 85.0這是一個正確的語法或(l_avg> = 65.0)哪一個? –

+0

應該是> =如你的例子,你可以用()或不用寫它 – Rene

+0

------ >>>>>>> THANKU so much { Rene –

0

僅僅因爲你可以在pl/sql中做到這一點,這可能會更好的更新聲明。不要在這裏對數據模型做出判斷,只是使用你所擁有的。

update students 
    set total = mark1+mark2+mark3, 
     avg = (mark1+mark2+mark3)/3, 
     grd = case 
      WHEN (mark1+mark2+mark3)/3 > 85.0 then 'A' 
      when (mark1+mark2+mark3)/3 > 65.0 then 'B' 
      when (mark1+mark2+mark3)/3 > 50.0 then 'C' 
      else 'D' end 
where sid = :sid;