我有一个表员工 enter image description here
我想在调用函数select functionname(443) from dual
时创建函数,它返回序列staff_id
。
例如
1. select functionname(443) from dual return 863;
2. select functionname(443) from dual return 864;
3. select functionname(443) from dual return 866;
.
.
.
n. select functionname(443) from dual return 6733;
和863; 864; 866 ...... 6733
答案 0 :(得分:2)
"当我第一次调用函数时,它首先返回staff_id = 1;当我第二次调用函数时,它返回第一个staff_id = 2;当我及时调用函数时,它首先返回staff_id = n;然后再次重复这个循环"
程序思维通常是代码气味。关系数据库用于处理数据集。但到底是什么,让我们有一些午餐时间的乐趣:
我们需要一个包,因为包变量允许我们跨函数调用维护状态。 (还有其他方法可以做到这一点,例如上下文命名空间,但是最简单的实现包。)
create or replace package pkg_test is
function get_staff_id (p_dept_id number) return number;
end pkg_test ;
/
create or replace package body pkg_test is
-- variables to maintain state across function calls
ids_nt dbms_utility.number_array;
idx number := 0;
last_dept_id number := 0;
function get_staff_id (p_dept_id number) return number
is
return_value number;
begin
if idx = 0
or last_dept_id != p_dept_id
then
select staff_id
bulk collect into ids_nt
from staff
where dept_id = p_dept_id;
last_dept_id := p_dept_id;
idx := 0;
end if;
idx := idx + 1;
return_value := ids_nt(idx);
if idx = ids_nt.count() then
idx := 0;
end if;
return return_value;
end get_staff_id ;
end pkg_test ;
/
备注
答案 1 :(得分:0)
我将假设您要做的是调用一个函数来返回您传入的dept_id的所有staff_ids。这是一个假设,因为您根本不清楚您的问题中的要求
cnt = sum(map(condition_func, a_list))