Oracle中的表变量样式实体

时间:2014-02-12 20:44:53

标签: oracle plsql

我一直在寻找Oracle中的某些东西,它就像SQL Server中的表变量一样。我发现人们在这里提出这样的问题并且人们总是说“是的,Oracle有这个”,但是这些例子表明这些实体根本不像SQL Server。有人能告诉我如何在Oracle中执行以下简单的TSQL解决方案吗?

declare @users table (
    ID int,
    Name varchar(50),
    Age int,
    Gender char(1)
)

;with users as (
    select 1001 as ID, 'Bob' as Name, 25 as Age, 'M' as Gender
    union
    select 1021 as ID, 'Sam' as Name, 29 as Age, 'F'
)
insert into @users (ID, Name, Age, Gender)
select *  from users

declare @grades table (
    UserID int,
    ClassID int,
    Grade int
)

;with grades as (
    select 1001 as UserID , 120 as ClassID, 4 as Grade
    Union
    select 1001 as UserID , 220 as ClassID, 2 as Grade
    Union
    select 1021 as UserID , 130 as ClassID, 4 as Grade
    Union
    select 1021 as UserID , 230 as ClassID, 4 as Grade
    Union
    select 1021 as UserID , 340 as ClassID, 2 as Grade
)
insert into @grades
select * from grades

select u.ID, u.Name, GPA = AVG(cast(g.grade as decimal))
from @users u
    inner join @grades g on u.ID=g.UserID
group by u.ID, u.Name

2 个答案:

答案 0 :(得分:2)

有些答案可能会告诉您Oracle有表变量,并且在某种程度上确实如此。但是,大多数答案都会告诉您,您根本不应该在Oracle中这样做;根本没有必要。

在你的情况下,我只想使用CTE:

with users as (
    select 1001 as ID, 'Bob' as Name, 25 as Age, 'M' as Gender from dual
    union
    select 1021 as ID, 'Sam' as Name, 29 as Age, 'F' from dual
          )
 , grades as (
    select 1001 as UserID , 120 as ClassID, 4 as Grade from dual
    Union
    select 1001 as UserID , 220 as ClassID, 2 as Grade from dual
    Union
    select 1021 as UserID , 130 as ClassID, 4 as Grade from dual
    Union
    select 1021 as UserID , 230 as ClassID, 4 as Grade from dual
    Union
    select 1021 as UserID , 340 as ClassID, 2 as Grade from dual
           )
select u.ID, u.Name, AVG(g.grade) as gpa
  from users u
  join grades g on u.ID = g.UserID
 group by u.ID, u.Name

更新:我一直试图获得的答案很长一段时间在Ben的评论中,我在这里包括: “没有变量,你可以动态创建并加入标准SQL @wcm中的其他表,是的。有许多不同类型的对象可以创建,允许你这样做,但不完全就像在T-SQL中那样“。

答案 1 :(得分:2)

如果我理解正确,那么如果我需要暂时存储仅限于我的会话可见的数据,那么我将使用全局临时表。可能比在内存中存储更多的开销,但也有很多优点 - 收集它们的统计数据,索引它们,以及存储数据的能力而不考虑内存消耗。