我正在使用 SQL Developer 编写一段代码来填充 Oracle 11gR2 中的时间维度
表结构
KEY Number(8,0)
HRS Varchar2
MINS Varchar2
SECS Varchar2
我是 PL/SQL 新手 - 我通常会想到用伪代码做的方式是,但 PL/SQL 中的 for 循环似乎不是这样工作的:
key = 1
for (hrs=0; hr<=23; hr++)
{
for (min=0; min<=59; min++)
{
for (sec=0; sec<=59; sec++)
{
insert (KEY, tochar(hrs:mins:secs), tochar(hr), tochar(min), tochar(sec))
SK=+1
}
}
}
我从我找到的答案中尝试过这个:
insert into Dim_TIME
(Key,
TIME_IN24_NAME,
TIME_HOUR24,
TIME_MINUTE,
TIME_SECOND)
select
to_char(t, 'HH24:MI:SS'),
to_number(to_char(t, 'HH24'), '00'),
to_number(to_char(t, 'MI'), '00'),
to_number(to_char(t, 'SS'), '00')
from (
select trunc(sysdate) + (level - 1)/86400 as t
from dual
connect by level <= 86400
);
但不确定如何递增键(列字段不是自动递增)。
有什么想法可以实现这一点吗?
谢谢
最佳答案
您可以创建一个SEQUENCE
来递增字段KEY
。
CREATE SEQUENCE dim_time_seq;
并在您的代码中使用它,如下所示,
INSERT INTO dim_time
(KEY,
time_in24_name,
time_hour24,
time_minute,
time_second)
SELECT
dim_time_seq.nextval,
to_char(t, 'HH24:MI:SS'),
to_number(to_char(t, 'HH24'), '00'),
to_number(to_char(t, 'MI'), '00'),
to_number(to_char(t, 'SS'), '00')
FROM (
SELECT trunc(SYSDATE) + (LEVEL - 1)/86400 AS t
FROM dual
CONNECT BY LEVEL <= 86400
);
关于sql - Oracle SQL 填充时间维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20397450/