2012-03-09 10 views
6

Mój problem nie jest zbyt skomplikowany, ale jestem początkującym dla PL/SQL.Pętla PL/SQL przez kursor

Muszę dokonać wyboru z tabeli PRZEDSIĘBIORSTWA na podstawie określonych warunków. Następnie muszę przechodzić przez te i konwertować niektóre pola do innego formatu (mam do tego stworzone funkcje), a następnie użyć tej przekonwertowanej wersji, aby dołączyć do tabeli referencyjnej, aby uzyskać potrzebną zmienną wyniku. Więc w zasadzie:

select id, total_empts, bank from COMPANIES where turnover > 100000 

pętli tego wyboru

insert into MY_TABLE (select score from REF where conversion_func(MY_CURSOR.total_emps) = REF.total_emps) 

Jest to po prostu to, czego szukam zrobić. To trochę bardziej skomplikowane, ale ja po prostu szukam podstaw i jak do niego podejść, żeby zacząć!

Odpowiedz

11

Oto składnia podstawowa dla kursor pętli w PL/SQL:

BEGIN 

    FOR r_company IN (
     SELECT 
      ID, 
      total_emps, 
      bank 
     FROM 
      companies 
     WHERE 
      turnover > 100000 
    ) LOOP 

     INSERT INTO 
      my_table 
     SELECT 
      score 
     FROM 
      ref_table 
     WHERE 
      ref.total_emps = conversion_func(r_company.total_emps) 
     ; 

    END LOOP; 

END; 
/
3

Nie trzeba użyć PL/SQL, aby to zrobić:

insert into my_table 
select score 
    from ref r 
    join companies c 
    on r.total_emps on conversion_func(c.total_emps) 
where c.turnover > 100000 

Jeśli trzeba to zrobić w pętli PL/SQL, o którą pytam, wtedy upewnię się, że wykonujesz jak najmniej pracy. Chciałbym jednak polecić bulk collect zamiast pętli.

begin 

    for xx in (select conversion_func(total_emps) as tot_emp 
       from companies 
       where turnover > 100000) loop 

     insert into my_table 
     select score 
     from ref 
     where total_emps = xx.tot_emp 
      ; 

    end loop; 

end; 
/

Dla każdej metody trzeba jeden indeks na ref.total_emps i korzystnie jeden na companies.turnover