2017-05-08 17 views
1
CREATE OR REPLACE PROCEDURE insert_ol 
(
    p_ord_id order_line.order_id%type, 
    p_pid order_line.product_id%type, 
    p_qty order_line.quantity%type, 
    p_price order_line.price%type, 
    p_pname order_line.prod_name%type, 
    p_alias order_line.prod_alias%type) 

    IS 
    BEGIN 
    INSERT INTO order_line values (p_ord_id, p_pid, p_qty, p_price, p_pname, 
    p_alias); 
    END; 

を発射そして、私は、代わりにこのようなTRIGGER OF持っていない:私はにデータを挿入するとき代わりのトリガ

CREATE OR REPLACE FORCE VIEW "OL_INS" 
AS 
SELECT ot.order_id, prd.prod_code, ot.qty, prd.prod_cost, prd.prod_name, 
ot.palias 
FROM ol_temp ot 
JOIN product prd 
ON ot.palias=prd.prod_alias; 

CREATE OR REPLACE TRIGGER insert_ol 
INSTEAD OF INSERT ON ol_ins 
FOR EACH ROW 
BEGIN 
insert_ol 
(:new.order_id,:new.prod_code, 
:new.qty,prod_cost,:new.prod_name,:new.palias); 
end; 

トリガがベースとなっている図であるが"OL_TEMP"テーブルの場合、部分データは "PRODUCT"テーブルと結合され、ビューに入ります。しかしトリガは起動せず、プロシージャを呼び出してデータを "ORDER_LINE"テーブルに挿入します。

私がやっている間違いとそれを修正する方法は何ですか?

+0

トリガは 'prod_cost'ではなく':new.prod_cost'を使うべきですが、コンパイルに失敗し、ビューに挿入するとエラーが発生します。しかし、 "OL_TEMP'テーブルにデータを挿入すると、テーブルを直接操作すると、ビューに対するトリガは起動しません。 'OL_INS'ビューに挿入するとどうなりますか? –

+0

私は直接ビューにデータを挿入し、これが起こってみました:ol_ins INTO INSERT VALUES(4,37、3、35、 'ミネラルウォーター'、 'MW')コマンドラインで エラー:1列:1 エラー・レポート - SQLエラー:ORA-01779:非キー保存表にマップする列を変更できません 01779. 00000 - "非キー保存表にマップする列を変更できません" *原因: が非キー保存テーブルにマップする結合ビューの列を挿入または更新するようになりました。 *処置:基礎となる基本表を直接変更してください。 –

+0

また、 'OL_TEMP'とは何ですか?そして、それは他のテーブルとどう関係していますか? –

答えて

1

あなたがOL_INSビューに挿入したときに、直接基礎となる表(複数可)を操作した場合、それが起動することはありませんinstead ofトリガが起動

When I insert data into the "OL_TEMP" table...

に基づいて、後方のものを持っているようです。だからあなたのような何かをする必要があります。

insert into ol_ins (order_id, prod_code, qty, prod_cost, prod_name, palias) 
values (...) 

トリガは、火は、プロシージャを呼び出して、order_lineテーブルにデータを挿入します。あなたのトリガーがの代わりにprod_cust(これは既知の識別子ではありません)を参照しているため、エラーは発生しません。

これはあなたが望むものではないことから、ビュー上のトリガーは意味がありません。あなたは一時テーブルと永続的な製品のテーブルに基づいて、単純な挿入を、したいように見える - あなたがすべてでビューを必要とすることも、明らかではない:あなたは本当に何か他のビューを必要とした場合は

INSERT INTO order_line (order_id, product_id, quantity, price, prod_name, prod_alias) 
SELECT ot.order_id, prd.prod_code, ot.qty, prd.prod_cost, prd.prod_name, ot.palias 
FROM ol_temp ot 
JOIN product prd 
ON ot.palias = prd.prod_alias; 

そしてここにあなたがまだ可能性、それを使用したい:

INSERT INTO order_line (order_id, product_id, quantity, price, prod_name, prod_alias) 
SELECT order_id, prod_code, qty, prod_cost, prod_name, palias 
FROM ol_ins; 

が、私は、ビューそのためだけを作成しないでしょう。そして、もしあなたが本当にしたいのであれば、プロシージャ内のいずれかの挿入をラップすることもできますが、一時テーブルで文後のトリガを使用しない限り、トリガではなく明示的にプロシージャを呼び出さなければなりません。

+0

あなたは正しいです、私は見る必要はありません。私は単にORDER_LINEテーブルに挿入することができます。 私はこうです: OL_TEMPテーブルの後に挿入トリガを追加して、部分データのプロシージャをコールし、プロシージャでORDER_LINEテーブルに挿入するテーブルを結合しますか?あれは正しいですか? –