为循环oracle创建函数

时间:2017-05-26 10:48:28

标签: sql oracle plsql

我有一个表员工 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

2 个答案:

答案 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. 维持这样的全球状态通常不被视为良好做法。它在这里工作,但在更复杂的过程中,很容易通过我们不期望的电话来改变状态。
  2. 状态维持在会话级别。两个单独的会话将获得两组数据,而不是一个交错集。因此,对于使用连接池的应用程序来说,这不是一个好的实现。

答案 1 :(得分:0)

我将假设您要做的是调用一个函数来返回您传入的dept_id的所有staff_ids。这是一个假设,因为您根本不清楚您的问题中的要求

cnt = sum(map(condition_func, a_list))