基于游标插入表中

时间:2015-04-13 03:07:52

标签: oracle plsql cursor

我有以下表格:

表1:

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

我的要求是这样的: 如果在表1中找不到表2中的Resp_ID,我需要将GID插入到表2中。

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

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

请建议..谢谢!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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; 
/

答案 2 :(得分: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与括号之间必须至少有一个空格,否则语句会生成&#34; ORA-00933-SQL命令未正确结束&#34 ;错误。所以&#34;更新&#34;之间的空间并且&#34;(&#34;并非偶然。很多开发人员将括号放在下一行的开头,所以这对他们来说不是问题。如果你的偏好与我的一样,请注意。