0

テーブルをコレクションとマージするのに問題があります。テーブル emp があるとします。

これが私の 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 - テーブルまたはビューが存在しません。私は何を間違っていますか?またはどうすればこれを改善できますか。ご協力いただきありがとうございます。

4

1 に答える 1

5

emp%ROWTYPE や TABLE OF ... INDEX BY ... などの PL/SQL 型は、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
于 2013-07-24T20:27:14.393 に答える