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

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

Ответить
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение java73 »

Привет, друзья.
Я не силен в магии и синтаксисе языка хранимых процедур 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 10:31:25, всего редактировалось 2 раза.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Как-то примерно так, извините не проверял:

Код: Выделить всё

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 ;   
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

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

СПАСИБО!
немного помудрил с синтаксисом, вот так правильно и работоспособно:

Код: Выделить всё

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
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Блин, после того, как код вынесся в хранимую процедуру, перестало работать редактирование записей в db-компонентах лахаруса... Ну что за геморрой вечно, пришлось обратно пока вернуть в зад всё.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

Извините, а вы что, пытались напрямую редактировать данные, вытянутые процедурой??? Разумеется, из этого ничего получиться не могло. Процедура возвращает копии данных, из скрытой временной таблицы.
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

Сообщение DYUMON »

Каким компонентом выбираешь данные с базы ?
Вроде у TSQLQuery можно сделать так

Код: Выделить всё

  SQLQuery1.UpdateSQL.Text:='update investpatents.trademarks set test = :test where test_id =:test_id';
  SQLQuery1.Post;

то есть заполняешь запрос на обновление данных.
у Zeos для этого есть отдельный TZUpdateSQL, mydac это из коробки умеет.
Ответить