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