Что не так с моим SQL-запросом для курсора - PullRequest
0 голосов
/ 06 апреля 2019

Вот что я должен делать.Предположим, что таблицы созданы, и все столбцы имеют правильное имя

. Используя хранимые процедуры и курсоры, отобразите местоположение (включая улицу, почтовый индекс, город и страну) менеджеров с идентификатором задания IT_PROG.или SA_MAN с зарплатой более 3000 ".

Вот код, который я написал до сих пор, но оператор sql для курсора, похоже, не работает.Для таблицы DEPARTMENTS FK - это MANAGER_ID и LOCATION_ID, для таблицы EMPLOYEES FK - это JOB_ID, а в таблице LOCATIONS нет FK.Все первичные ключи установлены

Вот код:

create or replace procedure mgtLocation
is
    cursor getLoc is
        select LOCATIONS.STREET_ADDRESS, LOCATIONS.POSTAL_CODE, LOCATIONS.CITY, 
               LOCATIONS.COUNTRY, LOCATIONS.LOCATIONS_ID, LOCATIONS.LOCATIONS_ID
          from LOCATIONS 
    inner join DEPARTMENTS on DEPARTMENTS.MANAGER_ID = EMPLOYEES.EMPLOYEE_ID
    inner join LOCATIONS on LOCATIONS.LOCATION_ID = DEPARTMENTS.LOCATION_ID
         where EMPLOYEES.Job_ID in (select Job_ID from EMPLOYEES where Job_ID = 'IT_PROG' or Job_ID = 'SA_MAN' and SALARY > 3000); 
    EmpLoc getLoc%rowtype;
begin
    dbms_output.put_line('=================');
    open getLoc;
    loop
        fetch getLoc into EmpLoc;
        EXIT WHEN getLoc%NOTFOUND;
        dbms_output.put_line('Street: ' || EmpLoc.STREET_ADDRESS ||
            ' Zip Code: ' || EmpLoc.POSTAL_CODE ||
            ' City: ' || EmpLoc.CITY ||
            ' Country: ' || EmpLoc.COUNTRY);
    end loop;
    dbms_output.put_line('=================');
    close getLoc;
end;
/
execute mgtLocation;

Я получаю сообщение об ошибке для внутренних объединений и не могу понять, как их исправить, чтобы этоРабота.

1 Ответ

0 голосов
/ 06 апреля 2019

Вы можете попробовать это:

cursor getLoc is
    select LOCATIONS.STREET_ADDRESS, 
          LOCATIONS.POSTAL_CODE, LOCATIONS.CITY, 
          LOCATIONS.COUNTRY, LOCATIONS.LOCATIONS_ID, 
          LOCATIONS.LOCATIONS_ID
    from LOCATIONS 
    inner join DEPARTMENTS  on   
          DEPARTMENTS.LOCATION_ID = LOCATIONS.LOCATION_ID  
    inner join EMPLOYEES on 
          EMPLOYEES.EMPLOYEE_ID = 
          DEPARTMENTS.MANAGER_ID
    where (EMPLOYEES.Job_ID = 'IT_PROG' or 
          EMPLOYEES.Job_ID = 'SA_MAN') 
    and SALARY > 3000;
...