Сценарий MySQL внутри оператора set

Я получил подсказку от О.Джонса и пошел создавать сохраненную функцию.

Вот что я создал:

DELIMITER $$ СОЗДАТЬ ФУНКЦИЮ change_int (colres VARCHAR (500)) RETURNS INT (11)
НАЧИНАТЬ

    DECLARE res int(11);
    DECLARE leng int(11);
    DECLARE newres int(11);
    DECLARE mult int(11);
    DECLARE temp1 int(11);
    DECLARE temp2 int(11);  

SET res = CAST(colres AS UNSIGNED);
SET leng = CHAR_LENGTH(CAST( colres AS CHAR)); 
SET newres = 0;
SET mult = 1;
SET temp1 = 0;
SET temp2 = 0;


WHILE (res > 0) DO

    SET temp1 = MOD(res , 10 );
    SET res = (res DIV 10);
    SET temp2 = MOD(res , 10 );
    SET newres = (newres +((temp1 + temp2 ) * mult));       
    SET mult = mult*10;
END WHILE;
SET newres = SUBSTRING (newres, 1, leng );
RETURN newres;  
END $$
DELIMITER ;

Но я получаю сообщение об ошибке, когда пытаюсь запустить его в строке 6:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''res' = CAST(colres AS CHAR)' at line 6

Добавлен разделитель, новая ошибка:

 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET newres = SUBSTRING (newres, 1, leng );
    RETURN newres;    
    END' at line 27

Отлично, теперь это сработало. Но я не могу ее вызвать:

Провёл тест с:

SHOW FUNCTION STATUS;

И он существует.

Когда я пытаюсь запустить его так:

UPDATE `table` SET `col1` = function_name(`col1`);

Также пробовал:

UPDATE `table` SET `col1` = db.function_name(`col1`);

Не повезло.

Такие вещи называются сохраненная функция.. В intertoobz есть много примеров и руководств.

O. Jones 27.12.2018 14:42

@ О.Джонс, спасибо тебе огромное, это действительно дало мне направление. Не могли бы вы посмотреть, почему в моем заявлении появляется ошибка?

Hellpless 27.12.2018 15:22

Вы читали dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.htm‌ l и установили ли вы разделители?

P.Salmon 27.12.2018 15:27
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас отсутствует столбец перед END WHILE. Это должен быть END WHILE;

Рабочий пример

И последнее, не могу назвать это. пробовал: ОБНОВЛЕНИЕ gd_accounts УСТАНОВИТЬ account_number = change_int (account_number); ОБНОВЛЕНИЕ gd_accounts НАБОР account_number = db_name.change_int (account_number); GET: # 1630 - FUNCTION db_name.SUBSTRING не существует. Проверьте раздел «Анализ и разрешение имени функции» в Справочном руководстве.

Hellpless 27.12.2018 15:48

Другие вопросы по теме