返回列表的Oracle函数

返回列表的Oracle函数,oracle,plsql,Oracle,Plsql,我正在尝试开发一个PLSQL函数,该函数输出一个员工姓名列表,然后通过另一个脚本运行该列表。不过我还是不太明白。我对PLSQL相当陌生,并且主要习惯于用Python构建函数,所以我可能对此的想法是错误的。最后,我想在我正在编写的另一个脚本中使用它的输出 基线脚本: SELECT EMPLOYEE FROM ( SELECT ID, EMPLOYEE, ROLE, STARTDATE, ROW_NUMBER() OVER (PARTITION BY EMPLOYEE ORDER

我正在尝试开发一个PLSQL函数,该函数输出一个员工姓名列表,然后通过另一个脚本运行该列表。不过我还是不太明白。我对PLSQL相当陌生,并且主要习惯于用Python构建函数,所以我可能对此的想法是错误的。最后,我想在我正在编写的另一个脚本中使用它的输出

基线脚本:

   SELECT EMPLOYEE FROM (
   SELECT ID, EMPLOYEE, ROLE, STARTDATE,
    ROW_NUMBER() OVER (PARTITION BY EMPLOYEE ORDER BY STARTDATE DESC, ID DESC) RN
    FROM (
    SELECT DISTINCT E.EMPLOYEE EMPLOYEE,
    E.ID ID,
    LR.DESCRIPTION ROLE, 
    ROLE_START_DATE STARTDATE
    FROM EMPLOYEES E
    JOIN ROLES R ON E.EMPLOYEE_ID = R.EMPLOYEE_ID
    JOIN LU_ROLES LR ON R.ROLE_ID = LR.ROLE_ID
    WHERE ROLE_START_DATE <= DATE '2017-12-03'))
    WHERE RN = 1
我尝试编写PLSQL函数:

CREATE FUNCTION get_employees(EMPLOYEE IN VARCHAR2)
    RETURN VARCHAR2
    IS EMPLOYEE_LIST;
    BEGIN
        SELECT EMPLOYEE FROM (
        SELECT ID, EMPLOYEE, ROLE, STARTDATE,
        ROW_NUMBER() OVER (PARTITION BY EMPLOYEE ORDER BY STARTDATE DESC, ID DESC) RN
        FROM (
        SELECT DISTINCT E.EMPLOYEE EMPLOYEE,
        E.ID ID,
        LR.DESCRIPTION ROLE, 
        ROLE_START_DATE STARTDATE
        FROM EMPLOYEES E
        JOIN ROLES R ON E.EMPLOYEE_ID = R.EMPLOYEE_ID
        JOIN LU_ROLES LR ON R.ROLE_ID = LR.ROLE_ID
        WHERE ROLE_START_DATE <= DATE '2017-12-03'))
        WHERE RN = 1
    RETURN EMPLOYEE_LIST
    END;
我知道我遗漏了一些语法,我只是不知道是什么和为什么…我正在阅读文档试图理解这一点。如果你们能提供任何帮助,我们将不胜感激


谢谢

试试这个行吗

CREATE FUNCTION get_employees(EMPLOYEE IN VARCHAR2)
    RETURN VARCHAR2
    IS EMPLOYEE_LIST VARCHAR2(200);
    BEGIN
        SELECT EMPLOYEE into EMPLOYEE_LIST FROM (
        SELECT ID, EMPLOYEE, ROLE, STARTDATE,
        ROW_NUMBER() OVER (PARTITION BY EMPLOYEE ORDER BY STARTDATE DESC, ID DESC) RN
        FROM (
        SELECT DISTINCT EMPLOYEE EMPLOYEE,
        E.ID ID,
        LR.DESCRIPTION ROLE, 
        ROLE_START_DATE STARTDATE
        FROM EMPLOYEES E
        JOIN ROLES R ON E.EMPLOYEE_ID = R.EMPLOYEE_ID
        JOIN LU_ROLES LR ON R.ROLE_ID = LR.ROLE_ID
        WHERE ROLE_START_DATE <= DATE '2017-12-03'))
        WHERE RN = 1;
    RETURN EMPLOYEE_LIST;
    END;

试试这个行吗

CREATE FUNCTION get_employees(EMPLOYEE IN VARCHAR2)
    RETURN VARCHAR2
    IS EMPLOYEE_LIST VARCHAR2(200);
    BEGIN
        SELECT EMPLOYEE into EMPLOYEE_LIST FROM (
        SELECT ID, EMPLOYEE, ROLE, STARTDATE,
        ROW_NUMBER() OVER (PARTITION BY EMPLOYEE ORDER BY STARTDATE DESC, ID DESC) RN
        FROM (
        SELECT DISTINCT EMPLOYEE EMPLOYEE,
        E.ID ID,
        LR.DESCRIPTION ROLE, 
        ROLE_START_DATE STARTDATE
        FROM EMPLOYEES E
        JOIN ROLES R ON E.EMPLOYEE_ID = R.EMPLOYEE_ID
        JOIN LU_ROLES LR ON R.ROLE_ID = LR.ROLE_ID
        WHERE ROLE_START_DATE <= DATE '2017-12-03'))
        WHERE RN = 1;
    RETURN EMPLOYEE_LIST;
    END;

如果没有表或示例数据,这可能有点猜测,但固定版本可能是这样的:

create or replace type short_string_tt as table of varchar2(100)
/

create or replace function get_employees
    ( p_role_date_cutoff roles.role_start_date%type )
    return short_string_tt
as
    l_employee_list short_string_tt;
begin
    select employee bulk collect into l_employee_list
    from   ( select employee
                  , row_number() over(partition by employee order by role_start_date desc, id desc) rn
             from   ( select distinct e.employee, e.id, lr.description, role_start_date
                      from   employees e
                             join roles r
                                  on  r.employee_id = e.id
                             join lu_roles lr
                                  on  lr.role_id = r.role_id
                      where  role_start_date <= p_role_date_cutoff )
           )
    where  rn = 1;

    return l_employee_list;
end;
/

如果返回的行数可能很大,那么您可以考虑将其设为一个值,因为这些行在获取时会流回,而不是在返回任何内容之前在内存中构建整个集合。

如果没有表或示例数据,这可能有点猜测,但固定版本可能是这样的:

create or replace type short_string_tt as table of varchar2(100)
/

create or replace function get_employees
    ( p_role_date_cutoff roles.role_start_date%type )
    return short_string_tt
as
    l_employee_list short_string_tt;
begin
    select employee bulk collect into l_employee_list
    from   ( select employee
                  , row_number() over(partition by employee order by role_start_date desc, id desc) rn
             from   ( select distinct e.employee, e.id, lr.description, role_start_date
                      from   employees e
                             join roles r
                                  on  r.employee_id = e.id
                             join lu_roles lr
                                  on  lr.role_id = r.role_id
                      where  role_start_date <= p_role_date_cutoff )
           )
    where  rn = 1;

    return l_employee_list;
end;
/

如果返回的行数可能很大,那么您可以考虑将其设为一个值,因为这些行在获取时会流式返回,而不是在返回任何内容之前在内存中构建整个集合。

;员工的参数是什么?它似乎没有在任何地方使用。也不是EMPLOYEE_列表,其声明缺少数据类型;员工的参数是什么?它似乎没有在任何地方使用。EMPLOYEE_列表也不是,其声明缺少数据类型。谢谢!但是我得到了一个错误,说明在这个SELECT语句中应该有INTO子句。它指的是:从以下位置将员工选择到员工列表中。。。这很奇怪,因为SELECT语句中有一个INTO。我是否忽略了什么?您应该重命名函数的参数。将其命名为与您选择的一列相同是一个坏主意。@grigs尝试在第二个选择中添加到。谢谢!但是我得到了一个错误,说明在这个SELECT语句中应该有INTO子句。它指的是:从以下位置将员工选择到员工列表中。。。这很奇怪,因为SELECT语句中有一个INTO。我是否忽略了什么?您应该重命名函数的参数。将其命名为与您选择的一列相同是个坏主意。@grigs尝试在第二个选择中添加到