匹配和更新两个表

时间:2016-01-12 06:25:36

标签: sql oracle plsql

我将从一个表中获取每一行,并在另一个表中找到相应的行。然后我将使用我已经获得的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;

3 个答案:

答案 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!匹配,这不是最佳做法;为countselect命中数据库两次,尽管你可以在一次循环中完成,而不需要第一次选择

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