Ответить Новая тема Новый опрос 
 Выдает ошибку SQL запрос
aka_shuler
Новичок
Сообщений: 41
Регистрация: 11-07-2011


22-07-2011 15:02
Написал хранимку, которая должна получать родителей по айдишнику из таблицы. Допустим - передаем в таблицу айдишник нижней категории и процедура возвращает список верхних категорий.

Но SQL выдает ошибку:

SQL-запрос:

CREATE PROCEDURE get_parents( IN name_table VARCHAR( 64 ) , IN name_id VARCHAR( 64 ) , IN name_parent VARCHAR( 64 ) , IN base INT UNSIGNED, IN max_levels INT, IN result_in_var BOOLEAN, OUT result_ids MEDIUMTEXT ) BEGIN DECLARE ids MEDIUMTEXT DEFAULT '';


Ответ MySQL:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 11

CREATE PROCEDURE get_parents(
IN name_table VARCHAR(64),
IN name_id VARCHAR(64),
IN name_parent VARCHAR(64),
IN base INT UNSIGNED,
IN max_levels INT,
IN result_in_var BOOLEAN,
OUT result_ids MEDIUMTEXT
)
BEGIN
DECLARE ids MEDIUMTEXT DEFAULT '';
DECLARE currlevel INT DEFAULT 0;

SET @parents = base;

IF result_in_var THEN
SET result_ids = '';
END IF;

-- В случае если max_levels равно 0, то допускаем 100000 уровней.
-- Отрицательные значения дадут один уровень — это побочное явление.
SET currlevel = IF(max_levels, 1, -100000);

REPEAT
-- Внимание! Значение base тоже входит в результат.
IF result_in_var THEN
-- Если result_in_var истинно, то результат сохраняем в result_ids.
SET result_ids = CONCAT(result_ids, IF(LENGTH(result_ids), ',', ''), @parents);
ELSE
-- Иначе сохраняем в локальной переменной.
SET ids = CONCAT(ids, IF(LENGTH(ids), ',', ''), @parents);
END IF;

SET @stm = CONCAT(
'SELECT GROUP_CONCAT(', name_parent, ') INTO @parents FROM ', name_table,
' WHERE ', name_id, ' IN (', @parents, ')'
);

PREPARE fetch_childs FROM @stm;
EXECUTE fetch_childs;
DROP PREPARE fetch_childs;

SET currlevel = currlevel + 1;
UNTIL (@parents IS NULL OR currlevel > max_levels) END REPEAT;

IF NOT result_in_var THEN
-- Если результат не в переменной — вернем рекордсет.
SET @stm := CONCAT(
'SELECT ', name_parent, ' FROM ', name_table,
' WHERE ', name_parent, ' IN (', ids, ')'
);

PREPARE fetch_childs FROM @stm;
EXECUTE fetch_childs;
DROP PREPARE fetch_childs;
END IF;
END;

Что я делаю не так?
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
e_v_medvedev
Профессионал
Сообщений: 806
Откуда: Москва
Регистрация: 25-03-2011


22-07-2011 15:10
Возможно используете устаревшую версию MySQL, в которой не поддерживаются хранимые процедуры :-)
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
aka_shuler
Новичок
Сообщений: 41
Регистрация: 11-07-2011


22-07-2011 15:12
Ситуация такова - у меня сейчас товары только в нижней группе товаров. Как мне сделать так, чтобы они еще были привязаны и к верхним группам тоже. Товаров - больше 6000 сейчас, так что вариант - вручную лучше не рассматривать.

На PHP - не программирую. Подскажите
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
e_v_medvedev
Профессионал
Сообщений: 806
Откуда: Москва
Регистрация: 25-03-2011


22-07-2011 18:08
По такому описанию сложно понять, что вы хотите. О каких группах речь? Если проблема с хранимыми процедурами, то это лучше выносить на обсуждение в формы по mySQL, а не сюда.
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Ответить Новая тема Новый опрос