• 検索結果がありません。

この View の DDL では、Oracle 固有の FORCE オプションが指定されています。このオプション は、View に依存関係を持つオブジェクトが View 作成時になくても View の作成を行えるように するオプションです。

DB2 9.7 では FORCE オプションは CREATE VIEW 文で記述できないため、このオプションを取 り除いて実行する必要があります。

_DDL の確認

/workshop/lab5/plsql_ddl ディレクトリにある db2plsql_views.db2.organization_structure ファイル の内容を以下のコマンドを実行して確認します。

cat db2plsql_views.db2.organization_structure

FORCE オプションがついていることを確認します。

実行例

_FORCE オプションの除去

vi エディタを使用して db2plsql_views.db2.organization_structure ファイルを修正します。

(/workshop/lab5/plsql_ddl_modified ディレクトリに修正済みのファイルがあります。お時間のな い方や vi の操作に不慣れな方はこちらをご使用ください。)

db2inst1@DB2V97onSLES10:/workshop/lab5/plsql_ddl> cat db2plsql_views.db2.organization_structure --#SET TERMINATOR /

CONNECT TO LABDB /

SET CURRENT SCHEMA = 'SALES' /

--#SET :VIEW:SALES:ORGANIZATION_STRUCTURE

CREATE OR REPLACE FORCEFORCEFORCEFORCE VIEW "SALES"."ORGANIZATION_STRUCTURE" ("LEVEL", "FULL_NAME", "DEPARTMENT") AS SELECT

LEVEL,

SUBSTR((LPAD(' ', 4 * LEVEL - 1) || INITCAP(e.last_name) || ', ' || INITCAP(e.first_name)), 1, 40), NVL(d.dept_name, 'Uknown')

FROM

employees e, departments d WHERE

e.dept_code=d.dept_code(+)

START WITH emp_id = 1 CONNECT BY NOCYCLE PRIOR emp_id = emp_mgr_id

/

修正点

FORCE オプションを取り除く

修正例

_View の作成

修正したファイルを以下のコマンドで実行します。

db2 -tvf db2plsql_views.db2.organization_structure

DB20000I メッセージが表示されトリガーが正常に作成されたことを確認します。

実行例

--#SET TERMINATOR / CONNECT TO LABDB /

SET CURRENT SCHEMA = 'SALES' /

--#SET :VIEW:SALES:ORGANIZATION_STRUCTURE

CREATE OR REPLACE VIEW CREATE OR REPLACE VIEW CREATE OR REPLACE VIEW CREATE OR REPLACE VIEW "SALES"."ORGANIZATION_STRUCTURE" ("LEVEL", "FULL_NAME", "DEPARTMENT") AS SELECT

LEVEL,

SUBSTR((LPAD(' ', 4 * LEVEL - 1) || INITCAP(e.last_name) || ', ' || INITCAP(e.first_name)), 1, 40), NVL(d.dept_name, 'Uknown')

FROM

employees e, departments d WHERE

e.dept_code=d.dept_code(+)

START WITH emp_id = 1 CONNECT BY NOCYCLE PRIOR emp_id = emp_mgr_id

/

db2inst1@DB2V97onSLES10:/workshop/lab5/plsql_ddl_modified> db2 -tvf db2plsql_views.db2.organization_structure CONNECT TO LABDB

データベース接続情報

データベース・サーバー = DB2/LINUX 9.7.0 SQL 許可 ID = DB2INST1 ローカル・データベース別名 = LABDB

SET CURRENT SCHEMA = 'SALES'

DB20000I SQL コマンドが正常に完了しました。

CREATE OR REPLACE VIEW "SALES"."ORGANIZATION_STRUCTURE" ("LEVEL", "FULL_NAME", "DEPARTMENT") AS SELECT LEVEL, SUBSTR((LPAD(' ', 4 * LEVEL - 1) || INITCAP(e.last_name) || ', ' || INITCAP(e.first_name)), 1, 40),

6 6 6

6. . . . トリガー トリガー トリガー トリガーの の の作成 の 作成 作成 作成

この章では Update_Departments,UPDATE_ACC_ON_NEW_EMPL の2つのトリガーを作成します。

6 6 6

6. . .1 . 1 1 1 Update_Departments Update_Departments Update_Departments Update_Departments トリガー トリガー トリガー トリガーの の の の作成 作成 作成 作成

Update_Departments トリガーは複数のアクションで起動するトリガーです。具体的には、

INSERT、UPDATE、DELETE 全ての変更処理に対して起動します。DB2 9.7 ではこのようなトリ ガーをサポートしていません。DB2 で使用できるようにするためには、それぞれのアクションで 起動するトリガーとして分割して作成します。(例 INSERT トリガー、UPDATE トリガー、DELETE トリガーの3つに分割)

_UPDATE_DEPARTMENTS トリガーの確認

最初に Update_DEPARTMENTS トリガーの DDL を確認します。

以下のコマンドを実行し、/workshop/lab5/pl_sql_ddl ディレクトリにある db2plsql_trigger.db2.update_departments の内容を確認します。

cat db2plsql_trigger.db2.update_departments

青字になっている部分がトリガーの起動アクションの設定になります。

実行例

db2inst1@DB2V97onSLES10:/workshop/lab5/plsql_ddl> cat db2plsql_trigger.db2.update_departments

・・・<省略>・・・

CREATE OR REPLACE TRIGGER "SALES"."UPDATE_DEPARTMENTS"

・・・<省略>・・・

AFTER INSERT OR DELETE OR UPDATE ONAFTER INSERT OR DELETE OR UPDATE ONAFTER INSERT OR DELETE OR UPDATE ONAFTER INSERT OR DELETE OR UPDATE ON employ employ employ employees FOR EACH ROWees FOR EACH ROWees FOR EACH ROWees FOR EACH ROW DECLARE

CURSOR c_Stats IS

SELECT dept_code, COUNT(*) total_employees, SUM(current_projects) total_projects FROM employees

GROUP BY dept_code;

BEGIN

IF DELETING THEN

UPDATE departments SET (total_projects, total_employees)=

(SELECT count(1), SUM(current_projects) FROM employees) WHERE dept_code=:old.dept_code;

ELSIF INSERTING THEN

UPDATE departments SET (total_projects, total_employees)=

(SELECT count(1), SUM(current_projects) FROM employees) WHERE dept_code=:new.dept_code;

ELSIF UPDATING THEN

UPDATE departments SET (total_projects, total_employees)=

(SELECT count(1), SUM(current_projects) FROM employees) WHERE dept_code IN (:old.dept_code, :new.dept_code);

END IF;

END UpdateDepartments;

/

ここでは、UPDATE_DEPARTMENTS トリガーを以下の3つのトリガーに分割して作成します。

UPDATE_DEPARTMENTS_ON_UPDATE

関連したドキュメント