2017-03-09 45 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;