Создание процедуры для вставки / обновления кол-во. Что я делаю неправильно? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь создать процедуру, которая подсчитывает общее количество плит из каждого поддона из таблицы prod_result и вставляет или обновляет этот счетчик до столбца qty в таблице plt_result с таким же поддоном # (plt_no)

Я пробовал вставить, обновить оба, но не работает.

    create or replace PROCEDURE update_qty 
    is
        v_plt_no nvarchar2(20);
        v_qty number;

        cursor q1 is
        select count(slab_no) 
        into v_qty
        from prod_result 
        where plt_no = v_plt_no;

     begin

        if v_qty > 0 then
        update plt_result
        set qty = 'v_qty'
        where plt_no = v_plt_no;
        end if;
     end;

Что я здесь не так делаю? Помогите пожалуйста.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я не уверен, какую версию вы ищете - это та, которая перебирает все PLT_NO в таблице, или та, которая должна принимать PLT_NO в качестве параметра. Вот оба варианта, посмотрите, поможет ли какой-либо из них.

Первый использует курсор курсора FOR; его легче поддерживать, поскольку Oracle выполняет большую часть работы dirty за вас (открытие курсора, выборка, выход из цикла, закрытие курсора).

create or replace procedure update_qty
is
begin
  for cur_r in (select plt_no, count(slab_no) v_qty
                from prod_result
                group by plt_no
               )
  loop
    if cur_r.v_qty > 0 then
       update plt_result r set
         r.qty = cur_r.v_qty
         where r.plt_no = cur_r.plt_no;
    end if;
  end loop;
end;

Второй принимает PLT_NO в качестве параметра:

create or replace procedure update_qty 
  (par_plt_no in prod_result.plt_no%type)
is
  v_qty number;
begin
  select count(p.slab_no)
    into v_qty
    from prod_result p
    where p.plt_no = par_plt_no;

  if v_qty > 0 then
     update plt_result r set
       r.qty = v_qty
       where r.plt_no = par_plt_no;
  end if;
end;
0 голосов
/ 16 января 2019

Что-то вроде следующего, где вы на самом деле открываете и извлекаете из курсора. Вам нужно будет присвоить значение v_plt_no для курсора, чтобы получить что-нибудь.

create or replace PROCEDURE update_qty
is
        v_plt_no nvarchar2(20);
        v_qty number;

        cursor q1 is
        select count(slab_no)
        into v_qty
        from prod_result
        where plt_no = v_plt_no;

begin

   OPEN q1;
   FETCH q1 INTO v_qty;
   CLOSE q1;

   if v_qty > 0 then
      update plt_result
         set qty = 'v_qty'
       where plt_no = v_plt_no;
   end if;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...