如何使用ORACLE中的函数更新表的列

时间:2014-12-16 19:53:27

标签: oracle function

作为ORACLE的新手和一般的编程我很难在oracle中更新表格列中的一系列单元格。 表:

ad soyad not1 not1 not3 BN HN
Ayşe    Yılmaz    28    65    82
Melih    Türkmen    45    27    56
Cemile    Kara    54    65    99
Ragıp    Pekkan    62    48    85
Jale    Kale    48    75    52
Vehbi    Kemal    18    65    63
Mehmet    Hamarat    54    62    70
Murat    Çokbilir    25    28    32
Harun    Reşit    85    84    92
Cemal    Yamak    95    23    90 

我的功能:

create or replace 
function basariNotu (a NUMBER, b NUMBER, c NUMBER) RETURN NUMBER IS
  rbn NUMBER;
BEGIN
  rbn:=(a*0.2)+(b*0.2)+(c*0.6);
  RETURN rbn;
END basariNotu;

我的代码应该更新列' bn' rbn从函数返回:

DECLARE 
  d NUMBER;
  e NUMBER;
  f NUMBER;
  rbn NUMBER;
  j NUMBER;
BEGIN
  j:=1;
  LOOP
    SELECT not1 INTO d FROM student;
    SELECT not2 INTO e FROM student;
    SELECT not3 INTO f FROM student;
    basariNotu(d, e, f);
    UPDATE student SET bn=rbn WHERE bn= NULL;
    j:= j+1;
    IF j>10 THEN
      EXIT;
    END IF;
  END LOOP;
END;

1 个答案:

答案 0 :(得分:0)

您的查询中没有任何适当的WHERE子句,并且您的LOOP与正在处理的行没有任何关系。 j计数器仅使循环执行相同的操作9次。不仅如此,您的谓词bn= NULL将始终评估为FALSE,因此它永远不会更新任何行。

我想你可能想要这样的东西:

FOR r IN (
  SELECT student_id, not1, not2, not3
  FROM student
  WHERE bn IS NULL
  ) LOOP
  rbn := basariNotu(a => r.not1, b => r.not2, c = r.not3);
  UPDATE student SET bn=rbn WHERE student_id = r.student_id;
END LOOP;

上面的代码假设您的表具有某种唯一标识符,例如student_id。如果它没有,你有更多的问题要处理。

然而,这是慢速(逐行)编程风格,这是你需要动摇的习惯。使用单个UPDATE语句可以更简单有效地完成上述操作,例如:

UPDATE student
SET bn = basariNotu(a => not1, b => not2, c = not3)
WHERE bn IS NULL;

为了获得更好的性能,您可以完全避免使用函数调用,例如:

UPDATE student
SET bn = (not1*0.2)+(not2*0.2)+(not3*0.6)
WHERE bn IS NULL;