Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Как создать временную таблицу со структурой постоянной таблицы?

#sql #oracle #oracle18c


В SQL Server можно создать временную таблицу таким запросом:

select * into #mytmptab from mytab; 


Как добиться того же в Oracle?  

По мотивам топика на SO.
    


Ответы

Ответ 1



В SQL Server префикс "#" (hash) в имени таблицы означает - создать временную таблицу, которая видна только в текущей сессии (в противоположность "##" - глобальная временная таблица). В версии Oracle 18c также появилась возможность создать приватные временные таблицы, которые по завершению сессии (по-умолчанию транзакции без предиката on commit) будут полностью разрушены. Префикс обязателен и определён параметром private_temp_table_prefix (по-умолчанию ORA$PTT_). Например: create table mytab as select 1 id, cast ('aaa' as varchar2 (32)) name from dual ; show parameter private NAME TYPE VALUE ------------------------- ------ -------- private_temp_table_prefix string ORA$PTT_ create private temporary table ora$ptt_mytab on commit preserve definition as select * from mytab where 1=0 ; Private TEMPORARY created. И используем как обычные таблицы: declare r mytab%rowtype; begin insert into ora$ptt_mytab values (2, 'bbb'); select id + 1, name||'x' into r from ora$ptt_mytab where rownum = 1; insert into ora$ptt_mytab values r; end; / select * from mytab union all select * from ora$ptt_mytab; ID NAME ---------- -------------------------------- 1 aaa 2 bbb 3 bbbx С некоторыми ограничениями: для %rowtype они не доступны в именных PL/SQL блоках они могут использоваться только в динамическом SQL, т.к. во время компиляции их ещё нет В офф. док. Creating Private Temporary Tables.

Комментариев нет:

Отправить комментарий