我创建了以下函数,该函数将返回登录用户可以访问的工作空间详细信息。
但是这个函数只返回选择列表中的第一条记录。
我需要将所有记录显示为输出。
请修改它并告诉我。
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
我需要像上面一样逐一输出
答案 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>