2013-07-24 29 views
0

我在將表與集合合併時遇到問題。 假設我有一個表emp。PL/SQL MERGE使用集合

這是我的PL/SQL代碼片段。

TYPE empcol is table of emp%ROWTYPE INDEX BY BINARY_INTEGER; 
tmpemp empcol; 

-- Code here to load data from a CSV file into tmpemp collection 
-- tmpemp(1).emp_id := parsedstring 
-- etc. 
MERGE INTO emp A using tmpemp B ON A.emp_id = B.emp_id 
WHEN MATCHED THEN UPDATE SET A.fname = B.fname, A.lname = B.lname 
WHEN NOT MATCHED THEN INSERT (emp_id, fname, lname) VALUES (b.emp_id, b.fname, b.lname); 

編譯器不喜歡它。它的拋出ORA-0942 - 表或視圖不存在。 我在做什麼錯?或者我怎樣才能做得更好。 非常感謝您提供的任何幫助。

+0

1)哪一個不喜歡? TYPE還是MERGE? 2)是否存在表'emp'? –

+0

表emp存在。它不喜歡MERGE中的tmpemp。 –

+0

是否在數據庫級別聲明瞭「type empcol」?例如。 '創建或替換類型empcol爲...'。如果您想在SQL中使用它,則需要在數據庫模式中全局聲明類型。 – ThinkJet

回答

4

像emp%ROWTYPE或TABLE OF ... INDEX BY ...這樣的PL/SQL類型不能用於SQL查詢。
該類型必須聲明爲SQL查詢中要使用的SQL類型(而不是PL/SQL類型)。

試試這個辦法(例子):

create table emp(
    firstname varchar2(100), 
    salary number 
); 

insert into emp values('John', 100); 
commit; 

create type my_emp_obj is object(
    firstname varchar2(100), 
    salary number 
); 
/

create type my_emp_obj_table is table of my_emp_obj; 
/

declare 
    my_emp_tab my_emp_obj_table; 
begin 
    null; 
    my_emp_tab := my_emp_obj_table(my_emp_obj('John', 200), my_emp_obj('Tom', 300)); 

    MERGE INTO emp 
    USING (SELECT * FROM TABLE(my_emp_tab)) src 
    ON (emp.firstname = src.firstname) 
    WHEN MATCHED THEN UPDATE SET salary = src.salary 
    WHEN NOT MATCHED THEN INSERT VALUES(src.firstname, src.salary); 
end; 
/

select * from emp; 

FIRSTNAME    SALARY 
----------------------- ---------- 
John       200 
Tom       300 
+0

太好了。這工作!非常感謝! –