2015-04-13 4 views
0

У меня есть следующие таблицы:Вставка в таблицу на основе курсора

Table1:

| Resp_ID | Description | 
    |  1 |   AA | 
    |  2 |   AA | 
    |  3 |   AA | 

Таблица 2:

| ORG_ID | Resp_ID |  Date | GID | 
    | 001 |  1 | 08-SEP-14 | 112 | 
    | 002 |  1 | 08-SEP-14 | 112 | 
    | 003 |  3 | 08-SEP-14 | 114 | 
    | 004 |  5 | 08-SEP-14 |  | 
    | 005 |  5 | 08-SEP-14 |  | 
    | 006 |  6 | 08-SEP-14 |  | 

Мое требование так: мне нужно вставьте GID в таблицу2, если Resp_ID в таблице 2 не найден в таблице 1.

Поэтому я написал ниже сценарий, но он не работает:

DECLARE 
     CURSOR resp_id_cursor 
     IS 
     SELECT resp_id 
     FROM Table1 
     WHERE description LIKE '%AA%'; 

     flag NUMBER; 

    BEGIN 
     FOR resp_cur IN resp_id_cursor 
     SELECT 1 
     INTO flag 
     FROM Table2 a 
     WHERE a.resp_id = resp_cur.resp_id; 

     IF flag != 1 THEN 
      INSERT INTO Table2 (GID) 
      VALUES(115); 
     END IF; 
     END LOOP; 
    END; 
    /

Пожалуйста, советы .. Спасибо!

ответ

0

Пожалуйста, попробуйте этот код,

declare 

     cursor r1 is 
    SELECT Resp_ID 
    FROM Table2; 

    gid1 number:= 115; 
    flag number:=0; 
    begin 

    FOR c1 in r1 
    LOOP 
    begin 
    dbms_output.put_line('in here'); 
    SELECT count(*) 
     INTO flag 
     FROM Table1 a 
     WHERE a.Resp_ID = c1.Resp_ID ; 
     dbms_output.put_line('flag is '||flag); 
    dbms_output.put_line(c1.Resp_ID); 
     IF (flag = 0) THEN 
     dbms_output.put_line('doesnt exist'); 
    update Table2 set gid=gid1 where Resp_ID =c1.Resp_ID ;  
     dbms_output.put_line('update value for Resp_ID '||c1.Resp_ID); 
     dbms_output.put_line('gid inserted is '||gid1); 
    flag:=0; 
    commit; 
    dbms_output.put_line('commited'); 
     END IF; 

     exception 
     when no_Data_found then 
     dbms_output.put_line('no data found for Resp_ID '||c1.Resp_ID); 
     end; 
     gid1:=gid1+1; 
    END LOOP; 

    END; 
+0

спасибо! Я изменил ваш код в соответствии с моими более подробными спецификациями, и он отлично работает! – Law

0

Count (*) не будет поднимать исключение. Вы должны попробовать, как это:

DECLARE 
CURSOR resp_id_cursor IS SELECT resp_id FROM Table1 WHERE description LIKE '%AA%'; 
flag NUMBER; 
Gid_ number; 
BEGIN 
Select max(gid) into gid_ from table2; 
FOR resp_cur IN resp_id_cursor loop 
    Begin 
    SELECT 1 INTO flag FROM Table2 a 
     WHERE a.resp_id = resp_cur.resp_id; 
    Exception when no_data_found then 
    Gid_:=gid_+1; 
    INSERT INTO Table2 (GID) VALUES(gid_); 
    End; 
END LOOP; 
END; 
/
0

Если вы можете создать результирующий набор из Table2 выставляя ключевое поле, поле, которое вы хотите обновлены и значение, которое вы хотите, обновлена, Oracle позволяет эту форму Update заявления :

update (
    select t2.Resp_ID, t2.GID, 115 as NewGID 
    from Table2 t2 
    left join Table1 t1 
     on t1.Resp_ID = t2.Resp_ID 
    where t1.Resp_ID is null 
) 
    set GID = NewGid; 

ПРИМЕЧАНИЕ: Существует один странный аспект этого заявления. Когда я пишу код SQL, мне нравится помещать открывающиеся круглые скобки подзаголовки в соответствие с последним символом предыдущей строки.

join(
    <subquery> 
) alias 

Так что я предпочел бы, чтобы начать update заявления выше, как это:

update(

Однако для Update заявления, должно быть по крайней мере один пробел между update и скобкой или оператор генерирует ошибка «ORA-00933 - SQL не правильно закончилась». Таким образом, пространство между «обновлением» и «(» не случайно. Многие разработчики помещают скобки в начале следующей строки, поэтому для них это не проблема. Если ваши предпочтения похожи на мои, имейте в виду.

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