如何定义一个将用作函数内部IN参数的参数?

问题描述

我想做一个接收两个参数的函数。第一个代表一组员工的薪水,第二个代表一组部门的代码。 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$
  • sql语句中IN参数的类型是什么?
  • 是否存在通用类,以便在偶尔的数据库交换(例如到Oracle)上允许某种可移植性?
  • 如何在休眠查询调用函数

解决方法

在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;
/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...