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

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

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

Сообщение 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 18.12.2018 11:31:25, всего редактировалось 2 раз(а).
java73
постоялец
 
Сообщения: 236
Зарегистрирован: 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 ;   
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2237
Зарегистрирован: 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
постоялец
 
Сообщения: 236
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение java73 » 18.12.2018 11:31:05

Блин, после того, как код вынесся в хранимую процедуру, перестало работать редактирование записей в db-компонентах лахаруса... Ну что за геморрой вечно, пришлось обратно пока вернуть в зад всё.
java73
постоялец
 
Сообщения: 236
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение Снег Север » 18.12.2018 21:23:46

java73 писал(а):Блин, после того, как код вынесся в хранимую процедуру, перестало работать редактирование записей в db-компонентах лахаруса...

Извините, а вы что, пытались напрямую редактировать данные, вытянутые процедурой??? Разумеется, из этого ничего получиться не могло. Процедура возвращает копии данных, из скрытой временной таблицы.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2237
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение DYUMON » 20.12.2018 21:12:39

Каким компонентом выбираешь данные с базы ?
Вроде у TSQLQuery можно сделать так
Код: Выделить всё
  SQLQuery1.UpdateSQL.Text:='update investpatents.trademarks set test = :test where test_id =:test_id';
  SQLQuery1.Post;

то есть заполняешь запрос на обновление данных.
у Zeos для этого есть отдельный TZUpdateSQL, mydac это из коробки умеет.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 184
Зарегистрирован: 11.03.2009 13:32:54


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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 4

Рейтинг@Mail.ru