Как создать временную таблицу / представление внутри процедуры Oracle? - PullRequest
0 голосов
/ 09 января 2020

Я делаю новую процедуру отправки запросов к огромной таблице.

Структура моей процедуры следующая:

{

открытый курсор для

QUERY 1

UNION

QUERY 2

UNION

QUERY 3

}

Структура QUERY 1 - ВНУТРЕННЕЕ СОЕДИНЕНИЕ 2 ([ВНУТРЕННЕЕ СОЕДИНЕНИЕ 1 (ТАБЛИЦА) x (ТАБЛИЦА)] x ТАБЛИЦА)

Структура QUERY 2 - ВНУТРЕННЕЕ СОЕДИНЕНИЕ 3 ([ВНУТРЕННЕЕ СОЕДИНЕНИЕ 1 (ТАБЛИЦА) x (ТАБЛИЦА) ] x TABLE)

Есть ли способ хранить [INNER JOIN 1 (TABLE) x (TABLE)] где-нибудь, чтобы мне не приходилось делать это дважды?

EDIT: Forgot добавить, что я не могу создать таблицу вне процедуры, потому что несколько экземпляров этой процедуры будут работать параллельно. Они просто блокируют запуск друг друга, вставляя в одну таблицу. Кроме того, я не знаю, сколько экземпляров будет работать параллельно, поэтому я не могу создать столько таблиц, сколько экземпляров.

Ответы [ 2 ]

4 голосов
/ 09 января 2020

Не создавайте таблицы из PL / SQL. Это возможно (подсказка: Dynami c SQL), но это не так, как Oracle работает.

Если вам нужна таблица, то создайте ее ПЕРЕД выполнением этой процедуры, либо с помощью CREATE TABLE (и назовите все нужные столбцы), либо с помощью CTAS (Create Table As Select), который - в основном - быть вашим текущим запросом.

Эта таблица может быть «нормальной» или «глобальной (или частной, в зависимости от версии базы данных) временной таблицей» (GTT). Если вы используете GTT, только вы можете видеть данные, хранящиеся в. Если это «нормальная» таблица, все видят данные, поэтому вам, возможно, придется обратить внимание на то, кто что видит и что использует.


Другой вариант - использовать CTE (Common Table Expression, aka * факторинг WITH), который можно использовать непосредственно в процедуре как

with your_view as
  (select ... 
   from table1 join table2 on ...
               join table3 on ...
  )
select whatever
  from some_other_table join your_view
  where ...
union
select whatever_else
  from yet_another_table join your_View
  where ...

[РЕДАКТИРОВАТЬ, увидев ваше редактирование]

Если вы этого не сделаете Если вы хотите использовать CTE по какой-то причине, тогда GTT может быть вашим выбором. Почему? См. Мой третий абзац («каждый видит только свои данные»).

0 голосов
/ 09 января 2020

Вы всегда можете использовать глобальную временную таблицу: https://oracle-base.com/articles/misc/temporary-tables#temporary -tables

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...