![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Нашел как дерево посадить, а в мускуле хп процедурами особо не пользовался
Помогите перевести процедуру в правильный синтаксис под MySQL, очень нужно
Отредактированно FreeRadio (09.09.2008 14:59:26)
Неактивен
Ну если вас интересует только синтаксис, то вот:
Неактивен
не подходит, пишет ошибка синтаксиса.
вот что ввожу
CREATE TABLE `bd_tema` (
`ID_TEMA` int(11) NOT NULL auto_increment,
`PARENT` int(11) NOT NULL default '0',
`LINE` tinytext NOT NULL,
`CODE` varchar(100) NOT NULL default '',
`lb` int(11) NOT NULL,
`rb` int(11) NOT NULL,
PRIMARY KEY (`ID_TEMA`),
FOREIGN KEY (`PARENT`) REFERENCES bd_tema (`ID_TEMA`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CHECK (lb <= rb)
);
CREATE FUNCTION EL_TEMA (
pparent INTEGER,
DELTA INTEGER,
LB2 INTEGER,
RB2 INTEGER)
RETURNS INTEGER
BEGIN
DECLARE R INTEGER;
DECLARE L INTEGER;
DECLARE R2 INTEGER;
DECLARE MKey INTEGER;
DECLARE MultiDelta INTEGER;
SELECT t.rb, t.lb
INTO R, L
FROM bd_tema t
WHERE ID_TEMA= pparent;
SET R2 = NULL;
SELECT MAX(rb) INTO R2 FROM bd_tema WHERE PARENT = pparent;
IF R2 IS NULL THEN
SET R2 = L;
END IF;
IF R - R2 < Delta THEN
BEGIN
SET MultiDelta = R - L + 100;
IF (Delta > MultiDelta) THEN
SET MultiDelta = Delta;
END IF;
IF (LB2 > -1) THEN
UPDATE bd_tema SET rb = rb + MultiDelta
WHERE lb <= L AND rb >= R
AND NOT (lb >= LB2 AND rb <= RB2);
ELSE
UPDATE bd_tema SET rb = rb + MultiDelta
WHERE lb <= L AND rb >= R;
END IF;
IF (LB2 > -1) THEN
UPDATE bd_tema
SET lb = lb + MultiDelta,
rb = rb + MultiDelta
WHERE lb > R
AND NOT (lb >= LB2 AND rb <= RB2);
ELSE
UPDATE bd_tema
SET lb = lb + MultiDelta,
rb = rb + MultiDelta
WHERE lb > R;
END IF;
END;
END IF;
RETURN R2 + 1;
END;ссылка на источник
Отредактированно FreeRadio (11.09.2008 11:05:51)
Неактивен

"Ошибка синтаксиса" - понятие растяжимое. Можете написать то, что конкретно
написано в ошибке?
В данном куске, например, не хватает разделителей правильных
DELIMITER ;;
CREATE TABLE .... ;;
CREATE FUNCTION ... ;;
DELIMITER ;
Неактивен
незнаю, и на нем сразу же ошибка:
[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 'DELIMITER' at line 1
запрос:
DELIMITER ;;
стоит MySQL 5.2 может из-за версии
Неактивен

а какой клиент используете? Попробуйте из консоли mysql все это выполнить.
Неактивен
использую libmysql.dll и API функции из Delphi. в консоли выполняется без проблем, спасибо, но проблема все равно не решена. думал библиотека устаревшая, скопировал ту что с мускулом была, все равно та же ситуация.
Неактивен

DELIMITER - функция консоли, если работаете с библиотекой, то если она поддерживает создание хранимых процедур, то выполняйте просто запрос без ;; на конце.
Неактивен
Спасибо, теперь все ясно)
Неактивен
похоже что дерево как в статье реализовать не получится, там в update триггере замыкание на самом себе. похоже единственный вариант сделать отдельные процедуры на добавление и удаление узлов.
Неактивен