Как вернуть несколько значений через функцию - PullRequest
0 голосов
/ 14 мая 2018

Я создал следующую функцию, которая будет возвращать детали рабочего пространства, к которым имеет доступ авторизованный пользователь.

Но эта функция возвращает только первую запись из списка выбора.

Мне нужно, чтобы все записи отображались как выходные.

Пожалуйста, измените его и дайте мне знать.

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 голосов
/ 14 мая 2018

Я не знаю, что на самом деле делает этот код (не могу его протестировать), но это может быть причиной:

    ...
    RETURN l_teams;    
  END LOOP;

Как только код достигает оператора RETURN, он завершаетсяцикл и ... ну, возвращает то, что в данный момент находится в переменной L_TEAMS.Поэтому переместите RETURN из цикла:

     ...
  END LOOP;
  RETURN l_teams;    

Если он все еще не работает должным образом (что может быть так), взгляните на конвейерные функции (например, на Oracle-base ), поскольку они предназначены для возврата значений, которые вы, похоже, ищете.

Простой пример:

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>
...