Временные таблицы

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 "будущая таблица", опять же ошибка. Как можно управлять этими процессами?
SQLap
Дата: 11.03.2011 08:27:05
zhez,



тут два выхода
1) создать один раз и не дропать
2) использовать что-то другое. Например, курсоры
analitik
Дата: 11.03.2011 11:11:25
BEGIN 
  -- Удаление таблицы
  BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE tmp_del_rows';
    dbms_output.put_line('Таблицы удалена');
  EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line(SUBSTR(SQLERRM,0,255));
  END; 
  -- Создание таблицы
  BEGIN
    EXECUTE IMMEDIATE 
      '
      CREATE GLOBAL TEMPORARY TABLE tmp_del_rows     
      (
        ID NUMBER(32)
      ) ON COMMIT DELETE ROWS
      ';
    dbms_output.put_line('Таблица создана');
  EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line(SUBSTR(SQLERRM,0,255));
  END;
END;
srjm
Дата: 11.03.2011 12:21:56
Блин, ну вы сейчас насоветуете!

DROPать таблицу при каждом вызове процедуры - в корне не верно!!! Не забывайте, что есть еще другие сессии, которые тоже захотят дропнуть и заново создать таблицу.

Как уже писал SQLap, вариантов 2:
1. Один раз создать временную таблицу сторонним скриптом, а в Вашей процедуре её чистить и перезаполнять.
2. Использовать что-то другое... Курсоры, на мой взгляд, не заменители для временных таблиц, но можно обратить внимание на VARRAY и PIPELINED-функции. Их можно использовать в SQL-запросах, как обычные таблицы.
env
Дата: 11.03.2011 12:44:46
zhez,

Какая задача решается "MS SQL способом" на Оракловых средствах?
Серафимный Шестикрыл
Дата: 11.03.2011 12:56:34
analitik
BEGIN 
  -- Удаление таблицы
  BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE tmp_del_rows';
    dbms_output.put_line('Таблицы удалена');
  EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line(SUBSTR(SQLERRM,0,255));
  END; 
  -- Создание таблицы
  BEGIN
    EXECUTE IMMEDIATE 
      '
==>      CREATE GLOBAL TEMPORARY TABLE tmp_del_rows     
      (
        ID NUMBER(32)
      ) ON COMMIT DELETE ROWS
      ';
    dbms_output.put_line('Таблица создана');
  EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line(SUBSTR(SQLERRM,0,255));
  END;
END;



Скажите, вы это сами сейчас выдумали или скопипастили с некоего гавнофорума гавноразработчиков ?

*** буквально замер в ожидании ответа ***
srjm
Дата: 11.03.2011 14:15:04
Серафимный Шестикрыл
analitik
BEGIN 
  -- Удаление таблицы
  BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE tmp_del_rows';
    dbms_output.put_line('Таблицы удалена');
  EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line(SUBSTR(SQLERRM,0,255));
  END; 
  -- Создание таблицы
  BEGIN
    EXECUTE IMMEDIATE 
      '
==>      CREATE GLOBAL TEMPORARY TABLE tmp_del_rows     
      (
        ID NUMBER(32)
      ) ON COMMIT DELETE ROWS
      ';
    dbms_output.put_line('Таблица создана');
  EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line(SUBSTR(SQLERRM,0,255));
  END;
END;



Скажите, вы это сами сейчас выдумали или скопипастили с некоего гавнофорума гавноразработчиков ?

*** буквально замер в ожидании ответа ***


Вот почему НЕЛЬЗЯ разрешать аналитикам программировать :)
Серафимный Шестикрыл
Дата: 11.03.2011 14:50:49
srjm
Вот почему НЕЛЬЗЯ разрешать аналитикам программировать :)


Программировать нельзя разрешать идиотам людям с альтернативными уместенными способностями.
Все остальное вторично.
zhez
Дата: 12.03.2011 20:13:08
Сейчас пробую на оракле создать процедуру. Раньше работал на MS SQL. Там проблем не было.Все было просто.
select * into #tmp from table1
update #tmp set и т.д.
drop table #tmp

А тут непонятно. Нужен маленький пример для для Оракла.
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.