我有以下表格:
表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;
/
请建议..谢谢!
答案 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;并非偶然。很多开发人员将括号放在下一行的开头,所以这对他们来说不是问题。如果你的偏好与我的一样,请注意。