PLAN_TABLE

Oracle10g

create table PLAN_TABLE (
        statement_id       varchar2(30),
        plan_id            number,
        timestamp          date,
        remarks            varchar2(4000),
        operation          varchar2(30),
        options            varchar2(255),
        object_node        varchar2(128),
        object_owner       varchar2(30),
        object_name        varchar2(30),
        object_alias       varchar2(65),
        object_instance    numeric,
        object_type        varchar2(30),
        optimizer          varchar2(255),
        search_columns     number,
        id                 numeric,
        parent_id          numeric,
        depth              numeric,
        position           numeric,
        cost               numeric,
        cardinality        numeric,
        bytes              numeric,
        other_tag          varchar2(255),
        partition_start    varchar2(255),
        partition_stop     varchar2(255),
        partition_id       numeric,
        other              long,
        distribution       varchar2(30),
        cpu_cost           numeric,
        io_cost            numeric,
        temp_space         numeric,
        access_predicates  varchar2(4000),
        filter_predicates  varchar2(4000),
        projection         varchar2(4000),
        time               numeric,
        qblock_name        varchar2(30),
        other_xml          clob
);

EXCEL関数

  • シート名を表示

=MID(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))+1,31)



セルA1にシート名"Sample"が入っているとして

  • SampleシートのセルB2に入力されている値を表示

=INDIRECT(A1&"!"&"$B$2")

  • SampleシートのセルA1にジャンプするハイパーリンク。セルには■が表示される。

=HYPERLINK("#" & A1 & "!A1","■")

Oracle10g マテリアライズド・ビュー(実践)

ノウハウはいいから今すぐマテビューを作りたい人向け。

  1. 権限付与
  2. ログ作成
  3. マテビュー作成

権限付与 他→自(マスタ所持者≠ビュー所持者=作成者)

GRANT CREATE MATERIALIZED VIEW TO [作成者];
GRANT SELECT ON [マスタ所持者].[マスタテーブル名] TO [作成者];

同様にCREATE TABLE,CREATE VIEW,CREATE INDEXも必要。

ログ作成

CREATE MATERIARIZED VIEW LOG ON [マスタテーブル名];

マテビュー作成

CREATE MATERIALIZED VIEW
[マテビュー名]
REFRESH FAST NEXT SYSDATE + 1/288
AS
SELECT [カラム名1],[カラム名2]… FROM [マスタテーブル名];

これで5分間隔で高速リフレッシュを行うマテビューができる。

Oracle10g マテリアライズド・ビュー(ノウハウ)

意味はさておき作成したい人はこちら

って何よ?

「実体」のある表。データウェアハウスやレプリケーションに利用される。元ネタ表の事を「マスタ表」と呼ぶ。

マテリアライズド・ビューとは、ある一時点におけるターゲット・マスターのレプリカのことです。


マテリアライズド・ビューの作成に必要な権限

  • CREATE MATERIALIZED VIEW(マテビューを作成するスキーマに対して)
  • CREATE TABLE, CREATE VIEW, CREATE INDEX(マテビューを所持するスキーマに対して)

以下は、他スキーマのテーブルをマスタ表にする場合

  • その表に対するSELECT権限
  • その表に対するON COMMIT REFRESH権限(ON COMMIT REFRESH句を使用する場合)


CREATE文

CREATE MATERIALIZED VIEW
  マテリアライズド・ビュー名
REFRESH
   リフレッシュ方法 リフレッシュ・モードおよびリフレッシュ時刻
AS サブクエリ

REFRESH句を指定しなければ、自動リフレッシュされない。
更新可能マテリアライズド・ビューを作成するには、"AS"の前に"FOR UPDATE"を指定する。


リフレッシュ方法

FAST 高速リフレッシュ方法。差分のみ更新。マテリアライズド・ビュー・ログを使用するので、このログが存在していない場合には、CREATE文は正常に実行されない。事前に作成する。
COMPLETE 完全リフレッシュ方法。
FORCE デフォルト値。実行時に可能ならば、高速リフレッシュ方法を採用する。不可能ならば完全リフレッシュ方法を採用する。

マスタが「テーブル」「マテビュー」の場合→高速リフレッシュ可能
マスタが「シノニム」「ビュー」の場合→高速リフレッシュ不可。完全リフレッシュのみ。


リフレッシュ・モード

ON COMMIT 自動リフレッシュ。マスタ表のコミットにあわせてリフレッシュ。処理速度は落ちる。
ON DEMAND デフォルト。手動リフレッシュ。
DBMS_MVIEW.REFRESH(ビュー名)またはREFRESH_ALL_MVIEWS()


リフレッシュ時刻

リフレッシュ・モードと同時に指定はできない。

START WITH 最初の自動リフレッシュ時刻を表す日時式。NEXT指定がない場合、マテビューは1回だけリフレッシュされる。
NEXT 自動リフレッシュの間隔を計算するための日時式。START WITH指定がない場合、現在時刻+NEXT時刻を自動的に算出し、自動リフレッシュされる。

日を単位として、時間を制限するすべてのパラメータに対して、分数で日数を指定できる。たとえば、1時間は1/24、5分は1/288、1分は1/1440になる。
例)
NEXT SYSDATE + 1/288
→5分間隔でリフレッシュ。


手動リフレッシュ

  • EXEC DBMS_MVIEW.REFRESH('マテビュー名')
  • VARIABLE a NUMBER;←変数aは必須引数の失敗件数。
     EXEC DBMS_MVIEW.REFRESH_ALL_MVIEW(:a);


"*"の罠

  • 普通のVIEWもそうなのだが、マスタ表の方を「ALTER TABLE 〜」すると、リフレッシュをかけてもALTERの結果は反映されない。「SELECT * 〜」と書いても駄目である。この場合はマテビューを再作成するしかない。


マテビューの再作成

  • CERATE OR REPLACE〜がないため、DROP&再CREATEする。


マテビューとUNDO表領域

  • リフレッシュにはUNDO表領域を使用する。このため、大量データを頻繁にリフレッシュする設定にしていると、UNDO表領域がすぐにいっぱいになってしまう。(もし自動エクステンドONだったりすると、恐ろしい光景が見られます)


PL/SQL 西暦和暦変換 for Oracle10g

YYYYMMDD形式の日付をWYY.MM.DDに変換する関数。とりあえず書いたので貼っとく。CASE文はOracle9i以降対応らしいので注意。

ソース

CREATE OR REPLACE FUNCTION yyyy_to_wyy
(
  pDate IN NUMBER
)
RETURN VARCHAR2
IS
  cYear VARCHAR2(4);
  cMonth VARCHAR2(2);
  cDay VARCHAR2(2);
BEGIN
  cYear := SUBSTR(TO_CHAR(pDate),1,4);
  cMonth := SUBSTR(TO_CHAR(pDate),5,2);
  cDay := SUBSTR(TO_CHAR(pDate),7,2);

  CASE 
    WHEN pDate - 19890107 > 0 THEN
      RETURN 'H' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1989) || '.' || cMonth || '.' || cDay;
    WHEN pDate - 19261224 > 0 THEN
      RETURN 'S' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1926) || '.' || cMonth || '.' || cDay;
    WHEN pDate - 19120729 > 0 THEN
      RETURN 'T' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1912) || '.' || cMonth || '.' || cDay;
    ELSE
      RETURN 'M' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1868) || '.' || cMonth || '.' || cDay;
  END CASE;
END;

使い方

SELECT YYYY_TO_WYY(20070829) FROM DUAL
→"H19.8.29"

CVSNTをWindowsXPにインストールする〜日本語逆襲編

やっとCVSインストール作業ができたと思ったら、日本語名ファイルが化けるでやんの…。浅はかな自分に乾杯。そんなわけでsjis御用達CVS版に乗り換えする。
2008/2/4更新

ダウンロード

インストール

  • デフォルト「次へ」でOK。コンポーネントは「標準インストール」で。
  • インストール後には再起動する。

ポート

  • 「コントロールパネル」→「セキュリティセンタ」→「Windowsファイアウォール
  • CVSNTのポート2401,2402を許可する。

CVSNT設定

  • スタートメニューから「CVSNT」→「Service Control Panel」を起動する。
  • 「サービスの状態」タブ
    CVSサービスとCVSロックサービスを停止する。
  • リポジトリ」タブ
    「追加」でリポジトリフォルダを追加する。
  • 「詳細」タブ
    Eclipseから実行するため「Unix CVSであるふりをする」にチェックに入れる。
  • 「インパーソネーションを有効にする」→チェックをはずして無効にする。

ユーザ作成

C:\>set CVSROOT=:pserver:[Administrator権限のあるユーザ]@localhost:/cvsrepo
C:\>cvs login
CVS password>[Administrator権限のあるユーザのOSログインパスワード] C:\>cvs passwd -a -r [OSにログインするユーザ名] [ユーザー名] Adding user [ユーザー名]@localhost
New password:[パスワード] Verify password:[パスワード]
  • Administrator権限がなければユーザの追加更新削除はできない。
  • passwdファイルの内容を確認する。
    [CVSにログインするユーザ名]:[パスワード]:[OSにログインするユーザ名]

Eclipse

接続タイプpserver
ユーザー上記で設定したユーザ
パスワード上記で設定したパスワード
ホストCVSをインストールしたホスト名(またはIP)
リポジトリ・パス上記で設定したリポジトリ

  • HEADを開いてCVSROOTフォルダが見えるか確認する。見えなければ接続情報が間違っているので見直す。
  • JAVAパースペクティブに切り替えて、パッケージエクスプローラを開く。
  • CVSサーバにコミットしたいプロジェクトで、右クリック→「チーム」→「切断」する。
    ファイルシステムからCVSメタ情報も削除します」を選択する。
  • 再度同じプロジェクトで、右クリック→「チーム」→「プロジェクトの共有」を選択する。
  • CVSサーバにコミットする。

ソケット例外

以前に別の(sjis版ではない標準版の)CVSNTをインストールしていた場合、ソケット例外が発生する事がある。というか発生した。
試行錯誤して気づいた点は3つ。

  1. 私の環境では標準版をそのままインストールすると、Pathはユーザー環境変数に設定された。しかしsjis版ではシステム環境変数に設定された。(まあ、これはあんまり関係ないと思う)
  2. sjis版をインストール後、初期起動すると前回のリポジトリ設定がそのまま引き継がれていた。
  3. レジストリに「CVS」キーが残っていた。

回避策

  • 標準版CVSNTをアンインストールする。
  • リポジトリディレクトリを削除する。
  • レジストリを削除する。
    「HKEY_LOCAL_MACHINE」→「SOFTWARE」→「CVS」以下すべて
  • 環境変数を確認する。ユーザー環境変数のPathからCVSへのパスが削除されているかチェックする。
  • sjis版CVSNTをインストールする。