更新具有嵌套表的表

时间:2014-11-26 06:12:06

标签: oracle orm plsql user-defined-types

我的应用程序拥有用户(和子类型申请人)和工作,申请人可以提交工作申请。我有对象类型和表格设置如下:

create or replace type user_typ as object(
  user_id number(19,0),
  username nvarchar2(40 char)
)NOT FINAL;

我从这里继承了applicant_typ:

create or replace type applicant_typ under user_typ (
  resume_text nclob
);

我的设计涉及申请人可以申请的工作。为此,我按如下方式创建了一个application_typ:

create or replace TYPE Application_typ AS OBJECT (
  application_id NUMBER,
  candidate applicant_typ,
  time_of_app DATE
);

CREATE TYPE Application_tab IS TABLE OF Application_typ; 

现在我创建了一个名为Job_typ的对象类型,以及一个包含这些对象的表,其中有一个用于应用程序的嵌套表:

CREATE OR REPLACE TYPE Job_typ AS OBJECT (
  job_ID NUMBER,
  description NVARCHAR2(1000),
  name NVARCHAR2(200),
  application Application_tab
);

CREATE TABLE Job_tab OF Job_typ 
NESTED TABLE application STORE AS application_nt;

所有这一切都很好。我将一些作业插入job_tab表中,如下所示:

INSERT INTO job_tab VALUES (1, 'The Software Developer will be responsible for authoring high-quality software...', 
  'Software Developer', NULL);

INSERT INTO job_tab VALUES (2, 'This position requires a team player and a self-starter with experience leading... ',
  'Project Manager', NULL);

INSERT INTO job_tab VALUES (3, 'In the first year of this unique 24-month program, you rotate through various...', 
  'Store Manager', NULL);

请注意,此时嵌套表属性的应用程序'具有所有作业的NULL值。假设我已经在名为applicant_table的表中有一些申请人,其类型为applicant_typ。如何为作业创建和插入新应用程序?

我尝试了一些类似的事情:

UPDATE job_tab
SET application = application_typ (
  1,  
  Applicant_typ(SELECT VALUE(a) from applicant_table a where user_id=1),  
  '12-MAY-2014') 
WHERE job_id=1

但这不起作用。

1 个答案:

答案 0 :(得分:0)

考虑这样的事情

merge into job_tab D
using (select t.a app_typ from applicant_table t where t.a.user_id = 1) S
on (job_id = 1)
when matched then
   update
      set application = Application_tab(Application_typ(1,
                                                        s.app_typ,
                                                        to_date('12-05-2014', 'DD-MM-YYYY')));

此外,我建议使用其他一些命名约定,乍一看非常复杂。