Сразу не вподать в шок КУРСОРЫ, ДМЛ, Циклы, Операторы

dykee
Дата: 20.10.2015 22:26:50
Само задание:
1.Создать 3 таблицы (emp_10, emp_20, emp_30) в собственной схеме в которой будут храниться данные о сотрудниках их непосредственных менеджерах и их заработной плате .
2. Написать процедуру, которая будет в созданную таблицу вносить из таблицы DEMO.EMP следующие данные:
а)ID_сотрудников;
б) имена сотрудников;
б) имена их непосредственных начальников;
в) заработную плату сотрудников (если сотрудник проработал больше чем 10 лет новая зарплата должна увеличиваться на 7%,если больше 20 на 15%);
г) всех сотрудников 10 от поместить в таблицу emp_10,
всех сотрудников 20 от поместить в таблицу emp_20,
всех сотрудников 30 от поместить в таблицу emp_30,
Предусмотреть обработку исключительной ситуации NO_DATA_FOUND.
Вот код ребята я постараюсь его прокомментировать, что б было легче воспринять
create or replace procedure vlad5  is
a1 demo.employee%rowtype; -- Создали наши переменные
a2 demo.employee%rowtype;
a3 demo.employee%rowtype;
str demo.employee%rowtype;
str1 demo.employee%rowtype;
str2 demo.employee%rowtype; -- Создали наши переменные
-- Создаю курсор для записи в него сотрудников 10 отдела и 20 и 30
cursor p4 is select department_id D, first_name  from demo.employee where department_id=10; 
cursor p3 is select department_id D1, first_name from demo.employee where department_id=20;
cursor p2 is select department_id D2, first_name from demo.employee where department_id=30;
-- Создаю курсор для записи в него айди сотрудника, имя сотрудника, менеджера, зарплаты
cursor p1 is select employee_id, first_name, last_name, salary a from demo.employee;
begin
  for a1 in p1 loop -- Создаю курсорный цикл для записи в таблицы emp_10,20,30 то есть если сотруд. и менеджера проработал больше 10 лет то я вписываю его данные и увеличиваю зарплату
  if months_between(sysdate,demo.employee.hire_date)/12>=10
    then insert into emp_10(first_name, last_name,salary) values (a1.first_name, a1.last_name, a1.a*1.07);
    else if months_between(sysdate,demo.employee.hire_date)/12>=20
        then insert into emp_10(first_name, last_name,salary) values (a1.first_name, a1.last_name, a1.a*1.15);
        else dbms_output.put_line('Error');
        end if;
        end loop;
         for a2 in p1 loop -- Создаю курсорный цикл для записи в таблицы emp_10,20,30 то есть если сотруд. и менеджера проработал больше 10 лет то я вписываю его данные и увеличиваю зарплату
  if months_between(sysdate,demo.employee.hire_date)/12>=10
    then insert into emp_20(first_name, last_name,salary) values (a1.first_name, a1.last_name, a1.a*1.07);
    else if months_between(sysdate,demo.employee.hire_date)/12>=20
        then insert into emp_20(first_name, last_name,salary) values (a1.first_name, a1.last_name, a1.a*1.15);
        else dbms_output.put_line('Error');
        end if;
        end loop;
         for a3 in p1 loop -- Создаю курсорный цикл для записи в таблицы emp_10,20,30 то есть если сотруд. и менеджера проработал больше 10 лет то я вписываю его данные и увеличиваю зарплату
  if months_between(sysdate,demo.employee.hire_date)/12>=10
    then insert into emp_30(first_name, last_name,salary) values (a1.first_name, a1.last_name, a1.a*1.07);
    else if months_between(sysdate,demo.employee.hire_date)/12>=20
        then insert into emp_30(first_name, last_name,salary) values (a1.first_name, a1.last_name, a1.a*1.15);
        else dbms_output.put_line('Error');
        end if;
        end loop;
          for str in p4 loop -- Создаю курсорный цикл для записи в таблицы emp_10,20,30 имена сотрудников 10.20.30 отделов
          insert into emp_10 (department_id,first_name) values (str.D, str.first_name);
          end loop;
           for str1 in p3 loop
          insert into emp_20 (department_id,first_name) values (str1.D1, str.first_name);
          end loop;
           for str2 in p2 loop
          insert into emp_30 (department_id,first_name) values (str2.D2, str.first_name);
          end loop;
          exception
            when NO_DATA_FOUND then raise_application_error('Error');
            end vlad5;

З,Ы, При компиляции мне сейчас выдается ошибка что мол проблема с циклами (в которых оператор if), не понимаю почему?
И вообще кто что может сказать посоветовать, сложная работа конечно...
dykee
Дата: 20.10.2015 22:48:14
dykee,
исправил
exception
            when NO_DATA_FOUND then raise_application_error(-20001, 'Error');

НО ТЕПЕРЬ ТАКИЕ ОШИБКИ:

Compilation errors for PROCEDURE DEMO.VLAD5

Error: PLS-00357: Ññûëêà 'DEMO.EMPLOYEE.HIRE_DATE' íà Òàáë., Ïðåäñòàâë. èëè Ïîñëåäîâ. íåäîïóñòèìà â ýòîì êîíòåêñòå
Line: 14
Text: if months_between(sysdate,demo.employee.hire_date)/12>=10

Error: PL/SQL: Statement ignored
Line: 14
Text: if months_between(sysdate,demo.employee.hire_date)/12>=10

Error: PLS-00357: Ññûëêà 'DEMO.EMPLOYEE.HIRE_DATE' íà Òàáë., Ïðåäñòàâë. èëè Ïîñëåäîâ. íåäîïóñòèìà â ýòîì êîíòåêñòå
Line: 23
Text: if months_between(sysdate,demo.employee.hire_date)/12>=10

Error: PL/SQL: Statement ignored
Line: 23
Text: if months_between(sysdate,demo.employee.hire_date)/12>=10

Error: PLS-00357: Ññûëêà 'DEMO.EMPLOYEE.HIRE_DATE' íà Òàáë., Ïðåäñòàâë. èëè Ïîñëåäîâ. íåäîïóñòèìà â ýòîì êîíòåêñòå
Line: 32
Text: if months_between(sysdate,demo.employee.hire_date)/12>=10

Error: PL/SQL: Statement ignored
Line: 32
Text: if months_between(sysdate,demo.employee.hire_date)/12>=10
шли бы с вопросами к лектору
Дата: 21.10.2015 00:16:29
Ну почему детские сады используют этот ... оракл, когда есть более подходящие для обучения sqlю postgresы и т.п.
Elic
Дата: 21.10.2015 07:43:15
dykee
НО ТЕПЕРЬ ТАКИЕ ОШИБКИ:
Error: PLS-00357: Ññûëêà 'DEMO.EMPLOYEE.HIRE_DATE' íà Òàáë., 
Чучело соломенное, отягощённое неспособностью рассказать о своих проблемах, ты школу закончило? А то сердобольные люди будут впадать в шок и не смогут подать тебе на паперти.
dykee
Дата: 21.10.2015 08:46:26
Elic,

Вы можете здесь только умничать о Великий царь PL/SQLa, я учусь этому только, что то не нравится проходи мимо, если можешь помочь помоги по моему для этого и созданы эти форумы. И не выражайтесь это показывает низкий уровень вашего интеллекта
dykee
Дата: 21.10.2015 08:50:35
dykee,
Может кто то помочь по сути?
автор
Error: PLS-00357: Ññûëêà 'DEMO.EMPLOYEE.HIRE_DATE' íà

ссылка на DEMO.EMPLOYEE.HIRE_DATE не допустима в данном контексте. как сделать так что б была допустима?
mRdUKE
Дата: 21.10.2015 09:02:42
dykee
о Великий царь PL/SQLa

Вспомнился "Иван Васильевич.." => Царь и Великий князь... Всея Руси )

dykee
как сделать так что б была допустима

Сделать ссылку на курсор => а лучше начать читать книжки
Elic
Дата: 21.10.2015 09:08:09
dykee
ссылка на DEMO.EMPLOYEE.HIRE_DATE не допустима в данном контексте. как сделать так что б была допустима?
Перевожу: чтобы учиться в коледже, сперва надо закончить ясли.
Твой уровень (по самомнению - высокий?) интеллекта позволяет тебе понять, что когда нихера не понимаешь, то надо радоваться успеху в маленьких постепенных шажках, а не сломя голову ломиться с закрытыми глазами в чащу, чтобы потом кричать "Ау, я заблудился"?

RTFM Query Result Set Processing With Cursor FOR LOOP Statements (FAQ)
dykee
Дата: 21.10.2015 10:58:16
Задание действительно не самое весело но его нужно выполнить, как мне сделать ссылку на курсор для моей ошибки hire_date. Я прочем что нужно type peremennaya ref cursor return ...
Как реализовал до моего примера помогите пожалуйста
Den89
Дата: 21.10.2015 11:18:44
dykee,

Купи или скачай
http://www.ozon.ru/context/detail/id/30293695/
Там всё это подробно разжевывается.