我将从一个表中获取每一行,并在另一个表中找到相应的行。然后我将使用我已经获得的id来更新第二个表的行。 我试着运行我的脚本,但我遇到了一些问题。 我实际上尝试创建一个循环然后将每行的id放在一个变量中以将它们用于我的更新语句,但是Pl向我显示一个错误,它告诉我“没有找到数据”
我未完成的剧本
DECLARE
tbl1Count number(4);
counter number(4);
MyO66ID number(8);
Begin
select Count(*) INTO tbl1Count from crbank ;
<<my_loop>>
For counter IN 1..tbl1Count-1 Loop
select O66ID INTO MyO66ID from crbank where rownum=counter;
End loop my_loop;
End;
答案 0 :(得分:0)
你在这个场景中编写了一个奇怪的逻辑
这应该有效:
DECLARE
tbl1Count number(4) :=0;
MyO66ID number(8);
Begin
-- select Count(*) INTO tbl1Count from crbank; -- not needed at all
For myItems IN (select O66ID, ROWNUM, whatever_columns_you_need from crbank) Loop
MyO66ID := myItems.O66ID;
tbl1Count := tbl1Count + 1; -- this will serve you better than the first select if you are concerned of the number of rows you have.
/*
Do your logic here for the values you have in the myItems object
EX: update yourTable set yourColumn = myItems.otherColumn where id= myItems.something
You dont need variables to be defined if you noticed as in the above example.
*/
End loop;
End;
<强>提示:强>
您正在获取count
,然后循环显示您获得的计数并将其与rownum
!匹配,这不是最佳做法;为count
和select
命中数据库两次,尽管你可以在一次循环中完成,而不需要第一次选择
rownum
对于每个select语句都会有所不同,具体取决于您指定的顺序,因此使用它是否明智?
答案 1 :(得分:0)
您在问题中已提及
我将从一个表中获取每一行并在另一个表中找到等效的
Oracle只针对这种情况采取了解决方法。 MERGE语句在这些典型场景中非常有用。考虑下面举例说明的片段。如果这有帮助,请告诉我。
每当有可能尝试使用纯SQL而不是PL / SQL
MERGE INTO <Update_table> USING <LOOKUP_TABLE>
ON
(UPDATE_TABLE.COLUMN_NAME = LOOKUP_TABLE.COLUMN_NAME)
WHEN MATCHED THEN
UPDATE SET
<UPDATE_TABLE.COLUMN_NAME> = <Update_value>
;
答案 2 :(得分:-2)
Try this one using cursor in sql.
Declare @id bigint
DECLARE CUR CURSOR FOR
select data from table1
open CUR
Fetch next from cur into @id
while @@FETCH_STATUS=0
begin
update table2 set columnname=value where id=@id
Fetch next from cur into @id
end
CLOSE CUR
DEALLOCATE CUR