Несколько операторов выбора в одной функции

У меня есть такая функция:

DELIMITER $$
create function fp_v2.fp_splitadjprice (id char(8), startdate date)
returns float 
begin
declare splitfactor float;
declare splitadjprice float;
declare spinofffactor float;
set splitfactor = 1.0;

select splitfactor = fp_v2.fp_splitfactor_prices(id, startdate);
select splitadjprice = convert(float,p_price * splitfactor)
from fp_v2.fp_basic_prices p
where fsym_id = id and p_date = startdate;
return splitadjprice;
END$$
DELIMITER ;

Я получаю сообщение об ошибке во втором операторе выбора, в котором говорится: «Ожидается a (или с».

Я действительно не понимаю синтаксис MySQL workbench. Мне это кажется довольно случайным. Например, когда я должен поставить; а когда я не должен ?. Каковы правила?

В чем вопрос ?

Madhur Bhaiya 13.11.2018 14:48

Любые глупые вопросы приветствуются, если в них проявляются некоторые исследовательские усилия.

Salman A 13.11.2018 14:50
Какие темы я могу задать здесь? Ваш опыт здесь будет намного лучше, если вы потратите некоторое время на просмотр тур и чтение страниц центр помощи, чтобы лучше понять, что (а что нет) уместно спрашивать здесь перед публикацией.
Ken White 13.11.2018 14:50

Это похвально, но совершенно не подходит для этого конкретного сайта. Возможно, вы сможете найти подходящий канал MySQL на Stack Overflow чат, где такого рода вещи были бы вполне приемлемыми (но не торопитесь, пока не почувствуете, что приемлемо в любой конкретной комнате).

tripleee 13.11.2018 14:57

@MadhurBhaiya Вместо этого я попытался задать вопрос :)

Chris 13.11.2018 15:15

@Chris номинирован на открытие

Madhur Bhaiya 13.11.2018 15:17

Также номинирован на открытие. Но больше всего нужен `SELECT ... INTO @ variable` dev.mysql.com/doc/refman/8.0/en/select-into.html

Juan Carlos Oropeza 13.11.2018 15:20

Преобразованный синтаксис тоже неверен. dev.mysql.com/doc/refman/8.0/en/cast-functions.html

Juan Carlos Oropeza 13.11.2018 15:22

Не знаю почему. Но переменные в функциях @ не используют. пользовательские переменные в отдельном запросе делает.

Juan Carlos Oropeza 13.11.2018 15:34

@JuanCarlosOropeza Хорошо, так что оставить их вне функций, как у меня, вполне нормально?

Chris 13.11.2018 15:35

Да, ошибка возникает из-за того, что вы не используете SELECT INTO. Это небольшой пример. для SELECT INTO 'rextester.com/WNYUQW35138

Juan Carlos Oropeza 13.11.2018 15:36

Потому что сейчас вы создаете псевдоним. SELECT Alias = field == SELECT field as Alias Что вы хотите, так это присвоить результат переменной, и это с SELECT INTO ... вот еще один пример с использованием нескольких функций. rextester.com/IDPY20240

Juan Carlos Oropeza 13.11.2018 15:42

Как я также сказал, у вас проблема с CAST(), сначала тип go как второй параметр, например CAST(value, type), второй float не является допустимым типом для CAST, вам нужно использовать DECIMAL(x,y), проверьте здесь rextester.com/CVJM89914

Juan Carlos Oropeza 13.11.2018 16:11

Позвольте нам продолжить обсуждение в чате.

Chris 13.11.2018 16:51
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
14
258
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам нужно использовать SELECT .. INTO для обновления ваших переменных.

convert sintaxis - это CONVERT(value, type), и вы не можете использовать FLOAT, поскольку тип должен использовать DECIMAL, и вам, вероятно, он все равно не нужен, потому что обе ваши переменные уже являются плавающими.

DELIMITER $$
create function fp_v2.fp_splitadjprice (id char(8), startdate date)
returns float 
begin
declare splitfactor float;
declare splitadjprice float;
declare spinofffactor float;
set splitfactor = 1.0;

SELECT fp_v2.fp_splitfactor_prices(id, startdate) INTO splitfactor ;

SELECT convert(p_price * splitfactor, DECIMAL (10,4) INTO splitadjprice 
FROM fp_v2.fp_basic_prices p
WHERE fsym_id = id and p_date = startdate;

return splitadjprice;
END$$
DELIMITER ;

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