https://paste.ofcode.org/7PCheFd8BKTDX9KayuApZ7
Mam zmodyfikować pole salary w tabeli emp_new.
Non stop wywala mi program przy END LOOP i END.
Nie mam poęcia o co chodzi.
https://paste.ofcode.org/7PCheFd8BKTDX9KayuApZ7
Mam zmodyfikować pole salary w tabeli emp_new.
Non stop wywala mi program przy END LOOP i END.
Nie mam poęcia o co chodzi.
DECLARE
CURSOR c_salary IS
SELECT salary FROM emp_new FOR UPDATE OF salary;
myvar c_salary %ROWTYPE;
uv_srednia INTEGER :=NULL;
uv_salary INTEGER :=NULL;
BEGIN
SELECT AVG(salary) INTO uv_srednia
FROM emp;
OPEN c_salary;
LOOP
FETCH c_salary INTO uv_salary;
EXIT WHEN c_salary%NOTFOUND;
IF uv_salary<0.5*uv_srednia THEN UPDATE emp_new SET salary =uv_salary+0.2*uv_salary WHERE CURRENT OF c_salary;
ELSIF uv_salary BETWEEN 0.5*uv_srednia AND 5*uv_srednia/6 THEN UPDATE emp_new SET salary=uv_salary+0.1*uv_salary
WHERE CURRENT OF c_salary;
ELSE UPDATE emp_new SET salary=0.05*uv_salary+uv_salary WHERE CURRENT OF c_salary;
END IF;
END LOOP;
COMMIT;
END;
Update robi mi źle, wszystko się kompiluje.
Pierwszy rekord ma mniejszą wartość niż powinien, a reszta ma taką samą, też zaniżoną wartość.
Warunki mam chyba dobrze, ale nie wiem jak do końca działa taki twór: myvar c_salary %ROWTYPE;
A ten kursor jest potrzebny? Nie mozna tego zrobić updatem?
DECLARE
uv_srednia INTEGER :=NULL;
BEGIN
SELECT AVG(salary) INTO uv_srednia FROM emp;
update
emp_new
set
salary = (case
when salary<0.5*uv_srednia THEN salary+0.2*salary
when salary BETWEEN 0.5*uv_srednia AND 5*uv_srednia/6 THEN salary+0.1*salary
else 0.05*uv_salary+uv_salary
end);
END;
Suicider napisał(a):
Update robi mi źle, wszystko się kompiluje.
Pierwszy rekord ma mniejszą wartość niż powinien, a reszta ma taką samą, też zaniżoną wartość.
Warunki mam chyba dobrze, ale nie wiem jak do końca działa taki twór: myvar c_salary %ROWTYPE;
a wiesz co robi WHERE CURRENT OF
? Przecież to nie ma prawa działać.