Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Ошибка при создании Stored Function в Mysql через MyDac  [new]
Jonnik
Member

Откуда:
Сообщений: 111
Есть код создания функции в Mysql. Он работает, если его например выполнить через редактор Sqlyog для Mysql. Нет ни ошибок не предупреждений.

DROP FUNCTION IF EXISTS `CalcDayTimeSheet`;

DELIMITER $$ 
  

CREATE  FUNCTION `CalcDayTimeSheet`(IDUser INT, TextDate VARCHAR(25)) RETURNS TIME     
BEGIN      
DECLARE NumberHours TIME;     
SET NumberHours = 0;         
SET NumberHours = (SELECT SEC_TO_TIME(IF(MIN(DateWork)=MAX(DateWork), 600, TIMESTAMPDIFF(SECOND, MIN(DateWork), MAX(DateWork)))) FROM (  
SELECT DateBegin AS DateWork          
FROM ItemsTexCards          
WHERE DATE_FORMAT(DateBegin, "%Y-%c-%e")=TextDate AND IDMade=IDUser           
UNION ALL          
SELECT DateEnd  AS DateWork           
FROM ItemsTexCards           
WHERE DATE_FORMAT(DateEnd, "%Y-%c-%e")=TextDate AND IDMade=IDUser          
) i_am_derevided_table);     
RETURN NumberHours;     
END$$  
DELIMITER ; 


Когда я этот код пытаюсь выполнить в XE8 через MyQuery, то выдает ошибку. Типа ему, что то не нравится начиная с DELIMITER $$ .
Вот ошибка
---------------------------
Debugger Exception Notification
---------------------------
Project TListCompanies.exe raised exception class EMySqlException with message '
#42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$  
 CREATE  FUNCTION `CalcDayTimeSheet`(IDUser INT, TextDate VARCHA' at line 1'.
---------------------------


Сам код

with MyQuery do      // DEFINER=`' + LSA.NDBLogin + '`@`%`  DM.MyStoredProc1
    try
      sql.text:='DROP FUNCTION IF EXISTS `CalcDayTimeSheet`;  ' + #13
      +' DELIMITER $$  ' + #13

   //   +' USE `' + LSA.NDBName + '`$$  '
      +' CREATE  FUNCTION `CalcDayTimeSheet`(IDUser INT, TextDate VARCHAR(25)) RETURNS TIME   '
      +'  BEGIN  '

      +'    DECLARE NumberHours TIME; '

      +'    SET NumberHours = 0; '

      +'        SET NumberHours = (SELECT SEC_TO_TIME(IF(MIN(DateWork)=MAX(DateWork), 600, TIMESTAMPDIFF(SECOND, MIN(DateWork), MAX(DateWork)))) FROM ( '
      +'        SELECT DateBegin AS DateWork  '
      +'        FROM ItemsTexCards  '
      +'        WHERE DATE_FORMAT(DateBegin, "%Y-%c-%e")=TextDate AND IDMade=IDUser   '
      +'        UNION ALL  '
      +'        SELECT DateEnd  AS DateWork   '
      +'        FROM ItemsTexCards   '
      +'        WHERE DATE_FORMAT(DateEnd, "%Y-%c-%e")=TextDate AND IDMade=IDUser  '
      +'        ) i_am_derevided_table); '

      +'    RETURN NumberHours;   ' + #13
      +'  END$$ ' + #13

      +' DELIMITER ; ';

      Execute;
    finally
      Free;
    end;


В чем может быть проблема ?
7 дек 17, 09:31    [21013608]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23221
TMyScript?
7 дек 17, 09:37    [21013631]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
Jonnik
Member

Откуда:
Сообщений: 111
wadman
TMyScript?


Никогда этой штукой не пользовался и может, что то не так делаю. Но результат такой.

---------------------------
Debugger Exception Notification
---------------------------
Project TListCompanies.exe raised exception class EMySqlException with message '
#42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 3'.
---------------------------


 with DM.MyScript1 do      // DEFINER=`' + LSA.NDBLogin + '`@`%`  DM.MyStoredProc1
    try
      sql.text:='DROP FUNCTION IF EXISTS `CalcDayTimeSheet`;  ' + #13
      +' DELIMITER $$  ' + #13

   //   +' USE `' + LSA.NDBName + '`$$  '
      +' CREATE  FUNCTION `CalcDayTimeSheet`(IDUser INT, TextDate VARCHAR(25)) RETURNS TIME   '
      +'  BEGIN  '

      +'    DECLARE NumberHours TIME; '

      +'    SET NumberHours = 0; '

      +'        SET NumberHours = (SELECT SEC_TO_TIME(IF(MIN(DateWork)=MAX(DateWork), 600, TIMESTAMPDIFF(SECOND, MIN(DateWork), MAX(DateWork)))) FROM ( '
      +'        SELECT DateBegin AS DateWork  '
      +'        FROM ItemsTexCards  '
      +'        WHERE DATE_FORMAT(DateBegin, "%Y-%c-%e")=TextDate AND IDMade=IDUser   '
      +'        UNION ALL  '
      +'        SELECT DateEnd  AS DateWork   '
      +'        FROM ItemsTexCards   '
      +'        WHERE DATE_FORMAT(DateEnd, "%Y-%c-%e")=TextDate AND IDMade=IDUser  '
      +'        ) i_am_derevided_table); '

      +'    RETURN NumberHours;   ' + #13
      +'  END$$ ' + #13

      +' DELIMITER ; ';
      Execute;
    finally
     // Free;
    end;


У этого компанента еще есть свойство DELIMITER и оно у меня равно ";" Может его надо менять или процедуру надо переписать ?
7 дек 17, 09:51    [21013683]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23221
Jonnik
Может его надо менять или процедуру надо переписать ?

Попробуй указать свой delimiter и убрать из скрипта манипуляции с ним.
7 дек 17, 10:16    [21013794]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
Jonnik
Member

Откуда:
Сообщений: 111
wadman
Jonnik
Может его надо менять или процедуру надо переписать ?

Попробуй указать свой delimiter и убрать из скрипта манипуляции с ним.


Пробую так. Ошибок нет теперь. Но и функция не создается. В чем может быть проблема ?

 with DM.MyScript1 do     
    try
      Delimiter := '$$';
      sql.text:='DROP FUNCTION IF EXISTS `CalcDayTimeSheet`;  ' + #13

      +' CREATE  FUNCTION `CalcDayTimeSheet`(IDUser INT, TextDate VARCHAR(25)) RETURNS TIME   '
      +'  BEGIN  '

      +'    DECLARE NumberHours TIME; '

      +'    SET NumberHours = 0; '

      +'        SET NumberHours = (SELECT SEC_TO_TIME(IF(MIN(DateWork)=MAX(DateWork), 600, TIMESTAMPDIFF(SECOND, MIN(DateWork), MAX(DateWork)))) FROM ( '
      +'        SELECT DateBegin AS DateWork  '
      +'        FROM ItemsTexCards  '
      +'        WHERE DATE_FORMAT(DateBegin, "%Y-%c-%e")=TextDate AND IDMade=IDUser   '
      +'        UNION ALL  '
      +'        SELECT DateEnd  AS DateWork   '
      +'        FROM ItemsTexCards   '
      +'        WHERE DATE_FORMAT(DateEnd, "%Y-%c-%e")=TextDate AND IDMade=IDUser  '
      +'        ) i_am_derevided_table); '

      +'    RETURN NumberHours;   ' + #13
      +'  END$$' + #13

      +' DELIMITER ;';

      Execute;
    finally
     // Free;
    end;
7 дек 17, 11:12    [21014088]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23221
В транзакции?

П.С. Не кажется ли, что между drop и create должен быть указанный в свойствах delimiter, а не точка с запятой?
7 дек 17, 11:33    [21014196]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
Jonnik
Member

Откуда:
Сообщений: 111
wadman
В транзакции?

П.С. Не кажется ли, что между drop и create должен быть указанный в свойствах delimiter, а не точка с запятой?


Я тут не использую транзакцию.

Сделал так. Т.е. поставил $$ и теперь ошибка на нем

with DM.MyScript1 do      // DEFINER=`' + LSA.NDBLogin + '`@`%`  DM.MyStoredProc1
    try
      Delimiter := '$$';
      sql.text:='DROP FUNCTION IF EXISTS `CalcDayTimeSheet` $$' + #13

      +' CREATE  FUNCTION `CalcDayTimeSheet`(IDUser INT, TextDate VARCHAR(25)) RETURNS TIME   '
      +'  BEGIN  '

      +'    DECLARE NumberHours TIME; '

      +'    SET NumberHours = 0; '

      +'        SET NumberHours = (SELECT SEC_TO_TIME(IF(MIN(DateWork)=MAX(DateWork), 600, TIMESTAMPDIFF(SECOND, MIN(DateWork), MAX(DateWork)))) FROM ( '
      +'        SELECT DateBegin AS DateWork  '
      +'        FROM ItemsTexCards  '
      +'        WHERE DATE_FORMAT(DateBegin, "%Y-%c-%e")=TextDate AND IDMade=IDUser   '
      +'        UNION ALL  '
      +'        SELECT DateEnd  AS DateWork   '
      +'        FROM ItemsTexCards   '
      +'        WHERE DATE_FORMAT(DateEnd, "%Y-%c-%e")=TextDate AND IDMade=IDUser  '
      +'        ) i_am_derevided_table); '

      +'    RETURN NumberHours;   ' + #13
      +'  END$$' + #13

      +' DELIMITER ;';
      Execute;
    finally
     // Free;
    end;


И ошибка в третей строке теперь. В тексте это тут
+'  END$$' + #13
Там просто тест запроса по другому выглядит. В общем какая то жесть.

---------------------------
Debugger Exception Notification
---------------------------
Project TListCompanies.exe raised exception class EMySqlException with message '
#42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 3'.
---------------------------
7 дек 17, 11:53    [21014288]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23221
Дак убери из скрипта объявление разделителя... Им сам компонент управляет через своё свойство.
7 дек 17, 12:03    [21014346]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
Jonnik
Member

Откуда:
Сообщений: 111
wadman
Дак убери из скрипта объявление разделителя... Им сам компонент управляет через своё свойство.


Делал я уже по разному. Ему все не нравится (((
Эту функцию можно записать без DELIMITER ? Если можно, то как?

DROP FUNCTION IF EXISTS `CalcDayTimeSheet`;

DELIMITER $$ 
  

CREATE  FUNCTION `CalcDayTimeSheet`(IDUser INT, TextDate VARCHAR(25)) RETURNS TIME     
BEGIN      
DECLARE NumberHours TIME;     
SET NumberHours = 0;         
SET NumberHours = (SELECT SEC_TO_TIME(IF(MIN(DateWork)=MAX(DateWork), 600, TIMESTAMPDIFF(SECOND, MIN(DateWork), MAX(DateWork)))) FROM (  
SELECT DateBegin AS DateWork          
FROM ItemsTexCards          
WHERE DATE_FORMAT(DateBegin, "%Y-%c-%e")=TextDate AND IDMade=IDUser           
UNION ALL          
SELECT DateEnd  AS DateWork           
FROM ItemsTexCards           
WHERE DATE_FORMAT(DateEnd, "%Y-%c-%e")=TextDate AND IDMade=IDUser          
) i_am_derevided_table);     
RETURN NumberHours;     
END$$  
DELIMITER ; 
7 дек 17, 12:27    [21014530]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23221
Jonnik
Если можно, то как?

Убрать из скрипта все слова/конструкции DELIMITER.
7 дек 17, 12:45    [21014655]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании Stored Function в Mysql через MyDac  [new]
Jonnik
Member

Откуда:
Сообщений: 111
wadman
Jonnik
Если можно, то как?

Убрать из скрипта все слова/конструкции DELIMITER.


В общем DELIMITER по умолчанию оставил. Убрал все слова DELIMITER из запроса и символы $$
В программе все это работает, а в Sqlyog такой запрос не работает. Поэтому я не мог найти правильный вариант.
Большое спасибо.
7 дек 17, 13:01    [21014760]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить