zhez
Дата: 11.03.2011 08:23:03
Добрый день. Кто нибудь может дать пример маленькой процедуры с применением временной таблицы. Я так понял что временные таблицы создаются CREATE GLOBAL TEMPORARY TABLE table1 (id NUMBER(5),name VARCHAR2(20))
ON COMMIT PRESERVE ROWS;(или ON COMMIT DELETE ROWS). Не понял чем они отличаются.
Вот мой пример
CREATE GLOBAL TEMPORARY TABLE table2
ON COMMIT DELETE ROWS as select * from ADM.actTable where 1=2;
Insert into table2 select * from ADM.actTable;
update table2 set ordernum=6 where ordernum=3;
select * from table2;
Выходит ошибка SQL Error: ORA-00955: имя уже задействовано для существующего объекта
00955. 00000 - "name is already used by an existing object".
Поставил drop table table2 перед CREATE GLOBAL нормально. А если временная таблица создается первый раз и писать drop table "будущая таблица", опять же ошибка. Как можно управлять этими процессами?
srjm
Дата: 11.03.2011 12:21:56
Блин, ну вы сейчас насоветуете!
DROPать таблицу при каждом вызове процедуры - в корне не верно!!! Не забывайте, что есть еще другие сессии, которые тоже захотят дропнуть и заново создать таблицу.
Как уже писал SQLap, вариантов 2:
1. Один раз создать временную таблицу сторонним скриптом, а в Вашей процедуре её чистить и перезаполнять.
2. Использовать что-то другое... Курсоры, на мой взгляд, не заменители для временных таблиц, но можно обратить внимание на VARRAY и PIPELINED-функции. Их можно использовать в SQL-запросах, как обычные таблицы.
GL
Дата: 12.03.2011 20:25:01
zhez,
Где-то сильно раньше, например при создании базы:
create global temporary table TMP... on commit delete rows;
Потом в коде:
insert into TMP select ...;
update TMP set ...;
И никакого дропа.
Это всё, естественно, если вам действительно нужна временная твблица в терм нах Oracle.