1

我只是涉足Oracle,所以如果这是基本的,请放轻松...我已经广泛搜索了答案,但答案不存在,这是不可能的,或者我的搜索没有使用正确的术语。

无论如何,我正在编写将创建日期维度表的 DDL。我有一个日期键,它是表的主键,我试图将它传播到表中的所有其他列,以便在将新值添加到日期时用作这些列的默认值关键列。

这是我迄今为止尝试过的一个片段,但给了我错误“ORA-00984:此处不允许列”:

CREATE TABLE DATE_DIM
(
    DATE_KEY  DATE NOT NULL,
        CONSTRAINT DATE_KEY_PK PRIMARY KEY (DATE_KEY),
    DAY_NUMBER  NUMBER(2) DEFAULT TO_NUMBER(TO_CHAR(DATE_KEY,'DD')),
    DAY_NAME  VARCHAR(36) DEFAULT TO_CHAR(DATE_KEY,'Day')
)

如果我替换SYSDATEDATE_KEY我不会返回任何错误。但是,假设我正在构思的所有内容都实现了,我将需要插入一个比 sysdate 更具体的日期……为了清楚起见,没有其他列可以更新。

最终,这个想法将扩展到包含具有不同类型数据的其他表,所以如果您想知道为什么我不使用脚本、Excel 等创建一个充满日期的大表,我可以理解。我只是认为日期维度提供了一个很好的例子来解释我想要实现的目标。

谢谢你的帮助。

4

1 回答 1

2

您可以将虚拟列用于此类操作。这些是根据定义列的表达式动态计算的:

CREATE TABLE date_dim (
  Date_Key DATE NOT NULL,
  Day_Number AS (EXTRACT(DAY FROM Date_Key)),
  Day_Name AS (TO_CHAR(Date_Key, 'FMDay'))
)

一些注意事项:

  • 我通常发现不指定虚拟列的类型更容易。你可以,但经常会发生一些奇怪的事情。你的表也不例外:甲骨文抱怨VARCHAR2(36)for Day_Name,说它至少应该是VARCHAR2(75)
  • 我使用该EXTRACT函数来获取日期数,因为我认为它对此更具描述性;你应该使用你最喜欢的任何东西。
  • 我使用格式字符串FMDayDay_Name因为Day格式代码返回一个字符串,该字符串是最长日期名称(英文为星期三)的长度,因此所有其他日期名称都会有尾随空格。格式代码做了很多有用的FM事情,其中​​之一就是修剪尾随空格。
于 2013-06-21T14:26:14.523 回答