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 存储过程的全局临时表的替代方法的主要内容,如果未能解决你的问题,请参考以下文章