2013-07-24 3 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 - Table или View не существует. Что я делаю неправильно? или Как я могу сделать это лучше. Большое спасибо за любую помощь, которую вы можете предоставить.

+0

1) Какой из них не нравится? TYPE или MERGE? 2) присутствует таблица 'emp' вообще? –

+0

таблица emp есть. Ему не нравится tmpemp в MERGE. –

+0

Объявлен ли 'тип empcol' на уровне базы данных? Например. 'create или replace type empcol as ...'. Вам нужно объявить тип глобально в схеме базы данных, если вы хотите использовать его в SQL. – ThinkJet

ответ

4

Типы PL/SQL, такие как emp% ROWTYPE или TABLE OF ... INDEX BY ... не могут использоваться в SQL-запросах.
Тип должен быть объявлен как тип SQL (не как тип PL/SQL), который будет использоваться в 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

Отлично. Это сработало! Большое спасибо! –

Смежные вопросы