2012-03-09 16 views
6

Mi problema no es demasiado complicado, pero soy un novato en PL/SQL.bucle PL/SQL a través del cursor

Necesito hacer una selección de una tabla de EMPRESAS según ciertas condiciones. Luego necesito recorrerlos y convertir algunos de los campos en un formato diferente (he creado funciones para esto), y finalmente usar esta versión convertida para unirme a una tabla de referencia para obtener la variable de puntaje que necesito. Así que, básicamente:

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

bucle a través de esta selección

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

Esto es básicamente lo que estoy buscando hacer. Es un poco más complicado, pero solo estoy buscando lo básico y cómo abordarlo para ayudarme a comenzar.

Respuesta

11

Ésta es la sintaxis básica para bucles cursor en 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

No es necesario utilizar PL/SQL para hacer esto:

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 

Si usted tiene que hacer esto en un ciclo PL/SQL como se lo solicite, me aseguraré de que hagas el menor trabajo posible. Sin embargo, recomendaría bulk collect en lugar del bucle.

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; 
/

Para cualquiera de los métodos que necesita un índice de ref.total_emps y preferiblemente uno en companies.turnover