вставлять в массив данных в таблицы оракула с самостоятельным соединением - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть таблица с именем p_relations, которая имеет 4 столбца employeename, access, manager_name, comments, и я могу получить эти данные из таблицы p_employees, которая имеет emp_id, name, manager_id.

Например, в таблице p_employees у меня есть эти данные:

1001  kiran  2001
2001  rahul  3001

сейчас в таблице p_relations я должен вставить данные, подобные этой

kiran  1   rahul

на самом деле мы должны вставить объемные данные.Не могли бы вы предложить мне процедуру или запрос для этого.

Я разработал простую процедуру, но она не работает:

    DECLARE
    e_name VARCHAR2(20);
    m_name VARCHAR2(20);
    manager_id VARCHAR2(20);
     CURSOR c_lecturer IS
       SELECT name,manager_id FROM p_employees;
   BEGIN
      OPEN c_lecturer;
     LOOP
     FETCH c_lecturer INTO e_name, manager_id;
         SELECT name INTO manager_name FROM WKS_CONT.SIBER_EMPLOYEES WHERE emp_id=manager_id;

          INSERT INTO p_relations  VALUES(e_name, ,1,manager_name);

    EXIT WHEN c_lecturer%NOTFOUND;
     END LOOP;
    CLOSE c_lecturer;
 END;

Пожалуйста, помогите мне в этом

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Похоже, вы могли бы использовать иерархический запрос, который использует синтаксис CONNECT BY PRIOR, и вместо цикла PL / SQL просто используйте простой INSERT INTO SELECT...:

    INSERT INTO p_relations
    SELECT name, 1, (SELECT name FROM p_employees m WHERE e.manager_id = m.emp_id)
    FROM p_employees e
    START WITH manager_id IS NULL -- Specify how to identify your top manager, the big boss.
    CONNECT BY emp_id = PRIOR manager_id;
0 голосов
/ 13 февраля 2012

Если это вообще возможно, обычно более эффективно использовать bulk collect.Это выглядит немного страшнее, но оно того стоит, чтобы понять;для начала он делает меньше DML

declare

   cursor c_lecturer is
    select e.name, 1, m.name
      from p_employees e
      left outer join wks_cont.siber_employees m
        on e.emp_id = m.manager_id
           ;

   t__lecturer is table of c_lecturer%rowtype index by binary_integer;
   t_lecturer t__lecturer;

begin

   open c_lecturer;
   loop

      fetch c_lecturer bulk collect 
       into t_lecturer limit 1000;

      exit when t_lecturer.count = 0;

      forall i in t_lecturer.first .. t_lecturer.last loop
         insert into p_relations(e_name, access, manager_name)
         values t_lecturer(i)
                ;

      commit;

   end loop;
   close c_lecturer;

end;
/

Конечно, еще более эффективна простая вставка:

insert into p_relations(e_name, access, manager_name)
select e.name, 1, m.name
  from p_employees e
  left outer join wks_cont.siber_employees m
    on e.emp_id = m.manager_id
       ;
0 голосов
/ 13 февраля 2012

вероятно, не у всех сотрудников есть менеджер. Вы можете сделать это с помощью левого соединения:

INSERT into p_relations
SELECT a.name, 1, b.name as manager_name 
FROM WKS_CONT.SIBER_EMPLOYEES a
    left join WKS_CONT.SIBER_EMPLOYEES b on (b.emp_id=a.manager_id);

Ваша процедура может быть улучшена следующим образом:

DECLARE
e_name VARCHAR2(20);
m_name VARCHAR2(20);
manager_id VARCHAR2(20);
 CURSOR c_lecturer IS
   SELECT name,manager_id FROM p_employees;
BEGIN 
   OPEN c_lecturer; 
   LOOP 
       FETCH c_lecturer 
       INTO e_name, manager_id; 

       BEGIN
         SELECT name INTO manager_name 
         FROM WKS_CONT.SIBER_EMPLOYEES WHERE emp_id=manager_id;
       EXCEPTION when no_rows_found then manager_name:=null;
       END;

       INSERT INTO p_relations  VALUES(e_name, 1, manager_name);

EXIT WHEN c_lecturer%NOTFOUND;
 END LOOP;
CLOSE c_lecturer;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...