добавить значения в массив рекурсивно PL / SQL - PullRequest
1 голос
/ 08 октября 2019

У меня есть две таблицы INFOAGENT (информация об агенте), HIERARCHIAGENT (иерархическое вложение каждого агента). Я хочу сделать процедуру (pl / sql), которая рекурсивно добавляет в массив парамидную иерархию компании до тех пор, пока код агента не будет переданв параметре, и вернуть начало массива генеральным директором

Вот данные.

INFOAGENT 
ID           NAME
P001         AAAA
P002         BBBB
P003         CCCC
P004         DDDD
P005         EEEE
P006         FFFF

HIERARCHIAGENT 
INCHARGE     IDAGENT
P001         P002
P001         P003         
P002         P005
P003         P006
P003         P004          

Я пробовал это

type hierarchie is table of INFOAGENT.ID%TYPE index by binary_integer;
create or replace PROCEDURE AGENTHIERARCHIE ( codeagent INFOAGENT.ID%TYPE,
                                      arrayresponse out hierarchie%TYPE)
AS

DECLARE

arrayresponse hierarchie;

cursor cur is SELECT ID FROM INFOAGENT where ID= codeagent

begin 

FOR rec_agent in cur LOOP
// i don't know how to do it here 

end loop;

EXCEPTION
    WHEN OTHERS THEN

        DBMS_OUTPUT.PUT_LINE(replace(sqlerrm,'ORA-','ORA_'));

END AGENTHIERARCHIE ;

1 Ответ

0 голосов
/ 08 октября 2019

Я думаю, что это может удовлетворить ваши требования. По крайней мере, это может помочь вам начать.

CREATE OR REPLACE PACKAGE hierarcy_defs AS
  TYPE hierarcy IS TABLE OF INFOAGENT.ID%TYPE INDEX BY BINARY_INTEGER;
END hierarcy_defs;

CREATE OR REPLACE PROCEDURE agenthierarchy (
  codeagent     IN     infoagent.id%TYPE,
  p_index       IN     BINARY_INTEGER,
  arrayresponse IN OUT hierarcy_defs.hierarcy)
AS
  i BINARY_INTEGER;
  l_codeagent infoagent.id%TYPE;
BEGIN
  i := p_index;

  arrayresponse(i) := codeagent;

  BEGIN
    SELECT incharge
    INTO   l_codeagent
    FROM   hierarchiagent
    WHERE  idagent = codeagent;

    i := i + 1;

    agenthierarchy(l_codeagent, i, arrayresponse);
  EXCEPTION 
    WHEN NO_DATA_FOUND THEN
      FOR j IN arrayresponse.FIRST .. arrayresponse.LAST
      LOOP
        DBMS_OUTPUT.PUT_LINE(arrayresponse(j));
      END LOOP;
  END;  
EXCEPTION 
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(REPLACE(SQLERRM,'ORA-','ORA_'));
END agenthierarchy;

Анонимный блок для тестирования:

DECLARE
  l_arrayresponse hierarcy_defs.hierarcy;
BEGIN
  agenthierarchy('P006', 1, l_arrayresponse);
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...