首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oracle过程中创建临时表/视图?

问如何在Oracle过程中创建临时表/视图?
EN

Stack Overflow用户
提问于 2020-01-09 18:48:43
回答 2查看 521关注 0票数 0

我正在做一个新的过程,对一个巨大的表进行查询。

我的过程结构如下:

{

打开游标

查询1

友联市

查询2

友联市

查询3

}

查询1的结构是内部连接2(内部连接1(表)x(表)x表)

查询2的结构是内部连接3(内部连接1(表)x(表)x表)

有没有办法把INNER JOIN 1 (TABLE) x (TABLE)存储在某个地方,这样我就不用做两次了?

编辑:忘记添加我不能在过程外部创建表,因为此过程的多个实例将并行运行。它们只会通过在同一个表中插入来阻止对方运行。此外,我不知道有多少实例将并行运行,因此我不能创建与实例一样多的表。

EN

回答 2

Stack Overflow用户

发布于 2020-01-09 18:53:49

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

如果您需要一个表,那么在运行这个过程之前创建它,使用CREATE TABLE (并命名您需要的所有列),或者使用CTAS (Create table As Select),这基本上就是您的当前查询。

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

另一种选择是使用CTE (公用表表达式,也称为WITH分解子句),它可以直接在过程中使用,如下所示

代码语言:javascript
复制
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可能是您的选择。为什么?参见我的第三段(“每个人都只能看到自己的数据”)。

票数 5
EN

Stack Overflow用户

发布于 2020-01-09 19:49:58

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59662260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档