2016-01-12 44 views
0

我将从一个表中获取每一行,并在另一个表中找到等价物。然后,我将通过使用已获得的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

你应该包括两个表的DDL。 –

+0

@OzgurBar ddls是什么? –

+0

我的意思是结构(列,列类型,如果需要)给用户一个想法提到的表。像'tbl1(id,name,....等); TBL2(ID2,NAME2,...,等等)'。 –

回答

-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 [email protected] 
Fetch next from cur into @id 
end 

CLOSE CUR  
DEALLOCATE CUR 
+0

这一个似乎SQL Server? ,光标也不建议使用。 – Japongskie

+0

问题是关于Oracle(PL/SQL),而不是SQL Server(T-SQL) –

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语句不同,这取决于您指定的顺序,因此,它是明智地使用它?

0

你已经在你的问题中提到

我要每一行从一个表中提取并找到另一个表

甲骨文相当于只是有一种变通方法对于这种类型的条件。 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> 
;