Oracle 存储过程的全局临时表的替代方法

Posted

技术标签:

【中文标题】Oracle 存储过程的全局临时表的替代方法【英文标题】:Alternate method to global temp tables for Oracle Stored Procedure 【发布时间】:2014-08-22 19:32:38 【问题描述】:

我已阅读并了解 Oracle 仅使用全局临时表,这与允许 #temp 表的 MS SQL 不同。为了完成从 MS SQL 到 Oracle 的数据库转换,我需要创建数百个全局临时表。我想知道在 Oracle 存储过程中是否有另一种方法,而不是创建所有这些必须在数据库中维护的表。

谢谢

【问题讨论】:

为什么需要创建数百个全局临时表?你想解决什么问题?也许您可以使用 Oracle 集合而不是临时表。也许您可以使用视图而不是临时表。也许您可以使用流水线表函数。 也许你所需要的只是函数内部的一个 table 类型的变量。这真的取决于你在做什么。 我们正在努力保持应用程序的两个版本之间的一致性。创建临时表会起作用,但会导致我们在 Oracle 版本中维护 MSSQL 版本中不存在的所有这些表。大多数情况下,临时表唯一在存储过程中使用,然后在最后被截断。我们不断升级我们的应用程序,并让它们在一定程度上具有可比性,以确保在一个版本中进行更改时,可以轻松地将其合并到另一个版本中。 【参考方案1】:

" 大多数情况下,临时表的唯一用途是在 存储过程,然后在最后截断。我们不断升级到 我们的应用程序并让它们具有一定的可比性可确保当 在一个版本中进行了更改,它可以很容易地合并到 其他。”

T-SQL 临时表本质上是内存结构。它们在 MSSQL 中提供了在 Oracle 中不太明显的优势,因为这两种 RDBMS 体系结构存在差异。因此,如果您希望进行迁移,那么建议您采用更适合 Oracle 的方法。

但是,您有不同的情况,显然保持两个代码库同步会让您的生活更轻松。

您想要使用的最接近临时表的是 PL/SQL 集合;特别是嵌套表。

有几种方法可以声明这些。第一种是使用 SQL 模板——游标——并基于它定义嵌套表类型。第二种是声明一个记录类型,然后在其上定义一个嵌套表。无论哪种情况,都使用批量操作填充集合变量。

declare
    -- approach #1 - use a cursor
    cursor c1 is 
          select *
          from t23;
    type nt1 is table of c1%rowtype;
    recs1 nt1;

    -- approach #1a - use a cursor with an explicit projection
    cursor c1a is 
          select id, col_d, col_2 
          from t23;
    type nt1a is table of c1a%rowtype;
    recs1 nt1a;


    -- approach #2 - use a PL/SQL record
    type r2 is record (
        my_id number
        , some_date date
        , a_string varchar2(30)
    );
    type nt2 is table of r2;
    recs2 nt2;
begin
    select *
    bulk collect into recs1
    from t23;

    select id, col_d, col_2
    bulk collect into recs2
    from t23;
end;
/

使用游标具有自动反映基础表中更改的优势。尽管 RECORD 在面对基础表的变化时提供了稳定性的优势。这取决于你想要什么:)

PL/SQL 参考手册有一整章。 Read it to find out more.

【讨论】:

以上是关于Oracle 存储过程的全局临时表的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 中临时表的替代方案

在 oracle 中避免全局临时表的方法

oracle存储过程中临时表的使用,该怎么处理

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

Oracle存储过程中临时表的使用技巧

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。