2016-04-26 28 views
0

我需要幫助創建視圖,然後觸發以下內容:輸入每個發票行項目時更新銷售人員佣金(銷售額的10%),庫存數量和客戶餘額。在oracle中創建視圖和觸發器sql

這就是我現在所擁有的一種觀點:

CREATE OR REPLACE VIEW NEW_INVOICE_LINE_ITEM 
AS 
SELECT COMMISSION, INV_QUANTITY, CUSTOMER_BALANCE 
FROM SALESPERSON, INVENTORY, CUSTOMER; 

這就是我對觸發:

CREATE OR REPLACE TRIGGER UPDATE_COMMISSION 
AFTER INSERT ON INVOICE_LINE_ITEM FOR EACH ROW 
BEGIN 
UPDATE SALESPERSON 
SET COMMISSION = (SALE_PRICE * QUANTITY_SOLD) *.10 
WHERE :NEW.COMMISSION = SALESPERSON.COMMISSION; 
END; 

我不斷收到錯誤:壞綁定變量「 new.commission'

這是我的數據庫架構如下:

DROP TABLE PO_LINE_ITEM; 
DROP TABLE PURCHASE_ORDER; 
DROP TABLE VENDOR; 
DROP TABLE INVOICE_LINE_ITEM; 
DROP TABLE INVENTORY; 
DROP TABLE INVOICE; 
DROP TABLE SALESPERSON; 
DROP TABLE CUSTOMER; 
CREATE TABLE CUSTOMER 
(CUSTOMER_ID DECIMAL(2,0) PRIMARY KEY,  
CUSTOMER_NAME CHAR(25), 
CUSTOMER_ADDRESS CHAR(15), 
CUSTOMER_ZIPCODE DECIMAL(5,0), 
CUSTOMER_CITY CHAR(15), 
CUSTOMER_STATE CHAR(2), 
CUSTOMER_BALANCE DECIMAL(4,2) 
); 
CREATE TABLE SALESPERSON 
(SALESPERSON_ID DECIMAL(3,0) PRIMARY KEY, 
SALESPERSON_NAME CHAR(25), 
COMMISSION DECIMAL(5,2) 
); 
CREATE TABLE INVOICE 
(INVOICE_ID DECIMAL(3,0), 
CUSTOMER_ID DECIMAL(2,0), 
SALESPERSON_ID DECIMAL(3,0), 
ITEM_NUM DECIMAL(4,0), 
INVOICE_DATE DATE, 
PRIMARY KEY (CUSTOMER_ID, SALESPERSON_ID), 
FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER, 
FOREIGN KEY (SALESPERSON_ID) REFERENCES SALESPERSON 
); 
CREATE TABLE INVENTORY 
(INV_NUM DECIMAL(4,0) PRIMARY KEY, 
DESCRIPTION CHAR(10), 
INV_QUANTITY DECIMAL(4,0), 
INV_PRICE DECIMAL(7,2), 
INV_COST DECIMAL(7,2), 
INVOICE_ID DECIMAL(3,0), 
ITEM_NUM DECIMAL(4,0), 
FOREIGN KEY (INVOICE_ID, ITEM_NUM) REFERENCES INVOICE 
); 
CREATE TABLE INVOICE_LINE_ITEM 
(QUANTITY_SOLD DECIMAL(4,0), 
SALE_PRICE DECIMAL(7,2), 
INVOICE_ID DECIMAL(3,0), 
INV_NUM DECIMAL(4,0), 
ITEM_NUM DECIMAL(4,0), 
PRIMARY KEY (INVOICE_ID, INV_NUM, ITEM_NUM), 
FOREIGN KEY (INVOICE_ID, ITEM_NUM) REFERENCES INVOICE, 
FOREIGN KEY (INV_NUM) REFERENCES INVENTORY 
); 
CREATE TABLE VENDOR 
(VENDOR_ID DECIMAL(2,0) PRIMARY KEY, 
VENDOR_NAME CHAR(25), 
CITY CHAR(15), 
STATE CHAR(2), 
VENDOR_BALANCE DECIMAL(4,2) 
); 
CREATE TABLE PURCHASE_ORDER 
(PURCHASE_ORDER_ID DECIMAL(2,0) PRIMARY KEY, 
BALANCE DECIMAL(4,2), 
SHIPMENT CHAR(10), 
PURCHASE_ORDER_DATE DATE, 
VENDER_ID DECIMAL (2,0), 
FOREIGN KEY (VENDER_ID) REFERENCES VENDOR 
); 
CREATE TABLE PO_LINE_ITEM 
(PO_DATE DATE, 
PO_BALANCE DECIMAL(4,0), 
ITEM_NUM DECIMAL(4,0), 
INV_QUANTITY DECIMAL(4,0), 
INV_NUM DECIMAL(4,0), 
PURCHASE_ORDER_ID DECIMAL(2,0), 
PRIMARY KEY (INV_NUM, PURCHASE_ORDER_ID), 
FOREIGN KEY (INV_NUM) REFERENCES INVENTORY, 
FOREIGN KEY (PURCHASE_ORDER_ID) REFERENCES PURCHASE_ORDER); 

在此先感謝!

+0

您正在使用哪個客戶端?當你使用錯誤的代碼運行方式時,SQL Developer有時會這樣做,但我不能記得它的副作用。如果您使用'運行語句',那麼請嘗試'運行腳本',反之亦然。如果這無助於將兩個表的結構添加到問題中。這個觀點的相關性是什麼,爲什麼它沒有任何聯合條件(或者確實是合適的聯合)? –

+1

'invoice_line_item'沒有'佣金'欄......您是否應該從父發票中找到銷售人員?你是否要更換現有的佣金,還是要加入? –

+1

我只是評論說這是觸發器的一個不好的用法。這應該在一個應用程序中。不要說它看起來很麻煩。仔細想想那個WHERE條件。您正在更新當前佣金=計算值的每個銷售員佣金。我懷疑這是你 – EdStevens

回答

0

invoice_line_item不包含列commission,這是壞綁定變量錯誤的原因。你應該重寫你的觸發代碼喜歡這裏:

create or replace trigger update_commission 
    after insert on invoice_line_item for each row 
begin 
    update salesperson sp 
    set sp.commission = sp.commission + (:new.sale_price * :new.quantity_sold * .1) 
    where sp.salesperson_id = 
     (select salesperson_id 
      from invoice i 
      where i.invoice_id = :new.invoice_id); 
end; 

在你view你沒有附加條件如何連接表,這裏的例子,如何做到這一點:

create or replace view vw_invoices as 
    select ili.invoice_id, ili.quantity_sold, ili.sale_price, 
     i.salesperson_id, sp.salesperson_name 
    from invoice_line_item ili 
    join invoice i on i.invoice_id = ili.invoice_id 
    join salesperson sp on sp.salesperson_id = i.salesperson_id; 

根據其信息您想要顯示 - 連接正確的表並使用正確的連接。

+0

我弄懂了它,但它顯示我在第8行有錯誤: –

+0

新帖已發佈在此處:http://stackoverflow.com/questions/36903748/sql - 觸發器換視圖 –