вот и пришлось отдуваться, вначале написал процедуру, потом оказалось, что нужна была функция, собсно, результат стараний выложен ниже:
что делает процедура: она получает идентификатор товара (IN goodsId INT), происходит выборка всех атрибутов товара и пихается в курсор cur1. далее мы бегаем по всей выборке, и пихаем все названия атрибутов в одну переменную через запятую.
А после ее выводим в шелл.
на второй параметр не особо обращайте внимание, просто хотел показать, что может быть аутовский параметр, в качестве которого можно передать переменную, а процедура ее сможет изменить, и после вызова, в этой переменной, сохраниться измененное значение.
--DROP PROCEDURE getImplode;//
CREATE PROCEDURE getImplode (IN goodsId INT, OUT implodeText VARCHAR(255))
BEGIN
DECLARE a1 varchar(255); -- объявление переменных
DECLARE resultText text;
declare idFact, idMaster, idSlave, indexM, indexS int default 0;
-- создаем курсор и определяем для него выборку (или наоборот, кому как :) )
DECLARE cur1 CURSOR FOR SELECT atr.RusName as Name FROM inln_Attributes AS atr, inln_ValueToAttributes AS vta, inln_AttributeToGoods AS atg WHERE vta.AttributeId = atr.AttributeId AND vta.ValueId = atg.ValueId AND atr.AttributeId = atg.AttributeId AND atg.GoodId = goodsId;
open cur1; -- открывае курсор
set idMaster = (Select FOUND_ROWS()); -- получаем количество найденных строк в курсуре
set resultText = " "; -- обязательно инициализируем переменную, иначе NULL + строка будет NULL
-- бегаем по курсору, пока не прочтем все строки
while indexM
set resultText=CONCAT(resultText, ",", a1);
set indexM=indexM+1;
END WHILE;
CLOSE cur1; -- закрываем курсор
SELECT lcase(resultText); -- переводим строку в нижний регистр, и выводим в шелл
END;//
-- вызываем и смотрим результат
CAll getImplode(20,@a);//
--SELECT @a;//
Ниже приведен пример кода для создания функцй в мускуле, отличается от процедур немногим:
1. появился возращаемый тип данных
2. появилось одно единое возвращаемое значение (return значение)
CREATE FUNCTION getImplode (goodsId INT)
RETURNS text --возвращаемый тип данных
DETERMINISTIC
BEGIN
DECLARE a1 varchar(255);
DECLARE resultText text;
declare idFact, idMaster, idSlave, indexM, indexS int default 0;
DECLARE cur1 CURSOR FOR SELECT atr.RusName as Name FROM inln_Attributes AS atr, inln_ValueToAttributes AS vta, inln_AttributeToGoods AS atg WHERE vta.AttributeId = atr.AttributeId AND vta.ValueId = atg.ValueId AND atr.AttributeId = atg.AttributeId AND atg.GoodId = goodsId;
open cur1;
set idMaster = (Select FOUND_ROWS());
set resultText = " ";
while indexM
set resultText=CONCAT(resultText, ",", a1);
set indexM=indexM+1;
END WHILE;
CLOSE cur1;
return lcase(resultText);
END;//
О_х
ОтветитьУдалитьВсе хорошо. но если бы еще запросы правильно копировал без "потери" кусков...
ОтветитьУдалить:) вроде бы ок, это все клочки, а не 1 запрос
ОтветитьУдалить