Как вывести два столбца через функцию с курсором (SQL)
У меня есть функция, которая принимает 3 значения. В функции описан курсор, который выводит через запятую нужные (id), и считает общую сумму, которую оплатили эти айдишники. Проблема в том, что не выходит вывести два столбца. В первой ячейке через запятую id, а вторую ячейку заполнить суммой денег, которую они оплатили. Что нужно сделать, что бы вывести? Если можно подкорректируйте код. Я в SQL только учусь. Спасибо.
CREATE DEFINER=`i.s.hopak`@`%` FUNCTION `ABCD`(num VARCHAR ( 5 ), mm INT , mb INT ) RETURNS varchar(100) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE res VARCHAR(100);
DECLARE SU INT;
DECLARE cur CURSOR FOR
SELECT GROUP_CONCAT(Receipt_id,""), SUM(Paid_UAH)
FROM tenantmadeutilitypayment
WHERE tenantmadeutilitypayment.PersonalAccount = num AND MONTH(DateOfPay)> mm AND MONTH(DateOfPay)<mb ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE;
OPEN cur;
FETCH NEXT FROM cur INTO res, SU;
CLOSE cur;
RETURN(res);
END
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
Вот пример возврата из функции двух значений, сериализованных в JSON:
-- тест-таблица CREATE TABLE test (id int, val1 INT, val2 INT); INSERT INTO test VALUES (1,11,111), (2,22,222), (3,33,333); SELECT * FROM test;id | val1 | val2 -: | ---: | ---: 1 | 11 | 111 2 | 22 | 222 3 | 33 | 333
-- функция CREATE FUNCTION return_2_values (in_id INT) RETURNS JSON DETERMINISTIC READS SQL DATA BEGIN DECLARE json_var JSON; SELECT JSON_OBJECT('value1', val1, 'value2', val2) INTO json_var FROM test WHERE test.id = in_id; RETURN json_var; END
-- получение объединённого значения в подзапросе и извлечение отдельных значений SELECT id, json_output, json_output->"$.value1" value_1, json_output->"$.value2" value_2 FROM ( SELECT id, return_2_values(id) json_output FROM test WHERE id IN (1,3) ) subquery;id | json_output | value_1 | value_2 -: | :---------------------------- | :------ | :------ 1 | {"value1": 11, "value2": 111} | 11 | 111 3 | {"value1": 33, "value2": 333} | 33 | 333
Автор решения: Ілля Сергійович Гопак
→ Ссылка
Спасибо Akin`е! Он дал мне ответ! Вдруг кому будет нужно :
CREATE DEFINER=`i.s.hopak`@`%` FUNCTION `return_2_values`(num VARCHAR ( 5 ), mm INT , mb INT ) RETURNS json
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE json_var JSON;
SELECT JSON_OBJECT('value1', GROUP_CONCAT(Receipt_id,""), 'value2', SUM(Paid_UAH))
INTO json_var
FROM tenantmadeutilitypayment
WHERE tenantmadeutilitypayment.PersonalAccount = num AND MONTH(DateOfPay)> mm AND MONTH(DateOfPay)<mb ;
RETURN json_var;
END
Ответ :{"value1": "1,17", "value2": 61.00}(В моём случае, это правильно!)