2015-09-02 5 views
0

У меня есть две равные таблицы Oracle, которые имеют одинаковые имена столбцов.Вставьте данные в таблицу из таблицы anothe в Oracle

1) DoctorProfile_New
2) DoctorProfile_Old

Обе таблицы разделяют ту же структуру следующим образом.

DOCREGNO  NOT NULL VARCHAR2(10) 
DOCCATOGARY   NOT NULL VARCHAR2(10) 
ANAME1      VARCHAR2(50) 
ANAME2      VARCHAR2(50) 
ANAME3      VARCHAR2(50) 
ANAME4      VARCHAR2(50) 
ANAME5      VARCHAR2(50) 
ANAME6      VARCHAR2(50) 
ANAME7      VARCHAR2(50) 
ANAME8      VARCHAR2(50) 
ANAME9      VARCHAR2(50) 
AGENDER      VARCHAR2(2) 
ARESCTOWN     VARCHAR2(100) 
DOCRCODE      NUMBER 

Что мне нужно сделать, это вставить все данные из таблицы DoctorProfile_Old в DoctorProfile_New. Единственная разница для столбца DOCREGNO, мне нужно вставить новое твердое кодированное значение.

insert into DoctorProfile_New 
(
DOCREGNO,  
DOCCATOGARY,  
ANAME1,   
ANAME2,   
ANAME3,   
ANAME4,   
ANAME5,   
ANAME6,   
ANAME7,   
ANAME8,   
ANAME9,   
AGENDER,   
ARESCTOWN 
) 
values 
('000081', 
(
select 
DOCCATOGARY,  
ANAME1,   
ANAME2, 
ANAME3,   
ANAME4,   
ANAME5,   
ANAME6, 
ANAME7,   
ANAME8,   
ANAME9,   
AGENDER,   
ARESCTOWN 
from DoctorProfile_Old WHERE DOCREGNO='T07004' 
) 
) 

Я попытался выше запрос и он всегда дает ошибку Oracle ORA-00947: not enough values

+0

Чтобы достичь этого, вам необходимо написать процедуру PL/SQL. – learningloop

+0

@learningloop - Зачем вам нужен pl/sql? Это просто синтаксическая ошибка с выбранной частью инструкции insert. – booyaa

+0

@booyaa Я не думаю, что DOCREGNO должен принять фиксированное число. Таким образом, до количества строк в «DoctorProfile_Old» нужна логика для автоматизации генерации, если пользователь не хочет вводить ее вручную. – learningloop

ответ

2

Как об этом?

insert into DoctorProfile_New 
(DOCREGNO,DOCCATOGARY,ANAME1,ANAME2,ANAME3,ANAME4,ANAME5,ANAME6,ANAME7,ANAME8,ANAME9,AGENDER,ARESCTOWN) 
select '000081' as DOCREGNO, DOCCATOGARY,ANAME1,ANAME2,ANAME3,ANAME4,ANAME5,ANAME6,ANAME7,ANAME8,ANAME9,AGENDER,ARESCTOWN from DoctorProfile_Old WHERE DOCREGNO='T07004'; 

Если вы хотите вставить DOCREGNO автоматически вместо жесткого значения с покрытием, вы должны создать триггер и использовать значение последовательности.

CREATE OR REPLACE TRIGGER DoctorProfile_New_TRG 
BEFORE INSERT OR UPDATE ON DoctorProfile_New 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
BEGIN 

    if :new.DOCREGNO is null then 
     select lpad(some_sequence.nextval, 6, '0') into :new.DOCREGNO from dual; 
    end if; 

END; 

Вставьте все данные DoctorProfile_Old

insert into DoctorProfile_New 
(DOCREGNO,DOCCATOGARY,ANAME1,ANAME2,ANAME3,ANAME4,ANAME5,ANAME6,ANAME7,ANAME8,ANAME9,AGENDER,ARESCTOWN) 
select null,DOCCATOGARY,ANAME1,ANAME2,ANAME3,ANAME4,ANAME5,ANAME6,ANAME7,ANAME8,ANAME9,AGENDER,ARESCTOWN from DoctorProfile_Old; 
2

Вы можете использовать insert select сделать это;

insert into DoctorProfile_New (
    DOCREGNO,  
    DOCCATOGARY,  
    ANAME1,   
    ANAME2,   
    ANAME3,   
    ANAME4,   
    ANAME5,   
    ANAME6,   
    ANAME7,   
    ANAME8,   
    ANAME9,   
    AGENDER,   
    ARESCTOWN 
) 
select 
    '000081', 
    DOCCATOGARY,  
    ANAME1,   
    ANAME2, 
    ANAME3,   
    ANAME4,   
    ANAME5,   
    ANAME6, 
    ANAME7,   
    ANAME8,   
    ANAME9,   
    AGENDER,   
    ARESCTOWN 
from DoctorProfile_Old 
WHERE DOCREGNO='T07004'; 
Смежные вопросы