SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.09.2008 14:51:11

FreeRadio
Участник
Зарегистрирован: 26.03.2008
Сообщений: 6

деревья, нужна помощь по хп

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

CREATE PROCEDURE EL_TEST4 (
  PARENT INTEGER,
  DELTA INTEGER,
  LB2 INTEGER,
  RB2 INTEGER)
RETURNS (
  LEFTBORDER INTEGER)
AS
  DECLARE VARIABLE R INTEGER;
  DECLARE VARIABLE L INTEGER;
  DECLARE VARIABLE R2 INTEGER;
  DECLARE VARIABLE MKey INTEGER;
  DECLARE VARIABLE MultiDelta INTEGER;
BEGIN
  /* Получаем границы родителя */
  SELECT rb, lb
  FROM test4
  WHERE id = :Parent
  INTO :R, :L;
 
  /* Получаем крайнюю правую границу потомков, */
  /* родителя, если они существуют */
  R2 = NULL;
  SELECT MAX(rb) FROM test4 WHERE parent = :Parent
    INTO :R2;
 
  /* Если потомков нет берем левую границу */
  /* родителя */
  IF (:R2 IS NULL) THEN
    R2 = :L;
 
  /* проверяем: хватит ли места для размещения */
  /* еще одного потомка в интервале родителя */
  IF (:R - :R2 < :Delta) THEN
  BEGIN
    /* Если места не достаточно -- раздвигаем */
    /* интервал */
    MultiDelta = :R - :L + 100;
 
    /* Проверяем удовлетворяет ли нас новый */
    /* диапазон */
    IF (:Delta > :MultiDelta) THEN
      MultiDelta = :Delta;
 
    /* Сдвигаем правую границу родителей */
    IF (:LB2 > -1) THEN
      UPDATE test4 SET rb = rb + :MultiDelta
      WHERE lb <= :L AND rb >= :R
        AND NOT (lb >= :LB2 AND rb <= :RB2);
    ELSE
      UPDATE test4 SET rb = rb + :MultiDelta
      WHERE lb <= :L AND rb >= :R;
 
    /* Сдвигаем обе границы интервалов, лежащих*/
    /* правее, от родительского интервала */
    IF (:LB2 > -1) THEN
      UPDATE test4
        SET lb = lb + :MultiDelta,
        rb = rb + :MultiDelta
        WHERE lb > :R
          AND NOT (lb >= :LB2 AND rb <= :RB2);
    ELSE
      UPDATE test4
        SET lb = lb + :MultiDelta,
        rb = rb + :MultiDelta
        WHERE lb > :R;
  END
 
  /* возвращаем найденную границу */
  LeftBorder = :R2 + 1;
END;

Отредактированно FreeRadio (09.09.2008 14:59:26)

Неактивен

 

#2 09.09.2008 16:48:25

Sign
Гуру
Зарегистрирован: 26.06.2008
Сообщений: 43

Re: деревья, нужна помощь по хп

Ну если вас интересует только синтаксис, то вот:

CREATE FUNCTION EL_TEST4 (
  PARENT 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 test4 t
  WHERE id = Parent;
 
  /* Получаем крайнюю правую границу потомков, */
  /* родителя, если они существуют */
  set R2 = NULL;
  SELECT MAX(rb) INTO R2 FROM test4 WHERE parent = Parent;
 
  /* Если потомков нет берем левую границу */
  /* родителя */
  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 test4 SET rb = rb + MultiDelta
          WHERE lb <= L AND rb >= R
            AND NOT (lb >= LB2 AND rb <= RB2);
        ELSE
          UPDATE test4 SET rb = rb + MultiDelta
          WHERE lb <= L AND rb >= R;
        END IF;

     
        /* Сдвигаем обе границы интервалов, лежащих*/
        /* правее, от родительского интервала */
        IF (LB2 > -1) THEN
          UPDATE test4
            SET lb = lb + MultiDelta,
            rb = rb + MultiDelta
            WHERE lb > R
              AND NOT (lb >= LB2 AND rb <= RB2);
        ELSE
          UPDATE test4
            SET lb = lb + MultiDelta,
            rb = rb + MultiDelta
            WHERE lb > R;
        END IF;
    END;
  END IF;
 
  /* возвращаем найденную границу */
  RETURN R2 + 1;
END;

Неактивен

 

#3 11.09.2008 10:58:15

FreeRadio
Участник
Зарегистрирован: 26.03.2008
Сообщений: 6

Re: деревья, нужна помощь по хп

не подходит, пишет ошибка синтаксиса.
вот что ввожу

Код:

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)

Неактивен

 

#4 11.09.2008 12:25:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: деревья, нужна помощь по хп

"Ошибка синтаксиса" - понятие растяжимое. Можете написать то, что конкретно
написано в ошибке?

В данном куске, например, не хватает разделителей правильных

DELIMITER ;;
CREATE TABLE .... ;;
CREATE FUNCTION ... ;;
DELIMITER ;

Неактивен

 

#5 12.09.2008 10:30:43

FreeRadio
Участник
Зарегистрирован: 26.03.2008
Сообщений: 6

Re: деревья, нужна помощь по хп

незнаю, и на нем сразу же ошибка:

[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 может из-за версии

Неактивен

 

#6 12.09.2008 12:52:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: деревья, нужна помощь по хп

а какой клиент используете? Попробуйте из консоли mysql все это выполнить.

Неактивен

 

#7 12.09.2008 13:10:13

FreeRadio
Участник
Зарегистрирован: 26.03.2008
Сообщений: 6

Re: деревья, нужна помощь по хп

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

Неактивен

 

#8 12.09.2008 13:17:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: деревья, нужна помощь по хп

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

Неактивен

 

#9 12.09.2008 15:07:34

FreeRadio
Участник
Зарегистрирован: 26.03.2008
Сообщений: 6

Re: деревья, нужна помощь по хп

Спасибо, теперь все ясно)

Неактивен

 

#10 13.09.2008 16:19:55

FreeRadio
Участник
Зарегистрирован: 26.03.2008
Сообщений: 6

Re: деревья, нужна помощь по хп

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson