Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при вызове рекурсивной процедуры 
V
    Опции темы
DrRex
Дата 22.12.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.11.2007
Где: Самара

Репутация: нет
Всего: нет



Суть проблемы: при вызове рекурсивной процедуры ADD_EXTRA при большом уровне вложенности сервер возвращает ошибку
Код
Too many concurrent executions of the same request.
    -sql_dialect    set database dialect n.

При небольшом уровне вложенности (2-3) проблем нет. Кто-нибудь знает в чем причина ошибки и как ее избежать? Сервер FireBird2.0.
Код ADD_EXTRA
Код

CREATE PROCEDURE ADD_EXTRA (
    BASEBRICE_ID INTEGER,
    COEFF DOUBLE PRECISION,
    ABSOLUTE DOUBLE PRECISION,
    PARTNER_ID INTEGER,
    ISSPEC SMALLINT,
    USER_ID INTEGER)
AS
DECLARE VARIABLE CURID INTEGER;
begin
  if (exists(select b.id from baseprice b where b.parid=:basebrice_id)) then begin /*выбрана группа товаров*/
     execute procedure extra_iu (:partner_id,:basebrice_id,:coeff,:absolute,:user_id,:isspec);   
     for select b.id from baseprice b  where b.parid=:basebrice_id into :curid do begin
         Execute procedure Add_extra(:curid,:coeff,:absolute,:partner_id,:isspec,:user_id);
     end
  end else begin  /*выбран товар*/
     execute procedure extra_iu (:partner_id,:basebrice_id,:coeff,:absolute,:user_id,:isspec);
  end
  suspend;
end

Код extra_iu:
Код

CREATE PROCEDURE EXTRA_IU (
    PARTNER_ID INTEGER,
    BASEPRICE_ID INTEGER,
    COEFF DOUBLE PRECISION,
    ABSOLUTE DOUBLE PRECISION,
    USER_ID INTEGER,
    IS_SPEC SMALLINT)
AS
BEGIN
  IF (EXISTS(SELECT ID FROM EXTRA E WHERE (E.partner_id = :PARTNER_ID and e.baseprice_id=:baseprice_id))) THEN
    UPDATE EXTRA E
    SET COEFF = :COEFF,
        ABSOLUTE = :ABSOLUTE,
        IS_SPEC = :IS_SPEC
    WHERE (E.partner_id = :PARTNER_ID and e.baseprice_id=:baseprice_id);
  ELSE
    INSERT INTO EXTRA (
        PARTNER_ID,
        BASEPRICE_ID,
        COEFF,
        ABSOLUTE,
        USER_ID,
        IS_SPEC)
    VALUES (
        :PARTNER_ID,
        :BASEPRICE_ID,
        :COEFF,
        :ABSOLUTE,
        :USER_ID,
        :IS_SPEC);
END


PM MAIL ICQ   Вверх
igor_123
Дата 25.12.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 14.12.2007
Где: Днепропетровск

Репутация: нет
Всего: нет



А какова получается глубина рекурсии при ошибке???

Здесь:
if (exists(select b.id from baseprice 
случайно не пропущен NOT, а то получается ты на каждую существующую запись уходиш вглубь???

Ну и задал-бы вопрос на sql.ru, там разработчики FireBird часто бывают - приникнеш к первоисточнику ;-)

Забыл о главном сайте: ibase.ru, здесь тебе ответят на любые вопросы по FireBird

Это сообщение отредактировал(а) igor_123 - 25.12.2007, 11:41
PM MAIL   Вверх
DrRex
Дата 25.12.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.11.2007
Где: Самара

Репутация: нет
Всего: нет



Цитата(igor_123 @  25.12.2007,  10:26 Найти цитируемый пост)
if (exists(select b.id from baseprice случайно не пропущен NOT, а то получается ты на каждую существующую запись уходиш вглубь???

Забыл указать: в таблице BASEPRICE данные хранятся в виде древовидной структуры, и поле PARID указывает на ID родителя. Поэтому логика запроса верна: выбираем все дочерние объекты, спускаемся по дереву пока не дойдем до терминальных записей.
igor_123 за ссылки спасибо, посмотрим там smile 
PM MAIL ICQ   Вверх
DrRex
Дата 26.12.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.11.2007
Где: Самара

Репутация: нет
Всего: нет



Вопрос снят.
PM MAIL ICQ   Вверх
Bose
Дата 3.1.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: нет
Всего: 51



Цитата(DrRex @  26.12.2007,  13:10 Найти цитируемый пост)
Вопрос снят.


И в чём была проблема?
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0973 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.