问题描述
我想做一个接收两个参数的函数。第一个代表一组员工的薪水,第二个代表一组部门的代码。 P_IN_SALARIES和P_IN_DEPARTMENTS_CODES参数都将用作 查询的IN函数中的参数,如下面的代码所示:
CREATE OR REPLACE FUNCTION public.get_employees_id(P_IN_SALARIES WHICH_TYPE_COMES_HERE,P_IN_DEPARTMENTS_CODES WHICH_TYPE_COMES_HERE)
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
v_employees_ids text;
begin
select STRING_AGG(employee.id || '',',') into v_employees_ids
from employee
inner join departament on department.id = employee.departament_id
where employee.salary in (P_IN_SALARIES)
and department.code in (P_IN_DEPARTMENTS_CODES);
RETURN v_employees_ids;
END;
$function$
解决方法
在Oracle中,您可以使用集合数据类型:
CREATE TABLE number_list IS TABLE OF NUMBER;
然后,您可以使用MEMBER OF
运算符而不是IN
:
CREATE FUNCTION public.get_employees_id(
P_IN_SALARIES IN number_list,P_IN_DEPARTMENTS_CODES IN number_list
) RETURNS VARCHAR2
IS
v_employees_ids VARCHAR2(4000);
BEGIN
SELECT LISTAGG( id,',' ) WITHIN GROUP ( ORDER BY id )
INTO v_employees_ids
FROM employee e
inner join departament d
on ( d.id = e.departament_id )
WHERE e.salary MEMBER OF P_IN_SALARIES
AND d.department.code MEMBER OF P_IN_DEPARTMENTS_CODES;
RETURN v_employees_ids;
END;
/