2015-03-30 4 views
0
CREATE PROCEDURE procedure() BEGIN 
    DECLARE tmp DECIMAL(8,2) ; 
    SELECT cip.modifier * cip.price * COALESCE(CAST(cip.quantity AS SIGNED), 1) INTO tmp FROM customerInvoicePosition cip... 
    SELECT SUM(tmp * (if(cip.type=0,1,0))) FROM customerInvoicePosition cip... 
    SELECT SUM(tmp * (if(cip.type=1,1,0))) FROM customerInvoicePosition cip... 
    SELECT SUM(tmp * (if(cip.type=2,1,0))) FROM customerInvoicePosition cip... 
    SELECT SUM(tmp * (if(cip.type=3,1,0))) FROM customerInvoicePosition cip... 
    END; 

Ошибка: Результат состоит из более чем одной строкиSELECT INTO localVariable более один ряд

ОК, я понимаю, сообщение об ошибке, но есть какое-то решение для хранения более одной строки в переменном/списке?

+0

Нет, используйте (временную) таблицу. – fancyPants

+0

Нравится это: СОЗДАТЬ ВРЕМЕННЫЙ ТАБЛИЦ, ЕСЛИ НЕ СУЩЕСТВУЕТ tmp AS (SELECT cip.modifier * cip.price * COALESCE (CAST (cip.quantity AS SIGNED), 1) FROM customerInvoicePosition cip ...) –

ответ

0

Используйте cursor - Я приведу пример, но поскольку ваш код не делает ничего значимого, его невозможно посоветовать.

Если вы посмотрите на свой код, возможно, было бы целесообразно создать представление, а не использовать временную таблицу (полу-?), Хотя преимущества этого подхода могут быть особенно важны, особенно если данные могут сохраняться на всех сеансах).

На самом деле, возможно, будет возможно описать функциональность в одном операторе select (то, что осталось от кода здесь очень неэффективно), но снова вы исказили код до точки удаления любого значения из него.

+0

До этого конца; Существует часть: INSERT INTO Новая_таблица (param1, param2, param3, param4) ВЫБРАТЬ SUM (TMP * (если (cip.type = 0,1,0))), SUM (TMP * (если (cip.type = 1,1,0))), SUM (tmp * (if (cip.type = 2,1,0))), SUM (tmp * (if (cip.type = 3,1 , 0))) FROM customerInvoicePosition cip ... end; –

+0

Вставьте весь код в свой вопрос. – symcbean