[РЕШЕНО] Помогите код вынести в хранимую процедуру

Модератор: Модераторы

[РЕШЕНО] Помогите код вынести в хранимую процедуру

Сообщение java73 » 26.07.2018 12:49:28

Привет, друзья.
Я не силен в магии и синтаксисе языка хранимых процедур MySQL, помогите, пожалуйста, начать изучать)
Хотелось бы код ниже встроить в хранимую процедурку:
Код: Выделить всё
procedure TTrademark.SelectTrademarks(Query: TQuery; YFilter: integer; NeedNR: boolean);
Var
  S: string;
begin
  Query.Filtered:=FALSE;
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add('SELECT * FROM investpatents.trademarks');
  if YFilter>0 then begin
    S:='WHERE ';
    if NeedNR then S+='(PERIOD_ADD(DATE_FORMAT(Term,"%Y%m"),6) BETWEEN "'+IntToStr(YFilter)
                       +'01" AND "'+IntToStr(YFilter)+'12") OR ';
    S+='(Term BETWEEN "'+IntToStr(YFilter)+'-01-01" AND "'+IntToStr(YFilter)+'-12-31")';
    Query.SQL.Add(S);
  end;
  Query.SQL.Add('ORDER BY GroupID,GNumb');
  Query.Open;
end;


То запрос возвращает либо полный набор записей, либо набор записей с выборкой по полю с типом данных дата/время (при наличии ключа еще и с дополнительным условием).
Последний раз редактировалось java73 27.07.2018 19:54:29, всего редактировалось 1 раз.
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: Помогите код вынести в хранимую процедуру

Сообщение Снег Север » 27.07.2018 07:07:43

Как-то примерно так, извините не проверял:
Код: Выделить всё
DELIMITER // 
CREATE PROCEDURE SelectTrademarks (IN YFilter INT)
BEGIN
   SET @YFilter = YFilter;

   DECLARE  dateto char(10);
    IF @YFilter>0 THEN
      SET @datefrom = CONCAT(CAST(YFilter as varchar(4)), "-01-01");
      SET @datefrom1 = CONCAT(CAST(YFilter as varchar(4)), "-01");
      SET @dateto = CONCAT(CAST(YFilter as varchar(4)), "-12-31");
      SET @dateto1 = CONCAT(CAST(YFilter as varchar(4)), "-12");
      SET @where = CONCAT("WHERE (PERIOD_ADD(DATE_FORMAT(Term,"%Y%m"),6) BETWEEN ",@datefrom1," AND ",@dateto1," OR (Term BETWEEN ",@datefrom," AND ",@dateto);
   ELSE
         SET @where = "";
   SET @query = CONCAT("SELECT * FROM investpatents.trademarks ",@where," ORDER BY GroupID,GNumb");
   PREPARE stmt FROM @query;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;
END //
DELIMITER ;   
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 1209
Зарегистрирован: 27.11.2007 16:14:47

Re: Помогите код вынести в хранимую процедуру

Сообщение java73 » 27.07.2018 10:01:14

Снег Север писал(а):Как-то примерно так

СПАСИБО!
немного помудрил с синтаксисом, вот так правильно и работоспособно:
Код: Выделить всё
USE `investpatents`;
DROP procedure IF EXISTS `SelectTrademarks`;

DELIMITER $$
USE `investpatents`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `SelectTrademarks`(in YFilter int, in NeedNR bool)
BEGIN
    set @where = 'WHERE ';
    if YFilter>0 then
          set @datefrom = CONCAT(CAST(YFilter as char(4)),'-01-01');
        set @datefrom1 = CONCAT(CAST(YFilter as char(4)),'-01');
        set @dateto = CONCAT(CAST(YFilter as char(4)),'-12-31');
        set @dateto1 = CONCAT(CAST(YFilter as char(4)),'-12');
       if NeedNR then
         set @where = CONCAT(@where,'(PERIOD_ADD(DATE_FORMAT(Term,"%Y%m"),6) BETWEEN "',@datefrom1,'" AND "',@dateto1,'") OR ');
      end if;
      set @where = CONCAT(@where,'(Term BETWEEN "',@datefrom,'" AND "',@dateto,'")');
   else
      set @where = "";
   end if;
   SET @query = CONCAT('SELECT * FROM investpatents.trademarks ',@where,' ORDER BY GroupID,GNumb');
    PREPARE stmt FROM @query;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;
END$$

DELIMITER ;


Добавлено спустя 14 минут 59 секунд:
Отлично, вызов сократился до
Код: Выделить всё

  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add('call investpatents.SelectTrademarks('+IntToStr(YFilter)+','+BoolToStr(NeedNR)+')');
  Query.Open;
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru