Error code 1415 not allowed to return a result set from a function

I am trying to create a MySQL function using phpMyAdmin and getting this error. #1415 - Not allowed to return a result set from a function The function code is as below: DELIMITER $$ CREATE

I am trying to create a MySQL function using phpMyAdmin and getting this error.

#1415 — Not allowed to return a result set from a function

The function code is as below:

DELIMITER $$
    
CREATE FUNCTION get_binary_count(a INT, c INT)
RETURNS INT
DETERMINISTIC 

BEGIN
    DECLARE c1, c2 INT;
    SET c1 = 0;
    SET c2 = 0;

    SELECT left_id  AS c1 FROM mlm_user_mst WHERE parent_id = a AND left_id > 0;
    SELECT right_id AS c2 FROM mlm_user_mst WHERE parent_id = a AND right_id > 0;

    IF (c1 > 0 AND c2 > 0) THEN
        SET c = c + 1;
        SET c = c + get_binary_count(c1, 0);
        SET c = c + get_binary_count(c2, 0);
    END IF;

    RETURN c;
END$$
 
DELIMITER ;

Any suggestions?

Thanks in advance.

informatik01's user avatar

informatik01

15.8k10 gold badges74 silver badges103 bronze badges

asked Aug 9, 2012 at 9:22

aslamdoctor's user avatar

aslamdoctoraslamdoctor

3,61511 gold badges52 silver badges93 bronze badges

1

Because

SELECT left_id AS c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0; 

doesn’t set the variable c1, it returns a set with a column named c1

You want

SELECT left_id INTO c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0; 

Similarly for c2.

answered Aug 9, 2012 at 9:24

podiluska's user avatar

that is because you are using SELECT queries whose output is not stored into variables or temporary inside FUNCTION which must. Function can return only one single value. So your code should be something like this:

CREATE TABLE t1 AS SELECT left_id AS c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0;
CREATE TABLE t2 AS SELECT right_id AS c2 FROM mlm_user_mst WHERE parent_id=a AND right_id>0;

or

SELECT left_id AS c1 INTO @c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0 LIMIT 1; 

SELECT right_id AS c2 INTO @c2 FROM mlm_user_mst WHERE parent_id=a AND right_id>0 LIMIT 1;

answered Aug 9, 2012 at 9:24

Omesh's user avatar

OmeshOmesh

27.2k6 gold badges41 silver badges50 bronze badges

I am not trying to return a result set and I have no idea what I’m doing wrong here.
MySQL 5.5

delimiter $$

CREATE FUNCTION CheckAccount(
    i_username varchar(50)
) RETURNS integer

BEGIN

    DECLARE v_validUserId int;
    DECLARE v_validMembership int;
    DECLARE o_Status integer;

    SELECT vvalidUserId = u.UserId
    FROM Users u
    WHERE u.Username = i_username;

    IF( v_validUserId IS NULL ) THEN
        SET o_Status = 2; -- Invalid username
    ELSE
        SET o_Status = 1; -- Good
    END IF;


    IF(o_Status != 2 ) THEN
            SELECT v_validMembership = 1
            FROM Users u
            JOIN UserMemberships um on um.UserId = u.userId
            JOIN Memberships m on m.MembershipId = um.MembershipId
            WHERE um.MembershipExpireDateTime > CURDATE()
            AND u.UserId = v_validUserId;

            IF( v_validMembership IS NULL ) THEN 
                SET o_Status = 3; -- Invalid membership
            END IF;
    END IF;

    RETURN o_status;

END $$
DELIMITER ;

Any help will be greatly appreciated!

Trinimon's user avatar

Trinimon

13.8k9 gold badges43 silver badges60 bronze badges

asked Apr 23, 2013 at 19:06

sqltracy's user avatar

I’m not sure if you can assign variables that way, try use INTO statement for your selects. For example:

SELECT 
    u.UserId INTO vvalidUserId 
FROM 
    Users u
WHERE 
    u.Username = i_username;

answered Apr 24, 2013 at 1:48

b.b3rn4rd's user avatar

b.b3rn4rdb.b3rn4rd

8,2842 gold badges41 silver badges55 bronze badges

1

Страниц: 1

  • Список
  •  » Программирование в MySQL
  •  » Странная ошибка: Not allowed to return a result set from a function

#1 28.05.2014 13:39:49

Piteryo
Участник
Зарегистрирован: 28.05.2014
Сообщений: 3

Странная ошибка: Not allowed to return a result set from a function

CREATE FUNCTION cena1243() RETURNS INTEGER

 
  BEGIN
 DECLARE a,b,sum1 INTEGER;

   
SELECT *
  FROM tovar t JOIN zakaz z;
   SET a=t.cena AND b=z.kolich;
  SET sum1=a*b;
    RETURN sum1;
  END

Подчеркивает «CREATE» и пишет, что Not allowed to return a result set from a function … Ошибка где то с селектом, помогите народ, что делать? Что это?

Неактивен

#2 28.05.2014 13:46:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3874

Re: Странная ошибка: Not allowed to return a result set from a function

У Вас голый SELECT, который не допускается, но и не нужен. В SELECT нет условия джойна и условия WHERE. Последнее нужно для того, чтобы выбиралась только одна запись.

SELECT t.cena, z.kolich FROM tovar t JOIN zakaz z (УСЛОВИЕ ДЖОЙНА) (УСЛОВИЕ WHERE) INTO a,b;

Если нужна не одна запись, считайте сумму в запросе средствами SQL.

Неактивен

#3 28.05.2014 14:18:08

Piteryo
Участник
Зарегистрирован: 28.05.2014
Сообщений: 3

Re: Странная ошибка: Not allowed to return a result set from a function

rgbeast написал:

У Вас голый SELECT, который не допускается, но и не нужен. В SELECT нет условия джойна и условия WHERE. Последнее нужно для того, чтобы выбиралась только одна запись.

SELECT t.cena, z.kolich FROM tovar t JOIN zakaz z (УСЛОВИЕ ДЖОЙНА) (УСЛОВИЕ WHERE) INTO a,b;

Если нужна не одна запись, считайте сумму в запросе средствами SQL.

Понял.. Но почему a,b выходят пустыми, соответственно и сумма…

BEGIN
 DECLARE a,b,sum1 INTEGER;

   
SELECT t.cena, z.kolich FROM tovar t JOIN zakaz z ON z.tovar_id=t.id
  WHERE t.id=1 AND z.id=1
  INTO a,b;

 
  SET sum1=a*b;

 
    RETURN sum1;
  END

Неактивен

#4 28.05.2014 14:26:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3874

Re: Странная ошибка: Not allowed to return a result set from a function

Возможно, запрос дает пустое значение. Так будет, если в первом заказе нет товара с номером 1

Неактивен

#5 28.05.2014 14:58:23

Piteryo
Участник
Зарегистрирован: 28.05.2014
Сообщений: 3

Re: Странная ошибка: Not allowed to return a result set from a function

Спасибо! Все заработало!

Неактивен

Страниц: 1

  • Список
  •  » Программирование в MySQL
  •  » Странная ошибка: Not allowed to return a result set from a function

Somebody, who read this post on Debugging MySQL Procedures, asked why the strategy of selecting a string literal didn’t work in a MySQL function. That’s easy, they’re not designed to support a SELECT statement, only a SELECT-INTO statement.

Why? That’s the purpose of a function to perform something and return a single reply.

That’s also why a MySQL functions only support the IN mode of operation for formal and call parameters. When formal parameters are restricted to in-mode-only operations, they implement a pass-by-value function model. This can also be expressed from the other side of the looking glass. In that case, MySQL functions don’t support pass-by-reference functions that use the INOUT or OUT mode operations.

If you put a SELECT statement in a function to print internal values or comments, it raises an error. Take for example the following attempt to create the debugging function with an echo of output (that works in stored procedures).

CREATE FUNCTION debugger() RETURNS INT
BEGIN
  SELECT '[Debug #1]';
  RETURN 1;
END;
$$

It fails to create the function because you’ve violated a key integrity rule. It also raises the following error:

ERROR 1415 (0A000): Not allowed to return a result set from a function

You have two potential solutions to this problem. The first is limited and inflexible. The second isn’t as limited or inflexible and is the recommended way to debug your functions without a tool. That’s to use a temporary table to record run-time debugging events.

Session Variable Debugging

Expand this section to see the steps for debugging functions with session variables.

  1. Create two session level variables, like these:
SET @counter := 0;
SET @msg := '';
  1. Create a function that uses the SELECT-INTO statement to collect and store debugging information during function execution.
CREATE FUNCTION debugger() RETURNS INT
BEGIN
  SELECT @counter + 1 INTO @counter;
  SELECT CONCAT('[Debug #',@counter,']') INTO @msg;
  RETURN 1;
END;
$$
  1. Run the function and then query the session variable for results
SELECT debugger();
SELECT @msg;

You’ll see the following text:

+------------+
| @msg       |
+------------+
| [Debug #1] |
+------------+

Temporary Table Debugging

Expand this section to see the steps for debugging functions with session variables.

  1. Only when you want a counter, create one session level variables.
  1. Create an in-memory table to store debugging information from function execution.
CREATE TABLE debugger
( debug_comment CHAR(80)) ENGINE=MEMORY;
  1. Create a function that supports inserts into the in-memory table. Naturally, you may need to make the columns larger when your debugging results are large. I’ve found that 80 characters is generally adequate for most debugging exercises.
1
2
3
4
5
6
7
CREATE FUNCTION debugger() RETURNS INT
BEGIN
  SELECT @counter + 1 INTO @counter;
  INSERT INTO debugger VALUES (CONCAT('[Debug #',@counter,']'));
  RETURN 1;
END;
$$
  1. Call the function and query the debugging results.
SELECT debugger();
SELECT debugger();
SELECT debugger();
SELECT debug_comment FROM debugger;

You’ll see the following text:

+---------------+
| debug_comment |
+---------------+
| [Debug #1]    |
| [Debug #2]    |
| [Debug #3]    |
+---------------+

Complete Code Sample

Expand this section to see the sample working code for all examples.

This script creates, runs, and tests the code from the above discussions.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
-- Conditionally drop the function when it exists.
DROP FUNCTION IF EXISTS debugger;
 
-- Set delimiter to create a function with semicolon statment terminators.
DELIMITER $$
 
-- Create a function that returns 1.
CREATE FUNCTION debugger() RETURNS INT
BEGIN
  SELECT '[Debug #1]';
  RETURN 1;
END;
$$
 
-- Reset the delimiter to enable normal execution.
DELIMITER ;
 
-- Declare session level variables.
SET @counter := 0;
SET @msg := '';
 
-- Conditionally drop the function when it exists.
DROP FUNCTION IF EXISTS debugger;
 
-- Set delimiter to create a function with semicolon statment terminators.
DELIMITER $$
 
-- Create a function that writes to local session variables.
CREATE FUNCTION debugger() RETURNS INT
BEGIN
  SELECT @counter + 1 INTO @counter;
  SELECT CONCAT('[Debug #',@counter,']') INTO @msg;
  RETURN 1;
END;
$$
 
-- Reset the delimiter to enable normal execution.
DELIMITER ;
 
-- Test the function code and read the session-level variable contents.
SELECT debugger();
SELECT @msg;
 
-- Declare a session level variable.
SET @counter := 0;
 
-- Conditionally drop the function when it exists.
DROP TABLE IF EXISTS debugger;
 
-- Create a temporary (in-memory) table to record debugging information.
CREATE TABLE debugger
( debug_comment CHAR(80)) ENGINE=MEMORY;
 
-- Conditionally drop the function when it exists.
DROP FUNCTION IF EXISTS debugger;
 
-- Set delimiter to create a function with semicolon statment terminators.
DELIMITER $$
 
-- Create a function that writes to a debugging table.
CREATE FUNCTION debugger() RETURNS INT
BEGIN
  SELECT @counter + 1 INTO @counter;
  INSERT INTO debugger VALUES (CONCAT('[Debug #',@counter,']'));
  RETURN 1;
END;
$$
 
-- Reset the delimiter to enable normal execution.
DELIMITER ;
 
-- Test the function code and read the session-level variable contents.
SELECT debugger();
SELECT debugger();
SELECT debugger();
SELECT debug_comment FROM debugger;

Я пытаюсь создать функцию MySQL с помощью phpMyAdmin и получить эту ошибку.

#1415 - Not allowed to return a result set from a function

Код функции приведен ниже

DELIMITER $$

CREATE FUNCTION get_binary_count(a INT, c INT)
RETURNS INT
DETERMINISTIC 

BEGIN

DECLARE c1, c2 INT;
SET c1=0;
SET c2=0;

SELECT left_id AS c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0;
SELECT right_id AS c2 FROM mlm_user_mst WHERE parent_id=a AND right_id>0;

IF(c1>0 AND c2>0)
THEN
SET c=c+1;
SET c=c+get_binary_count(c1,0);
SET c=c+get_binary_count(c2,0);
END IF;

RETURN c;

END$$

DELIMITER ;

Любые предложения?

Заранее спасибо

09 авг. 2012, в 12:11

Поделиться

Источник

2 ответа

Потому что

SELECT left_id AS c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0; 

не устанавливает переменную c1, она возвращает набор с столбцом c1

Вы хотите

SELECT left_id INTO c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0; 

Аналогично для c2.

podiluska
09 авг. 2012, в 10:31

Поделиться

потому что вы используете SELECT запросы, выход которых не хранится в переменных или временных внутри FUNCTION, которые должны. Функция может возвращать только одно значение. Поэтому ваш код должен быть примерно таким:

CREATE TABLE t1 AS SELECT left_id AS c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0;
CREATE TABLE t2 AS SELECT right_id AS c2 FROM mlm_user_mst WHERE parent_id=a AND right_id>0;

или

SELECT left_id AS c1 INTO @c1 FROM mlm_user_mst WHERE parent_id=a AND left_id>0 LIMIT 1; 

SELECT right_id AS c2 INTO @c2 FROM mlm_user_mst WHERE parent_id=a AND right_id>0 LIMIT 1;

Omesh
09 авг. 2012, в 10:44

Поделиться

Ещё вопросы

  • 0Настройка вкладок как активных с помощью PHP
  • 1Доступ к групповым индексам панд по второму индексу
  • 0PHP5 — инициация класса через строку — 2 разных способа
  • 1гистограмма индексируется по месяцу и дню [дубликаты]
  • 0HTML — Как я могу контролировать размещение элементов
  • 0DSO ссылается на скрытый символ fstat64 в /usr/lib/libc_nonshared.a(fstat64.oS)
  • 1Как запустить консольное приложение C # от имени администратора
  • 0Как добавить отсутствующие даты в начале и конце массива?
  • 1Как мне указать пункт назначения android.os.Message?
  • 0opcache включен, но почему я не вижу никакой разницы
  • 0Пользовательский C ++ Предикат и найти, если
  • 1Как преобразовать двоичные данные строки в строку в Android
  • 1вычисление средневзвешенного значения в панде
  • 0массив PHP с переменной, которая не создает ключ
  • 1Я создавал веб-сервис WCF и застрял в методах Post & Put, где Get работает нормально. Я добавил в него .edmx. Любое решение?
  • 0Segfault при использовании std :: string.c_str () в качестве аргумента для другого метода
  • 1Android: как использовать мой файл
  • 1Чтение cookie в приложении WPF
  • 1Состояние многопоточности Java
  • 0как реорганизовать / переименовать макросы в Eclipse C ++
  • 0Проект с несколькими выходами DLL
  • 0Разрыв строки после ключевого слова return в функции jQuery
  • 0Как получить параметры из URL в angularjs
  • 0как сессия закончилась — сессия отменена или истекло время ожидания
  • 1Сортировать заголовки столбцов в сетке данных wpf из xaml
  • 1Тензор потока: как работает gen_nn_ops.max_pool_grad_v2 ()?
  • 0ионное боковое меню не обновляется
  • 0получить данные xml elemnts с помощью php
  • 0Формирование запроса SQL, который находит общий возраст людей, у которых есть ‘ИЛИ’ O ‘в их имени из таблицы
  • 0Служба недоступна при использовании 2 вызовов CURL на разные URL — PHP
  • 0Якорь не работает
  • 1Невозможно изменить ось x с помощью dc.js v 2, не распознает .x или .xAxis
  • 1Объединение фиксированной и региональной нотации для форматирования строки
  • 0Как я могу получить идентификатор данных в добавленной кнопке?
  • 0Как включить удаленный вход в систему для mysql.?
  • 0Postgres и MySQL монтирует отказано докер
  • 0Переместить семантику, чтобы получить право собственности на данные из буфера?
  • 0Данные формы не отправляются для последующей обработки PHP
  • 1Маршалинг структуры в одну строку строки
  • 0Фильтры LESS и IE9: нет для совместимости с SVG-градиентом?
  • 0невозможно загрузить модели в Zend Framework
  • 1Какой самый быстрый способ заменить текст многих элементов управления контентом через office-js?
  • 1Естественная сортировка объекта индексированных массивов
  • 0сумма столбца php / mysql
  • 0Как мне установить класс на основе состояния дочернего элемента с Angular?
  • 0Получение строки запроса в PHP
  • 0Статус 400 Запрос, отправленный клиентом, был синтаксически неверным. Angularjs http
  • 0Как получить сообщения об ошибках AngularJS от jsfiddle?
  • 0Как сгладить буквальные свойства объекта?
  • 0Использование Select для динамического создания / удаления строк таблицы в Jquery

Сообщество Overcoder

nezabor

Как исправить функцию?

помогите создать функцию
честно говоря в mysql такое делаю впервые

CREATE DEFINER = CURRENT_USER FUNCTION `GetMailAcc`(`in_domen_id` int)
    RETURNS varchar(255)
BEGIN
    DECLARE result_str VARCHAR(255);
    SELECT COUNT(1) AS result_id  FROM L_mail_account AS MA WHERE MA.domen_id = in_domen_id LIMIT 1;
    IF result_id > 0 THEN
        SELECT id FROM L_mail_account ORDER BY last_upd DESC LIMIT 1;
    ELSE
        SELECT MA.id FROM L_mail_account AS MA WHERE MA.domen_id = in_domen_id LIMIT 1;
    END IF;
    RETURN id;
END;

говорит что не может сохранить
1415 — Not allowed to return a result set from a function


  • Вопрос задан

    более двух лет назад

  • 35 просмотров

вопрос решился передачей значения в переменную

CREATE DEFINER=`root`@`%` FUNCTION `GetMailAcc`(`in_domen_id` int) RETURNS int(11)
BEGIN

DECLARE result_str, count_str INT(11);

	SET count_str = (
			SELECT COUNT(1) AS QTY  
			FROM L_mail_account AS MA 
			WHERE MA.domen_id = in_domen_id 
			ORDER BY last_upd DESC 
			LIMIT 1
		);

	IF count_str > 0 THEN
		SET result_str = (SELECT MA.id FROM L_mail_account AS MA WHERE MA.domen_id = in_domen_id LIMIT 1);
	ELSE
		SET result_str = (SELECT id FROM L_mail_account ORDER BY last_upd DESC LIMIT 1);
	END IF;


	RETURN result_str;
END

но остался другой вопрос(((
Как исправить update +1 в функции?

Пригласить эксперта


  • Показать ещё
    Загружается…

09 февр. 2023, в 15:13

2000 руб./за проект

09 февр. 2023, в 15:06

2000 руб./за проект

09 февр. 2023, в 15:02

12000 руб./за проект

Минуточку внимания

Понравилась статья? Поделить с друзьями:
  • Error code 12007 no such host
  • Error code 120004
  • Error code 1200
  • Error code 12 не удалось обновить мастерлист loot
  • Error code 1193 unknown system variable