как исправить Обнаружен символ "ГДЕ" при ожидании одного из следующих действий и { - PullRequest
0 голосов
/ 31 мая 2019

Я делаю СТАРЫЙ экзамен для моих следующих экзаменов, и я столкнулся с этими проблемами:

**1-** ORA-06550: line 18, column 1:
PLS-00103: Encountered the symbol "{" when expecting one of the following:


**2-** ORA-06550: line 23, column 1:
PLS-00103: Encountered the symbol "WHERE" when expecting one of the following:

Я пробовал многие вещи, например, изменить IF statement для поиска типа ошибок ( ; '' ) missing и т. Д., Но на самом деле ничего не работает

Код:

declare

cursor cur is select * from emp where sal > 0 order by sal ;

enreg emp%rowtype;

x number;

i number;

chaine dept.ename%type;

begin 

open cur;

select count ename into x from emp where sal > 0;

i:=0;

loop

fetch cur into enreg;

i:=i+1;

IF i<x/4 THEN 

{

dbms_output.put_line('le nom du ' || i || 'salairié est '|| enreg.ename);

dbms_output.put_line('lancien salaire du ' || i || 'salairié est '|| enreg.sal);

update emp

set emp.sal = emp.sal+((emp.sal*4)/100);

WHERE emp.sal = enreg.sal;

select dname from dept into chaine where dept.deptno=enreg.deptno;

enreg.sal := emp.sal;

dbms_output.putline('le depart  du ' || i || 'salairié est '|| chaine);

dbms_output.putline('le nouveau salaire du ' || i || 'salairié est '|| enreg.sal);

}

elseif i>=x/4 and i<=x/2 then 

{

dbms_output.putline('le nom du ' || i || 'salairié est '|| enreg.ename);

dbms_output.putline('lancien salaire du ' || i || 'salairié est '|| enreg.sal);

update emp

set emp.sal = emp.sal+((emp.sal*6)/100);

where emp.sal=enreg.sal;

select dname from dept into chaine where dept.deptno=enreg.deptno;

enreg.sal := emp.sal;

dbms_output.put_line('le depart  du ' || i || 'salairié est '|| chaine);

dbms_output.put_line('le nouveau salaire du ' || i || 'salairié est '|| enreg.sal);

}

else 

{

dbms_output.put_line('le nom du ' || i || 'salairié est '|| enreg.ename);

dbms_output.put_line('lancien salaire du ' || i || 'salairié est '|| enreg.sal);

update emp

set emp.sal = emp.sal+((emp.sal*8)/100);

where emp.sal=enreg.sal;

select dname from dept into chaine where dept.deptno=enreg.deptno;

enreg.sal := emp.sal;

dbms_output.putl_ine('le depart  du ' || i || 'salairié est '|| chaine);

dbms_output.put_line('le nouveau salaire du ' || i || 'salairié est '|| enreg.sal);

}

end if ;

exit when cur%notfound;

end loop;

end;

КОД КОНЦА

the expected results is to upgrade the salary 
the first 1/4 of salaries have 4% upgrade
the other 1/4 have 6 % 
the rest 8%
in the same time and with one cursor i must display the old value of the sal and the new value  and the name of the person + the department which he is in it 
  • Таблицы:

    эй (

    EMPNO NUMBER (4,0) Нет - 1

    ENAME VARCHAR2 (10)

    JOB VARCHAR2 (9) НОМЕР МГР (4,0)

    ДАТА HIREDATE

    НОМЕР ПРОДАЖИ (7,2)

    COMM NUMBER (7,2)

    НЕДОРОГО НОМЕР (2,0)

    )

    * отдел 1045. * (

    НЕДОРОГО НОМЕР (2,0)

    DNAME VARCHAR2 (14)

    LOC VARCHAR2 (13)

    )

1 Ответ

0 голосов
/ 01 июня 2019

Это явно задание, поэтому вместо предоставления решения я укажу на ошибки и, где это уместно, дам вам указатель, где найти ответ, но вам нужно будет создать решение.В долгосрочной перспективе я думаю, что это принесет большую пользу.

select count ename into x from emp where sal > 0;

Этот синтаксис этого оператора недопустим.См. Функция подсчета .

update emp
set emp.sal = emp.sal+((emp.sal*4)/100);
WHERE emp.sal = enreg.sal;

Эти операторы вместе взятые также имеют неверный синтаксис.Кажется, вы думаете, точка с запятой -;- указывает на конец строки, но фактически указывает на конец оператора.Я представляю, что вам не нужен первый - он действительно действителен, но обновит каждую строку в таблице.Без этой точки с запятой будет обновляться только подмножество строк, но это подмножество будет соответствовать каждому окладу, включая уже обновленные.См. Обновление в пределах Курсора

Пара общих комментариев.
Ваша процедура содержит много ненужных повторений.3 обновите операторы для ПУОС и соответствующие варианты выбора для таблицы DEPT.Вместо этого вы можете определить переменную для процента (рассчитанного как 4,6 или 8) в зависимости от ситуации, а затем использовать эту переменную в одном обновлении.И на шаг вперед, вы можете присоединиться к DEPT к EMP в курсоре, и вам не нужно независимое выделение для каждой строки, которую вы обрабатываете.Просто способ думать об обработке наборов вместо отдельных строк.
Все в дополнение к тому, на что указал @AlexPoole.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...