1

私はオラクルに手を出すだけなので、これが基本的なものである場合は簡単にしてください...答えを広範囲に検索しましたが、答えが存在しないか、不可能であるか、検索で正しい用語が使用されていません。

とにかく、日付ディメンション テーブルを作成する 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')
)

を代入SYSDATEするとDATE_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て日番号を取得しました。これはより説明的だと思うからです。最も使いやすいものを使用する必要があります。
  • 形式コードは最長の曜日名 (英語では水曜日) の長さの文字列を返すため、形式文字列FMDayを使用しました。そのため、他のすべての曜日名には末尾のスペースが含まれます。フォーマット コードは多くの便利な機能を実行します。そのうちの 1 つは、末尾のスペースを削除することです。Day_NameDayFM
于 2013-06-21T14:26:14.523 に答える