Отсутствие назначения для данных в функции pl/sql

Рейтинг: 1Ответов: 1Опубликовано: 15.04.2015

Добрый день. Обращаюсь прежде всего к тем кто юзает хорошо pl/sql от postgres. Пишу такую функцию:

create or replace function train_status_act(
    IN in_id bigint,
    IN new_act_approved bigint, 
    out out_id bigint
)
as
$body$

declare cur_act_approved bigint;

begin
   if in_id is not null then
      select 
        cur_act_approved  
      from train_act where (id = in_id);

      if cur_act_approved is not null then
        update train_act set
          act_approved = coalesce(new_act_approved, cur_act_approved)   
        where id = in_id;
      else 
        perform err('Запись не найдена!', 'P1001');
      end if;      
      out_id = in_id;
   else 
     out_id = 0;
   end if;  

end;

$body$
language plpgsql security definer volatile cost 100;
ALTER FUNCTION train_status_act(bigint, bigint)
  OWNER TO nb;

Потом вызываю:

select train_status_act(1, 0);

И пишет ошибку: В запросе нет назначения для данных результата. Потому и спрашиваю, кто может сказать в чем тут ошибка? Вроде, код простой...

Ответы

▲ 2

Вопрос можно закрыть. Решение найдено:

--DROP FUNCTION train_status_act(bigint,bigint)
create or replace function train_status_act(
    IN in_id bigint,
    IN new_act_approved bigint     
) returns bigint
as
$body$

declare cur_act_approved bigint;
begin
   if in_id is not null then         
     update train_act set
       act_approved = new_act_approved
     where id = in_id;             
     return in_id;
   else 
     return 0;
   end if;     
end;

$body$

language plpgsql security definer volatile cost 100;
ALTER FUNCTION train_status_act(bigint, bigint)
  OWNER TO nb;

Плюс еще срабатывала ошибка на триггер update, потому я поменял там, чтобы при любом условии возвращало значение:

CREATE OR REPLACE FUNCTION trg_train_status_act_iu()
  RETURNS trigger AS
$BODY$

declare rec_detail_act train_act_detail%rowtype;
declare COUNT_N bigint;

begin
 if (tg_op = 'UPDATE') then
   case new.act_approved 
    -- Если состояние акта удаление
    when 0 then 
      -- если акт проведен, то его нельзя удалить 
     if old.act_approved = 2 then 
       return old;
     else -- в противном случае логически удаляем акт
       return new;
     end if;

    -- Если состояние акта создание/редактирование первичное 
    when 1 then    
     return new;

    -- Если состояние акта проведение 
    when 2 then        
     select count(cistern_id) into COUNT_N from train_act_detail where (act_id = new.id); 
     -- Если тип акта 1 или 2, то делаем проверку валидности
     if (new.act_type_id = 1) or 
        (new.act_type_id = 2) then
        -- Если число валидных вагонов равно общему числу в акте, то утверждаем акт 
        if (return_train_act_data(new.id) = COUNT_N) then
          return new;
        else -- В противном случае сбрасываем результат транзакции
          return old;
        end if;
     else -- Если это 3 - 6 акт, то никаких проверок не делаем, утверждаем акт
       return new;
     end if;   

    -- Если состояние акта - аннулирование 
    when 3 then
     -- Если акт проведен, то его можно аннулировать
     if old.act_approved = 2 then 
       return new;
     else -- в противном случае не вносим изменений в состояние акта
       return old;
     end if;    

    -- Если состояние акта неопределено или указано неверно 
    else return old; 

    end case;       


    end if; -- End Update
    end;
    $BODY$

    create trigger trg_train_status_iu
      before insert or update or delete
      on train_act
      for each row
      execute procedure trg_train_status_act_iu();

Всем спасибо за участие).