2016-04-26 5 views
0

Ich brauche Hilfe beim Erstellen einer Ansicht und löst dann für Folgendes: Update Verkäufer Provision (10% des Verkaufs), Inventar Menge und Kundensaldo, wenn jede Rechnung Einzelposten eingegeben wird.erstellen Sie Ansichten und löst in Oracle sql

Das ist, was ich jetzt für die Ansicht haben:

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

Dies ist, was ich für den Auslöser haben:

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; 

ich auf immer den Fehler halten: schlechte Bind-Variable ' new.commission‘

Das ist mein Datenbank-Schema unten:

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); 

Vielen Dank im Voraus!

+0

Welchen Client verwenden Sie? SQL Developer tut das manchmal, wenn Sie die falsche Methode zum Ausführen des Codes verwenden, aber ich kann mich nicht daran erinnern, um welche Seite es sich handelt. Wenn Sie 'run statement' verwenden, dann versuchen Sie 'run script' und umgekehrt. Wenn das nicht hilft, fügen Sie der Frage die Struktur beider Tabellen hinzu. Welche Relevanz hat die Ansicht und warum hat sie keine Join-Bedingungen (oder tatsächlich Joins)? –

+1

'invoice_line_item' hat keine 'Provision'-Spalte ... sollen Sie den Verkäufer aus der Elternrechnung finden? Und ersetzen Sie ihre aktuelle Provision oder fügen Sie sie hinzu? –

+1

Ich werde nur kommentieren, dass dies eine schlechte Verwendung von Triggern ist. Dies sollte in einem Bewerbungsverfahren sein. Ganz zu schweigen von der Tatsache, dass es sehr buggy aussieht. Denken Sie sorgfältig über diese WHERE-Bedingung nach. Sie aktualisieren jede Verkaufsprovision, deren aktuelle Provision der berechnete Wert ist. Ich bezweifle, dass das ist, was Sie – EdStevens

Antwort

0

Tabelle invoice_line_item enthält keine Spalte commission, ist dies der Grund für schlecht Bind Variable Fehler. Sie sollten Ihren Trigger-Code wie hier umschreiben:

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; 

In Ihrem view Sie nicht mit Bedingungen, wie Tabellen zu verbinden, hier ist das Beispiel dafür, wie dies zu tun:

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; 

Je nachdem, welche Informationen die Sie wollen zeigen - verbinde korrekte Tabellen und verwende korrekte Joins.

+0

Ich habe es funktioniert, aber es zeigt mir, dass ich Fehler in Zeile 8 habe: –

+0

neuer Beitrag wurde hier gepostet: http://StackOverflow.com/Questions/36903748/sql -trigger-for-view –