假设您不熟悉Oracle但熟悉其他数据库,Oracle中的临时表与其他数据库中的临时表有很大不同。 Oracle中的临时表定义是全局的 - 临时表必须在过程之外创建,并且每个人都可以看到,就像永久表一样。但是,插入的数据对于当前会话或事务是本地的(取决于表的定义)。
你可以,因此,创建临时表的过程外(但我立足我的数据类型的columns--您UPDATE
声明的名称所暗示的,即至少id
,end_date
和prev_id
必须varchar2
列)
CREATE GLOBAL TEMPORARY TABLE myTempTable(
id integer,
due_date date,
start_date date,
end_date date,
prev_id integer,
prev_end_date date
);
你会然后使用该临时表在你的代码就像你会永久表(所以在你的select
的order by
是没有意义的)
INSERT INTO myTempTable(id, due_date, start_date, end_date, prev_id, prev_end_date)
SELECT a.Id, a.Due_Date, a.Start_Date, a.End_Date,
LAG(a.Id,1) over (order by Id) as Prev_Id,
LAG(a.End_Date,1) over (order by a.End_Date) as Prev_End_Dat
FROM myTable a;
这将工作。但在Oracle中这不是一件特别常见的事情。在Oracle中使用临时表很罕见。在这种情况下,我只是执行你的规则作为SELECT
语句的一部分
SELECT (case when id != prev_id
then ' '
else id
end) id,
(case when id != prev_id
then null
else end_date
end) end_date,
due_date,
start_date,
prev_id,
prev_end_date
FROM (SELECT a.Id, a.Due_Date, a.Start_Date, a.End_Date,
LAG(a.Id,1) over (order by Id) as Prev_Id,
LAG(a.End_Date,1) over (order by a.End_Date) as Prev_End_Dat
FROM myTable a);
注意也是(除非你使用12C的新功能),存储过程不能只运行一个SELECT
语句将结果返回给调用者。一个存储过程可以有OUT
类型参数SYS_REFCURSOR
并使用SELECT
语句打开游标,调用程序可以从中读取该语句。
谢谢贾斯汀,这对我有用!但是,它并不需要我创建全局临时表。我不确定这是否也是临时表,但我有如下所示的代码。谢谢你的帮助! TempTable as(SELECT a.Id,a.Due_Date,a.Start_Date,a.End_Date,LAG(a.Id,1)over(按Id排序)为Prev_Id, LAG(a.End_Date,1)over a.End_Date)as Prev_End_Dat FROM myTable a order by a.Id) – 2014-09-22 21:47:38
@KunalNair - 我不确定您是否在说您创建了一个正在执行“CREATE TABLE AS SELECT”的永久表,或者您是否在说你在'SELECT'语句中使用了'WITH'子句。 “WITH”子句将是一种完全合理的方式,可以在不使用内联视图的情况下构建单个“SELECT”语句。永久性表格在多用户环境中会有问题。 – 2014-09-22 22:09:23
我使用了WITH语句。 – 2014-09-23 16:31:54