Проблема с ХП

Модераторы: kdv, CyberMax

Ответить
stepan96
Сообщения: 12
Зарегистрирован: 15 сен 2005, 11:52

Проблема с ХП

Сообщение stepan96 » 24 янв 2007, 11:07

День добрый!

Дано: таблицы, определяющие некоторые объекты (пользователи, группы пользователей, процессы, элементы и т.д.)
Надо: разработать ХП, которая для любого из объектов возвращает следующее значение по умолчанию для поля "наименование".
Простите если не понятно, сейчас объясню. Получение информации об объекте и сохранение объекта в базе реализовано с помощью ХП. Работа ХП для каждого из объектов аналогичная.
При запросе информации об объекте (например для процесса), если запись с запрошенным ID отсутствует, то возвращаются значения по умолчанию (данный случай возникает при работе с новой записью).
Для поля, которое определяет наименование объекта должно возвращаться генериремое значение вида "Процесс_1".
Вот код ХП, которая возвращает это генерируемое значение:

Код: Выделить всё

CREATE PROCEDURE GET_DEFAULTTITLE(
  TABLE_NAME VARCHAR(50) CHARACTER SET NONE,
  FIELD_NAME VARCHAR(50) CHARACTER SET NONE,
  TITLE VARCHAR(50) CHARACTER SET NONE)
RETURNS(
  DEFAULT_TITLE VARCHAR(50) CHARACTER SET NONE)
AS
DECLARE VARIABLE I BIGINT;
DECLARE VARIABLE RECORD_ID BIGINT;
DECLARE VARIABLE STR VARCHAR(100) CHARACTER SET NONE;
BEGIN
  I = 1;
  WHILE (1 = 1) DO
  BEGIN
    STR = :TITLE || '_' || CAST(:I AS VARCHAR(10));
    EXECUTE STATEMENT 'SELECT ID FROM ' || TABLE_NAME || ' WHERE ' || FIELD_NAME || ' = ''' || STR || '''' INTO :RECORD_ID;

    IF ((RECORD_ID IS NULL) OR (RECORD_ID = 0)) THEN
    BEGIN
      DEFAULT_TITLE = :STR;
      LEAVE;
    END
    ELSE
    BEGIN
      I = :I + 1;
    END
  END
  EXIT;
END
Проблема вот в чем: если в таблице не существует записей вида "Процесс_1", то все хорошо. Но если такая запись есть, то происходит зацикливание. Я уж и не знаю в чем может быть проблема.
Подскажите пожалуйста

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Проблема с ХП

Сообщение WildSery » 24 янв 2007, 11:32

Во-первых, убери EXIT в конце. Не нужен.
Во-вторых, любой SELECT, в том числе и внутри ES, не изменит значения RECORD_ID, если не выбрано ни одной записи. Добавь инициализацию RECORD_ID = 0 перед ES.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 24 янв 2007, 12:09

Я бы еще посоветовал произвести рефакторинг процедуры, поместив условие выхода непосредственно в WHILE ... DO. Ты бы сразу понял, в чем дело.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 24 янв 2007, 12:26

CyberMax писал(а):рефакторинг процедуры
+1
Длина процедуры и сложность понимания её логики сокращается.

stepan96
Сообщения: 12
Зарегистрирован: 15 сен 2005, 11:52

Всем большое спасибо!

Сообщение stepan96 » 24 янв 2007, 17:46

Низкий поклон всем!
Ваши советы помогли.

Ответить