作为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;
答案 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;