基于游标插入 table

Insert into a table based on a cursor

我有下表:

Table1:

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

Table 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 |     |

我的要求是这样的: 如果 Table2 中的 Resp_ID 在 Table1.

中找不到,我需要将 GID 插入 Table2

因此我编写了以下脚本,但它不起作用:

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

请指教..谢谢!

请试试这个代码,

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;

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

如果您可以从 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和括号之间必须至少有一个space,否则语句会产生"ORA-00933 - SQL command not properly ended"错误。所以 "update" 和 "(" 之间的 space 不是偶然的。许多开发人员将括号放在下一行的开头,所以这对他们来说不是问题。如果你的喜好和我一样,请注意。