受管理层鼓励的C#开发人员编写SQL Server存储过程时,通常会产生这样的过程
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
单个语句非常简单,这种方法使它们产生正确的结果。
通常,我的任务是将此类过程迁移到Oracle。
让我们面对以下事实。
- SQL Server中的不同临时表是完全独立的,可以具有任何临时结构。
- Oracle全局公用表是全局对象,并且所有共享表都使用相同的表结构。修改此结构是不可能的,尽管它可以在任何地方使用。
我从Oracle dba中学到的一件事是避免在可能的情况下使用临时表。这样的修改甚至可以提高SQL Server的性能。
用活接头替换单个插件
在最简单的情况下,以上内容可以转换为
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
功能使用
标量函数和表值函数都可以帮助将过程转换为上述形式的单个查询。
通用表表达式又名子查询分解
子查询分解几乎是Oracle提供的避免临时表的最佳方法。使用它,将SQL Server迁移到Oracle同样非常容易。这需要SQL Server 2005及更高版本。
这些修改改进了SQL Server的版本,并且在许多情况下使迁移更加直接。在其他情况下,诉诸于全局临时表可以在有限的时间内进行迁移,但效果不理想。
还有其他方法可以避免在Oracle中使用全局临时表吗?
3
我会说这样的代码表示不基于过程的思考。这些是带有单个#的本地临时表。我是管理人员,如果看到要投入生产的话,我会断腿的:-)
—
gbn
我完全同意
—
bernd_k 2011年
@gbn-惯用的PL / SQL往往比惯用的T-SQL更具过程性。临时表使得在T-SQL中几乎可以执行set ops中的所有操作。PL / SQL具有并行游标操作和许多用于优化过程代码的功能。
—
ConcernedOfTunbridgeWells,