2014-11-26 2 views
0

В моем приложении есть пользователи (и кандидат подтипа) и задания, при этом заявители могут подавать заявки на работу. У меня есть типы объектов и таблицы настройки, как показано ниже:Обновить таблицу с вложенной таблицей

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); 

Обратите внимание, что в данный момент вложенный атрибут «приложение» таблицы имеет нулевое значение для всех заданий. Предположим, что у меня уже есть некоторые заявители в таблице, называемой request_table, которые имеют тип request_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 

Но это не работает.

ответ

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'))); 

Также я предлагаю использовать некоторые другие соглашения об именах, очень сложно понять, на первый взгляд.

+0

Спасибо! Не могли бы вы объяснить, что означает «select t.a app_typ»? К чему относятся t.a и app_typ? Боюсь, я не очень разбираюсь в SQL. – ubuntunoob

+0

't' - это псевдоним' request_table', 't.a', означающий столбец' a' из 'subscription_table', который я называю' app_typ' для будущих ссылок ('s.app_typ'). – mikron

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