SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.02.2015 17:37:51

QMySQL
Участник
Зарегистрирован: 01.02.2015
Сообщений: 9

Хранимая функция, возвращающая массив

Добрый день.
На PHP есть код вида:

function myFunction($ID, $value)
{
    switch($ID)
    {
        case 1:
            if($value < 2000) return array(
                    1 => 0.01934*floor($value/50)*20+2.5,
                    2 => 0.0149*floor($value/500)*500+37.5,
                    3 => 0.01774*floor($value/500)*500+30);
            else return array(
                    2 => 0.0149*floor($value/500)*500+37.5,
                    3 => 0.01774*floor($value/500)*500+30);
        case 2:
            if($value < 2000) return array(
                    1 => 0.021*ceil($value/50)*20+2.2,
                    3 => 0.0192*ceil($value/500)*500+27);
            else return array(
                    3 => 0.01774*floor($value/500)*500+30);
        case 3:
            if($value < 2000) return array(
                    1 => 0.021*ceil($value/20)*20+5.35,
                    3 => 0.028*floor($value/500)*500+27);
            else return array(
                    2 => 0.0117*floor($value/500)*500+20,
                    3 => 0.028*floor($value/500)*500+27);
        default: return array();
    }
}

Можно ли ее переписать в виде хранимой функции в MySQL?

Неактивен

 

#2 01.02.2015 17:39:30

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Хранимая функция, возвращающая массив

Можно, почему нет? http://dev.mysql.com/doc/refman/5.0/en/ … tions.html в помощь


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

Неактивен

 

#3 01.02.2015 18:44:51

QMySQL
Участник
Зарегистрирован: 01.02.2015
Сообщений: 9

Re: Хранимая функция, возвращающая массив

Тут скорее имелось ввиду не применение мат. функций (понятно, что они везде есть), а сама реализация того кода в MySQL. Может кто помочь. Как делать функцию, которая возвращает одно значение - это ясно. А как массив?

Т.е. чтобы было так (наподобие):

SELECT myFunc(1, 100500)

Вывод:
2 | 345.45
3 | 100500.100500

Неактивен

 

#4 01.02.2015 19:19:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Хранимая функция, возвращающая массив


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

Неактивен

 

#5 01.02.2015 21:05:00

QMySQL
Участник
Зарегистрирован: 01.02.2015
Сообщений: 9

Re: Хранимая функция, возвращающая массив

CREATE PROCEDURE `myFunc`(IN `ID` TINYINT, IN `value` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    NO SQL
    SQL SECURITY DEFINER
    COMMENT 'Коммент'
BEGIN
CREATE TEMPORARY TABLE `Temp` (
`ID` TINYINT UNSIGNED NOT NULL,
`Result` DOUBLE UNSIGNED NOT NULL
);
CASE ID
    WHEN 1 THEN
        CASE
            WHEN value < 2000 THEN
                INSERT INTO Temp (ID,Result) VALUES(1,0.01774*FLOOR(value/500)*500+30),(2,0.01934*FLOOR(value/50)*20+2.5),(3,0.0149*FLOOR(value/500)*500+37.5);
            ELSE
                INSERT INTO Temp (ID,Result) VALUES(1,0.01774*FLOOR(value/500)*500+30),(3,0.0149*FLOOR(value/500)*500+37.5);
        END CASE;
    WHEN 2 THEN
        CASE
            WHEN value < 2000 THEN
                INSERT INTO Temp (ID,Result) VALUES(1,0.0192*CEIL(value/500)*500+27),(2,0.021*CEIL(value/50)*20+2.2);
            ELSE
                INSERT INTO Temp (ID,Result) VALUES(1,0.01774*FLOOR(value/500)*500+30);
        END CASE;
    WHEN 3 THEN
        CASE
            WHEN value < 2000 THEN
                INSERT INTO Temp (ID,Result) VALUES(1,0.028*FLOOR(value/500)*500+27),(2,0.021*CEIL(value/20)*20+5.35);
            ELSE
                INSERT INTO Temp (ID,Result) VALUES(1,0.028*FLOOR(value/500)*500+27),(3,0.0117*FLOOR(value/500)*500+20);
        END CASE;
END CASE;
SELECT * FROM Temp;
END

Ошибка SQL (1305): FUNCTION db.myFuncdoes not exist

Что не так?

Неактивен

 

#6 01.02.2015 21:50:45

QMySQL
Участник
Зарегистрирован: 01.02.2015
Сообщений: 9

Re: Хранимая функция, возвращающая массив

Разобрался. Надо делать CALL.

Неактивен

 

#7 02.02.2015 10:43:32

QMySQL
Участник
Зарегистрирован: 01.02.2015
Сообщений: 9

Re: Хранимая функция, возвращающая массив

Кто знает, а можно в процедуру передать таблицу?
Нужно передать, например, это:
1 | 100
3 | 1670
2 | 55

Неактивен

 

#8 02.02.2015 15:27:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимая функция, возвращающая массив

Передавать имя временной таблицы с нужными данными.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson