我正在尝试使用Insert,Sequence和Select *一起工作。
INSERT INTO BRK_INDV
Select * from (Select brk_seq.NEXTVAL as INDV_SEQ, a.*
FROM (select to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') BUSINESS_DAY, to_char(REQUEST_DATETIME,'hh24') src_hour,
CASE tran_type
WHEN 'V' THEN 'Visa'
WHEN 'M' THEN 'MasterCard'
ELSE tran_type
end text,
tran_type, count(*) as count
from DLY_STATS
where 1=1
AND to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') = '09-FEB-2015'
group by to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY'),to_char(REQUEST_DATETIME,'hh24'),tran_type order by src_hour)a);
这给了我以下错误:
ERROR at line 2:
ORA-02287: sequence number not allowed here
我试图删除订单,但仍然是同样的错误。
但是,如果我只运行
Select brk_seq.NEXTVAL as INDV_SEQ, a.*
FROM (select to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') BUSINESS_DAY, to_char(REQUEST_DATETIME,'hh24') src_hour,
CASE tran_type
WHEN 'V' THEN 'Visa'
WHEN 'M' THEN 'MasterCard'
ELSE tran_type
end text,
tran_type, count(*) as count
from DLY_STATS
where 1=1
AND to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY') = '09-FEB-2015'
group by to_date(to_char(REQUEST_DATETIME,'DD-MM-YYYY'),'DD-MM-YYYY'),to_char(REQUEST_DATETIME,'hh24'),tran_type order by src_hour)a;
它显示了我正确的条目。那么,为什么选择*不适用于此? 请帮助。
答案 0 :(得分:1)
问题在于您无法在子查询中使用序列。例如,这会产生相同的ORA-02287
错误:
create table T (x number);
create sequence s;
insert into T (select * from (select s.nextval from dual));
但是,你可以做的是创建一个从序列中返回nextval的函数,并在子查询中使用它:
create function f return number as
begin
return s.nextval;
end;
/
insert into T (select * from (select f() from dual));
答案 1 :(得分:1)
我看到你正在尝试做什么。您希望以特定顺序将行插入BRK_INDV表。序列号,我假设将是BRK_INDV的主键,将按输入行的排序顺序生成。
您正在使用关系数据库。我们都了解关系数据库的第一个特征之一是表中行的顺序是无关紧要的。这对于 fugitaboutit 来说只是一个奇特的词。
您不能假设select * from table
将按照写入的顺序返回行。它可能。这可能需要相当长的时间。然后是某些东西 - 行数,一些列值的分组,月亮的相位 - 某些东西会改变,你会以一种看似完全随机的顺序将它们拿出来。
如果您需要订单,则必须在查询中强制执行,不插入。
这是你应该执行的陈述:
INSERT INTO BRK_INDV
With
Grouped( Business_Day, Src_Hour, Text, Tran_Type, Count )As(
Select Trunc( Request_Datetime ) Business_Day,
To_Char( Request_Datetime, 'hh24') Src_Hour,
Case Tran_Type
When 'V' Then 'Visa'
When 'M' Then 'MasterCard'
Else Tran_Type
end Text,
Tran_Type, count(*) as count
from DLY_STATS
Where 1=1 --> Generated as dynamic SQL?
And Request_Datetime >= Date '2015-02-09'
And Request_Datetime < Date '2015-02-10'
Group By Trunc( Request_Datetime ), To_Char( Request_Datetime, 'hh24'), Tran_Type
)
Select brk_seq.Nextval Indv_Seq, G.*
from Grouped G;
请注意,没有order by
。如果要按特定顺序查看生成的行:
select * from Brk_Indv order by src_hour;
由于在任何特定时段内可能有数百或数千个交易,因此您可能会以非小时的方式订购。
在Oracle中,trunc
函数是获取时间部分被剥离的日期的最佳方式。但是,您不希望在where
子句中使用它(或者,aamof,任何其他函数,例如to_date
或to_char
),因为这会使该子句成为非sargable并导致完整的表扫描。