【问题标题】:How to create a temporary table/view inside an Oracle procedure?如何在 Oracle 过程中创建临时表/视图?
【发布时间】:2020-01-09 10:48:42
【问题描述】:

我正在创建一个新程序来查询一个巨大的表。

我的程序结构如下:

{

打开光标

查询 1

联合

查询 2

联合

查询 3

}

QUERY 1的结构是INNER JOIN 2 ([INNER JOIN 1 (TABLE) x (TABLE) ] x TABLE )

QUERY 2的结构是INNER JOIN 3 ([INNER JOIN 1 (TABLE) x (TABLE) ] x TABLE )

有没有办法将 [INNER JOIN 1 (TABLE) x (TABLE) ] 存储在某处,这样我就不必重复两次?

编辑:忘记补充说我不能在过程之外创建表,因为该过程的多个实例将并行运行。它们只会通过插入同一张表来阻止彼此运行。另外,我不知道有多少实例将并行运行,所以我无法创建与实例一样多的表。

【问题讨论】:

标签: oracle


【解决方案1】:

不要从 PL/SQL 创建任何表。这是可能的(提示:动态 SQL),但这不是 Oracle 的工作方式。

如果您需要一个表,请在运行此过程之前创建它,或者使用CREATE TABLE(并命名您需要的所有列),或者使用CTAS(将表创建为选择),这基本上是您当前的询问。

该表可以是“普通”或“全局(或私有,取决于数据库版本)临时表”(GTT)。如果您使用 GTT,则只有您可以看到其中存储的数据。如果是“普通”表,每个人都会看到数据,因此您可能需要注意谁看到和使用了什么。


另一种选择是使用CTE(公用表表达式,又名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 可能是您的选择。为什么?请参阅我的第 3 段(“每个人都只能看到自己的数据”)。

【讨论】:

  • 使用 GTT 是否允许我同时运行该过程的两个实例而不会相互干扰?
  • 假设该模式中有一个 GTT 和一个过程(将一些行插入到该 GTT 中)。两个(或更多)用户建立连接。他们每个人都运行自己的程序。 GTT 充满了数据。每个用户只能看到自己的数据。
  • 使用 GTT,每个会话都有自己的“版本”表,因此会话之间没有交互或阻塞。在我看来,您的情况正是 GTT 的设计目的。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 2019-12-07
    • 1970-01-01
    • 2014-11-23
    • 2022-01-21
    • 1970-01-01
    • 2011-02-09
    • 2015-12-12
    • 2012-03-23
    相关资源
    最近更新 更多