PL / SQL цикл через курсор - PullRequest
7 голосов
/ 10 марта 2012

Моя проблема не слишком сложна, но я новичок в PL / SQL.

Мне нужно сделать выбор из таблицы КОМПАНИЙ на основе определенных условий.Затем мне нужно пройтись по ним и преобразовать некоторые поля в другой формат (я создал для этого функции) и, наконец, использовать эту преобразованную версию, чтобы присоединиться к справочной таблице, чтобы получить нужную мне переменную счета.Итак, в основном:

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

перебрать этот выбор

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

Это в основном то, что я хочу сделать.Это немного сложнее, но я просто ищу основы и как подойти к этому, чтобы начать!

Ответы [ 2 ]

13 голосов
/ 10 марта 2012

Вот основной синтаксис для циклов курсора в 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 голосов
/ 10 марта 2012

Вам не нужно использовать PL / SQL, чтобы сделать это:

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

Если вам нужно сделать это в цикле PL / SQL в соответствии с запросом, то я гарантирую, что вы делаете какмало работы, насколько это возможно.Однако я бы порекомендовал массовый сбор вместо цикла.

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

Для любого из этих методов вам нужен один индекс на ref.total_emps и предпочтительно один на companies.turnover

...