-
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"
оно действительно необходимо?