Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Надо чтобы ХП возвращала ID добавленной ею записи


Автор: ksili 14.2.2008, 12:16
Есть хранимая процедура:
Код

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, эту запись не мог случайно удалить кто-то другой

Автор: ksili 14.2.2008, 12:40
Сделал так:
Код

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

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

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

В таком случее, Вы можете генерировать значение ID_BUFER в процедуре, перед вставкой (используя функцию GEN_ID(имя_генератора, 1))

Автор: Deniz 15.2.2008, 06:58
В процедуре добавить:
Код

RETURNS (ID_BUFER INTEGER)

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

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

Автор: Akella 17.2.2008, 19:16
Код

          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);



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)