Oracle 构建游标查询本质上是动态的?

Oracle 构建游标查询本质上是动态的?,oracle,plsql,cursor,Oracle,Plsql,Cursor,我在下面的游标中使用了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.Joinin

我在下面的游标中使用了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;
更新:-@APC解决方案有效。如果我的用户希望传递empId数组而不是我在下面尝试的单个Id,那么使用该解决方案

首先使用
创建类型p\u employee\u arr作为数字表创建数组类型

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;

但如果我在数组中提供一个元素,它仍然会返回完整的结果集,我想您需要如下参数的游标

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)

有关更多信息,请参考

您的问题有点含糊不清,但我认为您希望在传递员工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;

我只想在empId>0时附加and子句“and Employee.id=…”。在您的解决方案中,它总是会在
where
子句中附加conditionuse
case
语句。您能在此提供示例吗?您的数据模型似乎有点奇怪-通常员工被分配到一个部门,而不是相反。我只是引用一个例子来从我所面临的问题中进行类比。是的,这可能是不对的。但这不关我的事,我只是在找这个。感谢我想要的一个小修改是用户正在传递empId的数组而不是单个empId,然后我想要这些特定的信息,否则得到所有。应该是…(p_arr_employee_id为null或employee.id in(p_arr_employee_id))