2016-01-12 3 views
0

Je vais chercher chaque ligne d'une table et trouver l'équivalent dans une autre table. Ensuite, je vais mettre à jour les lignes de la deuxième table en utilisant l'identifiant que j'ai déjà obtenu. J'ai essayé d'exécuter mon script mais j'ai eu quelques problèmes. J'ai essayé de faire une boucle, puis mettre l'identifiant de chaque ligne dans une variable de les utiliser pour ma déclaration de mise à jour mais Pl me montre une erreur qui me dit « pas de données trouvées »Correspondance et mise à jour de deux tables

Mon script inachevé

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

vous devez inclure les ddls pour les deux tables. –

+0

@OzgurBar quel est le ddls? –

+0

Je veux dire les structures (colonnes, types de colonne si nécessaire) pour donner aux utilisateurs une idée des tableaux mentionnés. comme 'tbl1 (id, nom, ...., etc); tbl2 (id2, name2, ...., etc.) '. –

Répondre

-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

Celui-ci semble SQL Server? , le curseur n'est également pas conseillé d'utiliser. – Japongskie

+0

La question concerne Oracle (PL/SQL), pas SQL Server (T-SQL) –

0

Vous avez écrit une étrange logique dans ce scénario

cela devrait fonctionner:

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; 

Conseils:

Vous obtenez le count, en boucle puis sur le nombre que vous obtenez et correspondant avec rownum, ce qui est pas la meilleure pratique;! frapper votre base de données deux fois, pour count et select, mais vous pouvez le faire en une fois en boucle, et pas besoin pour la première sélectionnez

rownum sera différent pour chaque instruction select, selon l'ordre que vous avez spécifié, donc est-il sage de l'utiliser?

0

Vous avez mentionné dans votre question

Je vais chercher toutes les lignes d'une table et de trouver l'équivalent dans une autre table

Oracle ont juste une solution pour ce type de conditions. L'instruction MERGE est très utile dans ces scénarios typiques. Considérez l'extrait illustré ci-dessous. Faites-moi savoir si cela aide.

Chaque fois qu'il est possible, essayez d'utiliser SQL pur sur 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> 
;