2017-03-17 51 views
0

我很努力将临时表(SQL Server)迁移到oracle。大多数情况下,oracle不考虑在存储过程中使用临时表,但在sql服务器中,它们使用临时表来获取较小的读取记录,并对其进行操作。 如何解决这个问题。我也在搜索一些关于将临时表迁移到oracle的在线文章,但他们没有清楚地解释我的期望。 我得到了像使用内联视图,WITH子句,引用光标而不是临时表的信息。我完全困惑。 请建议我,在这种情况下可以使用内联视图,WITH子句,ref cursor。 这可能有助于提高我的知识水平并做好工作。我正在努力将临时表(SQL服务器)迁移到oracle

一如既往地感谢您宝贵的时间帮助新手。 谢谢 Alsatham hussain

+0

另请看集合[[1](https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm#LNPLS00501),[2](http://www.oracle.com) .com/technetwork/issue-archive/2012/12-jul/o42plsql-1653077.html)]如果您在同一过程的多个查询中使用相同的数据。 – MT0

+1

Oracle确实有临时表。检查此[类似问题](http://stackoverflow.com/questions/2671518/how-to-create-a-temporary-table-in-oracle)。 –

+0

在大多数情况下,您实际上并不需要Oracle中的临时表。通常在单个语句中使用它会更高效(在Oracle中,读者不会阻止编写者,编写者也不会阻止读者,所以通常不需要复制数据来“操纵”它)。但是由于您没有显示您遇到问题的任何代码,因此无法回答。 –

回答

0

像许多问题一样,答案是“它取决于”。几件事

  1. Oracle的“临时”表称为GLOBAL临时表(GTT)。与大多数其他供应商的TEMP表格不同,它们的定义是全球性的。 SQL Server(和其他)中的脚本或程序将创建临时表,并且该临时表将在会话结束时消失。这意味着脚本或程序可以重新运行或由多个用户同时运行。然而,这对GTT无效,因为GTT将在会话结束时保持存在,所以尝试创建GTT的下一次运行将失败,因为它已经存在。 因此,一种方法是预先创建GTT,就像其他应用程序表一样,然后将程序更改为INSERT到GTT中,而不是创建它。
  2. 正如其他人所说,使用CTE公共表表达式)可能的工作,买它取决于动机首先使用TEMP表。临时表的一个优点是它在一系列步骤中提供了“检查点”,并允许在中间临时数据集上收集统计信息;它是一组复杂的处理过程。 CTE没有提供这种好处。其他“中间”对象(如集合)也可以使用,但它们必须被“管理”,并且没有真正提供能够收集它们的统计信息的任何优势。

所以正如我在开始时所说的,您对解决方案的选择将首先取决于原始临时表的动机。