【问题标题】:PL/SQL MERGE Using Collection使用集合的 PL/SQL MERGE
【发布时间】:2013-07-24 19:59:34
【问题描述】:

我无法将表与集合合并。 假设我有一张桌子 emp。

这是我的 PL/SQL 代码 sn-p。

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 - 表或视图不存在。 我究竟做错了什么?或者我怎样才能做得更好。 非常感谢您提供的任何帮助。

【问题讨论】:

  • 1) 它不喜欢哪一个?类型还是合并? 2) 表emp 是否存在?
  • 表 emp 存在。它不喜欢 MERGE 中的 tmpemp。
  • type empcol 是否在数据库级别声明?例如。 create or replace type empcol as ... 。如果要在 SQL 中使用,则需要在数据库模式中全局声明类型。
  • empcol 在过程级别而不是模式级别声明。你认为这是问题所在吗?

标签: sql database oracle plsql merge


【解决方案1】:

像 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多