2014-12-30 3 views
1

Как я могу решить эту проблему (Результат состоял более чем из одной строки в mysql)1172 - Результат состоял из более чем одной строки в MySQL

DROP PROCEDURE IF EXISTS `doMarksApplication`; 
CREATE PROCEDURE `doMarksApplication`(
in kuser varchar(20), 
out idpro int(11)) 
SP:BEGIN 
    declare no_more_rows int default FALSE; 
    declare total_marks decimal(10,2) default 0; 
    declare idfor int(11)  default 0; 
    declare sskod int(5)  default getCurSession(); 
    declare bdata int(5)  default 0; 
    declare nopmh varchar(20); 
    # Data PB [Permohonan Baru] DM [Proses Pemarkahan] 
    declare cur1 cursor for 
    select ind_nopmh from pinduk 
    left join pprses on pro_nopmh = ind_nopmh 
    where ind_sskod = sskod and 
    concat(pro_stats,pro_statp) in ('PB','DM') and 
    not exists (select mar_idnum from pmrkah where mar_nopmh = ind_nopmh) 
    order by ind_nopmh; 
    declare continue handler for not found set no_more_rows = TRUE; 

    begin 
     select count(ind_nopmh) into bdata 
     from pinduk 
     left join pprses on pro_nopmh = ind_nopmh 
     where ind_sskod = sskod and 
       concat(pro_stats,pro_statp) in ('PB','DM') and 
       not exists (select mar_idnum from pmrkah where mar_nopmh = ind_nopmh); 
     end; 

     begin 
     select count(for_idnum) into idfor from xkod_markah_00_formula 
     where for_stats = 'A' and 
       curdate() between for_tkhdr and for_tkhhg; 
     end; 

     if idfor = 1 and sskod <> 0 then 
     begin 
      select for_idnum into idfor from xkod_markah_00_formula 
      where for_stats = 'A' and 
       curdate() between for_tkhdr and for_tkhhg; 
     end; 

     begin 
      insert into pprmar 
      (pma_tkmla,pma_msmla,pma_puser,pma_sskod,pma_idfor,pma_bdata) 
      values 
      (curdate(),curtime(),kuser,sskod,idfor,bdata); 
     end; 

     begin 
      select last_insert_id() into idpro; 
     end; 

     open cur1;  
     LOOP1:loop  
      fetch cur1 into nopmh; 

      if no_more_rows then 
      close cur1; 
      leave LOOP1; 
      end if; 

      begin 
      call getMarksAnakPerak(nopmh,@total_perak); 
      call getMarksAkademik(nopmh,@total_akdmk); 
      call getMarksSosioekonomi(nopmh,@total_sosio); 
      end; 

      set total_marks = @total_perak + @total_akdmk + @total_sosio; 

      begin 
      insert into pmrkah 
      (mar_idpro,mar_nopmh,mar_idfor,mar_perak,mar_akdmk,mar_sosio,mar_total) 
      values 
      (idpro,nopmh,idfor,@total_perak,@total_akdmk,@total_sosio,total_marks); 
      end; 

      begin 
      update pprses 
      set pro_stats = 'D', 
       pro_statp = 'M', 
       pro_tkmsk = curdate(), 
       pro_msmsk = curtime(), 
       pro_kuser = kuser 
      where pro_nopmh = nopmh; 
      end; 

     end loop; 

     begin 
      update pprmar 
      set pma_tktmt = curdate(), 
       pma_mstmt = curtime() 
      where pma_idnum = idpro; 
     end; 
     end if; 
END; 
+0

Сообщите свое точное сообщение об ошибке. –

ответ

0

я программирую в MySQL на протяжении 15 лет, и это легко самая запутанная хранимая процедура, которую я когда-либо видел.

Тем не менее, один возможно место для Вашего вопроса не здесь

select for_idnum into idfor from xkod_markah_00_formula 
    where for_stats = 'A' and 
     curdate() between for_tkhdr and for_tkhhg; 

Я знаю, что это, кажется, не быть причиной, но, не зная содержание трех других хранимых процедур вы призывающие это только кандидат. Вы должны добавить к нему ограничение 1 и каждый оператор select, который читает из таблицы (т. Е. Не sum() или count() и т. Д.), Поскольку это всегда могло бы вызвать ошибку, видя.

select for_idnum into idfor from xkod_markah_00_formula 
    where for_stats = 'A' and 
     curdate() between for_tkhdr and for_tkhhg limit 1; 

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

Смежные вопросы