Конференция "Базы" » Firebird 2.1 и Global Temporary Table
 
  • M_15 (03.03.12 13:59) [0]
    Добрый день!

    Помогите, пожалуйста, разобраться со временными таблицами в FB.

    Создал временную таблицу:


    CREATE GLOBAL TEMPORARY TABLE TEMP_UAR (
       ID_UAR      INTEGER NOT NULL,
       PID_UAR     INTEGER,
       UAR         VARCHAR(255),
    ) ON COMMIT DELETE ROWS;



    После чего заполняю эту таблицу данными, редактирую их и копирую в другую таблицу с помощью скрипта:


    execute block as
    BEGIN
     INSERT INTO TEMP_UAR
       SELECT * FROM TBLUAR ORDER BY ID_UAR;

     UPDATE TEMP_UAR SET ID_UAR = GEN_ID(GEN_TBLUAR_ID, 1),
       UAR = UAR || '11111';

     INSERT INTO TBLUAR
       SELECT * FROM TEMP_UAR;
    END



    Всё работает хорошо, как мне надо.

    Когда переношу этот код в ХП, то после каждого insert и update временная таблица очищается, что не даёт мне нужного результата. Я понимаю это так, что после insert и update происходит commit.

    Как в ХП можно выполнить код:
     
     INSERT INTO TEMP_UAR
       SELECT * FROM TBLUAR ORDER BY ID_UAR;

     UPDATE TEMP_UAR SET ID_UAR = GEN_ID(GEN_TBLUAR_ID, 1),
       UAR = UAR || '11111';

     INSERT INTO TBLUAR
       SELECT * FROM TEMP_UAR;



    в одной транзакции?
  • Loginov Dmitry © (03.03.12 16:41) [1]
    Судя по описанию - какой-то глюк с GTT.
    Попробуйте задать вопрос на форуме:
    http://www.sql.ru/forum/actualtopics.aspx?bid=2
  • M_15 (03.03.12 16:59) [2]
    Loginov Dmitry, спасибо
  • Труп Васи Доброго © (05.03.12 11:24) [3]
    Если я правильно понял, то ты всего лишь добавляешь единицы к какому-то полю (UAR = UAR || '11111') и вставляешь всю запись обратно в таблицу с новым ID (ID_UAR = GEN_ID(GEN_TBLUAR_ID, 1))? И всё?  Тебе надо просто дублировать все записи таблицы изменив одно поле? Тогда зачем тебе эта временная таблица?
  • M_15 (05.03.12 11:47) [4]

    > Судя по описанию - какой-то глюк с GTT.


    Оказалось всё проще. Использовал старую версию IBExpert. Скачал свежую версию и всё заработало.


    > Труп Васи Доброго ©   (05.03.12 11:24) [3]


    В таблице "TBLUAR" хранится дерево, мне надо создать копию определенной ветки со всеми вложениями. Для этого копирую данные во временную таблицу, меняю значение PRIMARY KEY (ID_UAR). После чего FOREIGN KEY (PID_UAR) автоматически меняется на нужный, т.к.

    ALTER TABLE TEMP_UAR ADD CONSTRAINT PK_TEMP_UAR PRIMARY KEY (ID_UAR);

    ALTER TABLE TEMP_UAR ADD CONSTRAINT FK_TEMP_UAR FOREIGN KEY (PID_UAR) REFERENCES TEMP_TUAR (ID_UAR) ON DELETE CASCADE ON UPDATE CASCADE;



    после чего переношу данные из временной таблицы в "TBLUAR"
  • Кщд (05.03.12 12:49) [5]
    >M_15   (05.03.12 11:47) [4]
    изящно
    сомнения вызывает лишь "ORDER BY ID_UAR"
    оно действительно необходимо?
 
Конференция "Базы" » Firebird 2.1 и Global Temporary Table
Есть новые Нет новых   [134431   +10][b:0][p:0.001]