я сдаю СТАРЫЙ экзамен для своих следующих экзаменов, и я столкнулся с этими проблемами:
**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(4,0) Нет - 1
ИМЯ VARCHAR2(10)
РАБОТА VARCHAR2(9) НОМЕР МГР(4,0)
ДАТА АРЕНДА
НОМЕР САЛОН(7,2)
НОМЕР СВЯЗИ(7,2)
НОМЕР ОТДЕЛА(2,0)
)
отдел (
НОМЕР ОТДЕЛА(2,0)
DNAME VARCHAR2(14)
ЛОК ВАРЧАР2(13)
)
Это явно задание, поэтому вместо предоставления решения я укажу на ошибки и, где это уместно, дам вам указатель, где найти ответ, но вам нужно будет построить решение. В долгосрочной перспективе, я думаю, это принесет больше пользы.
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 оператора обновления для EMP и соответствующие выборки для таблицы DEPT. Вместо этого вы можете определить переменную для процента (рассчитывается как 4, 6 или 8) в зависимости от ситуации, а затем использовать эту переменную в одном обновлении. И еще один шаг, вы можете ПРИСОЕДИНИТЬСЯ к DEPT к EMP в курсоре, и тогда вам не потребуется независимый выбор для каждой обрабатываемой строки. Просто способ подумать об обработке наборов, а не отдельных строк.
Все в дополнение к тому, что указал @AlexPoole.
Фигурные скобки —
{}
— ничего не значат в PL/SQL, вам нужно использовать правильный синтаксис и логические конструкции. Подробнее. У вас также есть точка с запятой в конце строки сset
, в строке передwhere
. В сообщениях об ошибках указываются строки, на которые следует обратить внимание (хотя во втором случае проблема действительно в предыдущей строке...)