Хранимые процедуры в MySQL

Привет, случилос так, что вчера нужно было срочно написать хранимку на мускуле, да вот ни у кого опыта написания хранимок особенно не было, а у MySQL тем более.

вот и пришлось отдуваться, вначале написал процедуру, потом оказалось, что нужна была функция, собсно, результат стараний выложен ниже:

что делает процедура: она получает идентификатор товара (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 indexMfetch cur1 into a1;
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 indexMfetch cur1 into a1;
set resultText=CONCAT(resultText, ",", a1);
set indexM=indexM+1;
END WHILE;
CLOSE cur1;

return lcase(resultText);
END;//

3 комментария:

  1. Все хорошо. но если бы еще запросы правильно копировал без "потери" кусков...

    ОтветитьУдалить
  2. :) вроде бы ок, это все клочки, а не 1 запрос

    ОтветитьУдалить

Можете оставить свой комментарий