PL/SQL procedura aktualizująca dane

0

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.

0
  1. kod wstawiaj w poście
  2. formatuj kod
  3. zacznij od googla, potem sprawdź dokumentację.
    https://www.google.pl/search?q=oralce+cursor+loop
    https://www.google.pl/search?q=oracle+if
0
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;

1

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;
0
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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1