2012-02-13 69 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 
     ;