sql - Oracle SQL 填充时间维度

标签 sql database oracle

我正在使用 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/

相关文章:

SQL - 需要查找重复记录但排除反向事务

SQL 索引 - 这是重叠的吗?

java - 尝试按日期删除时,查询不会生成结果集。

sql - sas sql 第一个 obs 最后一个 obs

android - sqlite 忽略我的外键约束

c++ - 使用 OCCI 在 Oracle 数据库中插入多行

sql - (Oracle)SQL中的正则表达式,用于将日期/时间拆分为单独的日期和时间列

python - QtSql 将 MySql 查询转换为 SQLite

mysql - 无法删除索引或重命名表 PHPmyadmin

oracle - 从另一个存储过程oracle调用存储过程