如何通过函数

时间:2018-05-14 16:58:10

标签: oracle-apex oracle-apex-5 oracle-apex-5.1

我创建了以下函数,该函数将返回登录用户可以访问的工作空间详细信息。

但是这个函数只返回选择列表中的第一条记录。

我需要将所有记录显示为输出。

请修改它并告诉我。

CREATE OR REPLACE FUNCTION "F_WORKSPACE_LOGIN_USERS" (
  p_email VARCHAR2
) RETURN VARCHAR2 IS

  l_error       VARCHAR2(1000);
  l_workspace   VARCHAR2(1000);
  l_teams       VARCHAR2(1000);
  l_team        VARCHAR2(1000);
BEGIN
  FOR i IN ( SELECT a.name workspace,
                    a.team_id id
             FROM slackdatawarehouse.teams a,
                  ( SELECT TRIM(workspaces) workspaces
                    FROM alluser_workspaces_fact
                    WHERE lower(email) = lower(p_email)
  ) b
             WHERE a.team_id IN ( SELECT c.team_id
                                  FROM slackdatawarehouse.team_tokens c
  )
                   OR   instr(', '
  || lower(b.workspaces),', '
  || lower(a.name) ) > 0
  ORDER BY 1 ) LOOP
    l_teams := l_team
    || ','
    || i.id;
    l_teams := ltrim(rtrim(l_teams,','),',');
    RETURN l_teams;
  END LOOP;
END;

当前输出为:

T6HPQ5LF7,T6XBXVAA1,T905JLZ62,T7CN08JPQ,T9MV4732M,T5PGS72NA,T5A4YHMUH,TAAFTFS0P,T69BE9T2A,T85D2D8MT,T858U7SF4,T9D16DF5X,T9DHDV61G,T9D17RDT3,T5Y03HDQ8,T5F5QPRK7

必需的输出是:

T6HPQ5LF7
T6XBXVAA1
T905JLZ62

我需要像上面一样逐一输出

1 个答案:

答案 0 :(得分:1)

我不知道那段代码究竟做了什么(无法​​测试),但这可能是罪魁祸首:

    ...
    RETURN l_teams;    
  END LOOP;

一旦代码到达RETURN语句,它就会退出循环并且......好吧,返回当前L_TEAMS变量中的内容。因此,将RETURN移出循环:

     ...
  END LOOP;
  RETURN l_teams;    

如果它仍然无法按预期工作(可能是这种情况),请查看流水线函数(例如,在Oracle-base site上),因为它们旨在返回你似乎在寻找的价值观。

一个简单的例子:

SQL> create or replace type t_dp_row as object
  2    (deptno number,
  3     dname  varchar2(20));
  4  /

Type created.

SQL> create or replace type t_dp_tab is table of t_dp_row;
  2  /

Type created.

SQL> create or replace function f_depts
  2    return t_dp_tab pipelined
  3  is
  4  begin
  5    for cur_r in (select deptno, dname from dept)
  6    loop
  7      pipe row(t_dp_row(cur_r.deptno, cur_r.dname));
  8    end loop;
  9    return;
 10  end;
 11  /

Function created.

SQL> select * from table(f_depts);

    DEPTNO DNAME
---------- --------------------
        10 ACCOUNTING
        20 RESEARCH
        30 SALES
        40 OPERATIONS

SQL>