Oracle存储过程的全局临时表的备用方法

时间:2014-08-22 19:32:38

标签: oracle plsql temp-tables

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

谢谢

1 个答案:

答案 0 :(得分: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