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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Надо чтобы ХП возвращала ID добавленной ею записи 
V
    Опции темы
ksili
Дата 14.2.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Есть хранимая процедура:
Код

SET TERM ^ ;

CREATE PROCEDURE ADD_CALL_TO_OLD_BUFFER (
    p_phone char(11),
    p_counter integer,
    p_owner char(1),
    p_user_type char(1),
    p_op smallint,
    p_audio smallint = 0,
    p_to char(20) = '',
    p_id integer = 0)
as
begin
  /* Procedure Text */
  if (not exists (select * from t_bufer where CALLBACK_NUMBER=:p_phone)) then
    begin
    insert into t_bufer (CALLBACK_NUMBER,CALLBACK_COUNTER,ID_CHANEL,USER_TYPE,TIME_BEGIN,OPERATOR,AUDIO,CALL_NUMBER,ID_USER)
    values (:p_phone,:p_counter,:p_owner,:p_user_type,CURRENT_TIMESTAMP,:p_op,:p_audio,:p_to,:p_id);
    end
  suspend;
end^

SET TERM ; ^

Она добавляет запись в таблицу T_BUFER:
Код

CREATE TABLE T_BUFER (
    ID_BUFER          INTEGER NOT NULL,
    CALLBACK_NUMBER   CHAR(11),
    CALLBACK_COUNTER  INTEGER,
    ID_CHANEL         CHAR(1),
    USER_TYPE         CHAR(1),
    TIME_BEGIN        TIMESTAMP,
    OPERATOR          SMALLINT DEFAULT 0 NOT NULL,
    AUDIO             SMALLINT DEFAULT 0,
    CALL_NUMBER       CHAR(20),
    ID_USER           INTEGER
);

Надо чтобы она ещё возвращала ID_BUFER записи, которую она добавила, или 0, если ничего не добавила. Как это сделать? 
Получить этот ID_BUFER надо быстро (внутри одной транзакции) чтобы после добавления этой записи и до получения ID_BUFER, эту запись не мог случайно удалить кто-то другой


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 14.2.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Сделал так:
Код

begin
  /* Procedure Text */
  p_index = -1;
  if (not exists (select * from t_bufer where CALLBACK_NUMBER=:p_phone)) then
    begin
    insert into t_bufer (CALLBACK_NUMBER,CALLBACK_COUNTER,ID_CHANEL,USER_TYPE,TIME_BEGIN,OPERATOR,AUDIO,CALL_NUMBER,ID_USER)
    values (:p_phone,:p_counter,:p_owner,:p_user_type,CURRENT_TIMESTAMP,:p_op,:p_audio,:p_to,:p_id);
    select ID_BUFER from t_bufer where CALLBACK_NUMBER=:p_phone into :p_index;
    end
  suspend;
end

Но не уверен, что это удовлетворяет последнему условию из первого поста


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
kZ25
Дата 14.2.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



попробую угадать, Вас ID_BUFER  заполняется в триггере c изпользованием генератора.

В таком случее, Вы можете генерировать значение ID_BUFER в процедуре, перед вставкой (используя функцию GEN_ID(имя_генератора, 1))
PM MAIL   Вверх
Deniz
Дата 15.2.2008, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



В процедуре добавить:
Код

RETURNS (ID_BUFER INTEGER)

и в триггере проверять:
Код

  if (new.ID_BUFER is null) then new.ID_BUFER = gen_id(..., 1);


Это сообщение отредактировал(а) Deniz - 15.2.2008, 07:01


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 17.2.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Код

          INSERT INTO TREKLAMA (
            ID_NAPR,
            ID_TYPE,
            ID_RAZDEL,
...


          VALUES (
            :ID_NAPR,
            :ID_TYPE,
            :ID_RAZDEL,
...

  RETURNING ID INTO :OUT_ID; -- OUT_ID - выходной параметр
  suspend;



в приложении у меня такой код, прмерно:
Код

      spTREKLAMA_INS.ExecQuery;
      if spTREKLAMA_INS.Transaction.InTransaction then spTREKLAMA_INS.Transaction.Commit;

      ShowMessage(spTREKLAMA_INS.Fields[0].AsString);



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

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

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

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

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

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

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


 




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


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

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