2012-02-13 78 views
0

我有一个表称为p_relations其中有4列employeenameaccessmanager_namecomments,我可以从具有emp_idnamemanager_idp_employees得到这些细节。插入到批量数据与自己的Oracle表加入

例如在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; 

请帮我在这

+0

什么“不工作”?它是不是编译,它执行,但没有做你期望的?您可以提供的任何错误消息? – Dan 2012-02-13 14:52:03

+0

'e_name VARCHAR2(20)':名称长度不能超过20? – 2012-02-13 15:13:13

回答

0

可能不是所有的empoyees有一个经理。 你可以用左手做加盟:

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; 
2

这听起来像你可以使用一个分层查询,它使用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

如果可能的话它通常更有效地使用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 
     ;