2014-12-26 1 views
0

У меня есть ниже курсора, который я использую в PL функции/SQL т.е. getEmployeeInfoСоздавать курсорный запрос динамический по своей природе?

CURSOR employeeDepartment IS 
     SELECT * 
     FROM Employee 
     LEFT OUTER JOIN Department ON Department.empID = Employee.ID 
     WHERE Employee.STATE = 'Washington' 
     ORDER BY Employee.JoiningDate desc; 

Мне нужно изменить getEmployeeInfo функцию, чтобы принять EmployeeID в качестве входного параметра и добавить к курсора employeeDepartment если employeeId>0.

Я новичок в программировании PL/SQL. Похоже, мне нужно двигаться в направлении REF-CURSOR, но я не могу точно это сделать?

Так курсор запрос должен быть ниже, если Employee.id> 0 в противном случае оно должно быть таким же, как и выше

CURSOR employeeDepartment IS 
     SELECT * 
     FROM Employee 
     LEFT OUTER JOIN Department ON Department.empID = Employee.ID 
     WHERE Employee.STATE = 'Washington' 
     and Employee.id= 100 
     ORDER BY Employee.JoiningDate desc; 

UPDATE: - @APC решение работало. Идя с этим решением, если я пользователь хочет передать массив EmpId вместо единого Id я попытался ниже

Сначала создал тип массива с create type p_employee_arr as table of number

CURSOR employeeDepartment (p_employee_arr IN num_array) IS 
    SELECT * 
    FROM Employee 
    LEFT OUTER JOIN Department ON Department.empID = Employee.ID 
    WHERE Employee.STATE = 'Washington' 
    and (Employee.id in (SELECT column_value FROM TABLE(p_employee_arr)) or p_employee_arr is null) 
    ORDER BY Employee.JoiningDate desc; 

Но все-таки вернуть полный набор результатов, если я предоставить один элемент в массиве

+0

Ваша модель данных кажется немного странной - обычно сотрудники назначаются на отдел, а не наоборот. – APC

+0

Я просто приведу пример, чтобы провести аналогию с проблемой, с которой я столкнулся. Да, это не так. Но это не проблема здесь – user3198603

ответ

1

Ваш вопрос немного неоднозначным, но я думаю, что вы хотите ограничить набор результатов, когда передается отрудник ID, в противном случае вы хотите, чтобы все записи для государства.

CURSOR employeeDepartment (p_employee_id in number) IS 
    SELECT * 
    FROM Employee 
    LEFT OUTER JOIN Department ON Department.empID = Employee.ID 
    WHERE Employee.STATE = 'Washington' 
    and (p_employee_id = 0 or Employee.id= p_employee_id) 
    ORDER BY Employee.JoiningDate desc; 
+0

Точно я ищу это только. Спасибо – user3198603

+0

Еще одна небольшая модификация, которую я хочу, это то, что пользователь передает массив empId вместо одиночного empId, тогда я хочу, чтобы эти эти конкретные данные получали в противном случае все. Должно ли это быть ... (p_arr_employee_id имеет значение null или Employee.id в (p_arr_employee_id)) – user3198603

+0

Можете ли вы PLZ дать некоторое представление о моем обновленном сообщении – user3198603

1

Я думаю, что вам нужно курсор с параметром, как показано ниже

CURSOR employeeDepartment (employee_id_in IN number) 
IS 
     SELECT * 
     FROM Employee 
     LEFT OUTER JOIN Department ON Department.empID = Employee.ID 
     WHERE Employee.STATE = 'Washington' 
     and 
     (case 
       when (employee_id_in > 0) and (Employee.id= employee_id_in) then 1 
     else 0 
     end) = 1 
     ORDER BY Employee.JoiningDate desc; 

, следовательно, вы можете открыть курсор, как

open employeeDepartment(100) 

для получения дополнительной информации см http://www.techonthenet.com/oracle/cursors/declare.php

+0

Я хочу добавить и предложение «и Employee.id = ..» только при empId> 0. С вашим решением всегда будет добавлено условие – user3198603

+0

использовать аргументы 'case' в' where'. – Exhausted

+0

Можете привести пример здесь – user3198603

Смежные вопросы