基于游标插入 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 不是偶然的。许多开发人员将括号放在下一行的开头,所以这对他们来说不是问题。如果你的喜好和我一样,请注意。
我有下表:
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 不是偶然的。许多开发人员将括号放在下一行的开头,所以这对他们来说不是问题。如果你的喜好和我一样,请注意。