Oracle PL/SQL – INSTEAD OFトリガーの例
この記事では、 `INSTEAD OF TRIGGER`を使って更新する方法を説明します。
-
非編集ビュー
-
ノンディシジョン・ビューのネストした表の列
この
INSTEAD OF`トリガは、INSERT、UPDATE、DELETEなどのDML文によって直接変更できない
views ‘を変更する方法を提供します
INSTEAD OFトリガーは
-
常に行レベルのトリガー.
-
OLD値とNEW値を読み取ることはできますが、変更することはできません.
-
条件付きにすることはできません. WHENまたはIF条件を追加することはできません.
1.データをビューに挿入する
この例では、ビューに対してinsert文を実行するときに
view`のそれぞれのテーブルに行を挿入する
INSTEAD OF`トリガを作成しました。
1.1テーブルを作成します。
顧客の詳細
CREATE TABLE customer__details ( customer__id number(10) primary key, customer__name varchar2(20), country varchar2(20) );
projects__details
CREATE TABLE projects__details ( project__id number(10) primary key, project__name varchar2(30), project__start__Date date, customer__id number(10) references customer__details(customer__id) );
1.2顧客とそのプロジェクトの結果を得るために `customer
projects
view`ビューを作成します。
customer
projects
view
CREATE OR REPLACE VIEW customer__projects__view AS SELECT cust.customer__id, cust.customer__name, cust.country, projectdtls.project__id, projectdtls.project__name, projectdtls.project__start__Date FROM customer__details cust, projects__details projectdtls WHERE cust.customer__id = projectdtls.customer__id;
1.3 `customer
projects
view`ビューに直接INSERT INTOすると、データベースは次のエラーを発生させます:
INSERT INTO customer__projects__view VALUES (1,'XYZ Enterprise','Japan',101,'Library management',sysdate); -- output ORA-01779:非キー保存表にマップする列を変更できません01779。00000 - "非キー保存表にマップする列を変更できません" ** 原因:挿入または更新しようとしました非キー保存テーブルにマップされる結合ビューの列。 ** 処置:基礎となる基本表を直接変更してください。
1.4 Instead, we should create a
INSTEAD OF
trigger on the view to
perform the actual operation.
trg
cust
proj
view
insert
TRIGGERの作成または置換trg__cust__proj__view__insert INSERT ONの代わりにcustomer__projects__view 宣言 duplicate__info EXCEPTION; PRAGMA EXCEPTION__INIT(duplicate__info、-00001); ベギン INSERT INTO customer__details (customer__id、customer__name、country) VALUES(:new.customer__id、:new.customer__name、:new.country); INSERT INTO projects__details(project__id、project__name、project__start__Date、customer__id) VALUES( :new.project__id、 :new.project__name、 :new.project__start__Date、 :new.customer__id); 例外 WHEN duplicate__info THEN RAISE__APPLICATION__ERROR( num => -20107、 msg => 'Duplicate customer or project id'); END trg__cust__proj__view__insert;
1.5再びビューに挿入します。 `INSTEAD OF`トリガが起動され、
実際のテーブルにデータを挿入します。
INSERT INTO customer__projects__view VALUES(1、 'XYZエンタープライズ'、 '日本'、101、 'ライブラリ管理'、sysdate); INSERT INTO customer__projects__view VALUES(2、 'ABCインフォテック'、 'インド'、202、 'HR管理'、sysdate);
1.6テーブルを選択します。
SELECT ** FROM customer__details;
顧客ID
顧客名
国
1
XYZエンタープライズ
日本
2
ABCインフォテック
インド
SELECT ** FROM projects__details;
[cols = “,,,”、options = “header”、]| =========================================== ========
| PROJECT
ID | PROJECT
NAME | PROJECT
START
DATE | CUSTOMER__ID
| 101 |図書館管理| 25-JUN-17 | 1
| 202 |人事管理| 25-JUN-17 | 2
| =========================================== ========
1.7ビューを選択します。
SELECT ** FROM customer__projects__view;
[cols = “,,,,,”、options = “header”、]| =========================================== ==========
| CUSTOMER
ID | CUSTOMER
NAME | COUNTRY | PROJECT
ID | PROJECT
NAME
| PROJECT
START
DATE
| 1 | XYZエンタープライズ|日本| 101 |図書館管理| 25-JUN-17
| 2 | ABCインフォテック|インド| 202 |人事管理| 25-JUN-17
| =========================================== ==========
2.ネストしたテーブルビュー列
INSTEAD OFを使用してデータをネストした表のビュー列に挿入する例
引き金。
2.1テストのためのテーブル、タイプ、ネストしたテーブルビューの列を作成します。
vehicle
mfg
company__details
テーブルを作成するvehicle__mfg__company__details( company__id番号(10)主キー、 company__name varchar2(50)NOT NULL );
vehicle__details
CREATE TABLEのvehicle__details( vehicle__id番号(10)主キー、 company__id番号(10)は、vehicle__mfg__company__details(company__id)、 vehicle__model__name varchar2(50)NOT NULL );
nestedTableEle
CREATE OR REPLACE TYPE nestedTableEle IS OBJECT( vehicle__id NUMBER(10)、 vehicle__model__name VARCHAR2(50) );
vehicle
details
list__
-- nested table view column CREATE OR REPLACE TYPE vehicle__details__list__ IS TABLE OF nestedTableEle;
2.2ビューを作成する。
company
vehicles
view
CREATE OR REPLACE VIEW company__vehicles__view AS SELECT company.company__id, company.company__name, CAST (MULTISET (SELECT vehicle.vehicle__id, vehicle.vehicle__model__name FROM vehicle__details vehicle WHERE vehicle.company__id = company.company__id ) AS vehicle__details__list__ ) vehiclelist FROM vehicle__mfg__company__details company;
2.3ネストした表のビュー列にデータを挿入します。
-- no error. INSERT INTO vehicle__mfg__company__details VALUES(101、 'Ford'); -- error INSERT INTO TABLE ( SELECT vw.vehiclelist FROM company__vehicles__view vw WHERE company__id = 101 ) VALUES (1, 'EcoSport'); -- output SQLエラー:ORA-25015:このネストした表ビューの列25015でDMLを実行できません。00000 - "このネストした表のビュー列でDMLを実行できません" ** 原因:INSTEAD OFトリガー以外のネストした表のビュー列でDMLを実行できません** 処置:ネストした表のビュー列に対してINSTEAD OFトリガーを作成し、DMLを実行してください。
2.4 Create a INSTEAD OF trigger
trg
comp
vehicles
view
insrt
トリガーの作成または置換trg__comp__vehicles__view__insrt入れ子になったテーブルの代わりに車両リストVehicleList of company__vehicles__view各車両の車両親としての新しい参照を開始する - ネストしたテーブルに挿入すると、ベーステーブルに挿入されます。 INSERT INTO vehicle__details( vehicle__id、 company__id、 vehicle__model__name ) VALUES( :Vehicle.vehicle__id、 :Company.company__id、 :Vehicle.vehicle__model__name ); 終わり;
2.5データを再度ネストした表ビュー列に挿入します。
INSERT INTO TABLE(SELECT vw.vehiclelist FROM company__vehicles__view vw where company__id = 101)VALUES(1、 'EcoSport'); INSERT INTO TABLE( SELECT vw.vehiclelist FROM company__vehicles__view vw どこcompany__id = 101 ) VALUES(2、 'エンデバー');
2.6表を表示する。
車の中から選択してください.com__company__details;
[cols = “、”、options = “header”、]| ====================
| COMPANY
ID | COMPANY
NAME
| 101 |フォード
| ====================
選択** from vehicle__details;
[cols = “,,”、options = “header”、]| ==================================
| VEHICLE
ID | COMPANY
ID | VEHICLE
MODEL
NAME
| 1 | 101 | EcoSport
| 2 | 101 |エンデバー
| ==================================
===参考文献
。
https://docs/OFトリガー
: – オラクルの公式ドキュメント]。
https://docs/トリガ
: – Oracleの公式ドキュメント]。リンク://oracle/oracle-plsql-before-update-trigge-example/[Oracle PL/SQL
– UPDATEトリガの例前]
の代わりに
oracle
plsql
trigger
view