Как исправить триггер или процедуру в Oracle Express для автоматизации значений в столбце таблицы - PullRequest
0 голосов
/ 02 января 2019

Как я могу автоматизировать столбец sale.sale_total, который будет суммой значений столбца sales_line.line_total.Можете ли вы сделать триггер или процедуру для этих двух вопросов?Вы можете мне помочь?

Что-то вроде: sale.sale_total = (sale.sale_total + .sales_line.line_total).

CREATE TABLE product (
    product_id    NUMBER(4) NOT NULL,
    category_id   NUMBER(4) NOT NULL,
    p_desc        VARCHAR2(40),
    cpu           VARCHAR2(14),
    ram           VARCHAR2(14),
    capacity      VARCHAR2(14),
    screen_size   VARCHAR2(14),
    battery       VARCHAR2(14),
    unit_price    NUMBER(7, 2),
    colour        VARCHAR2(14),
    qty_stock     NUMBER(4)
);
ALTER TABLE product ADD CONSTRAINT product_pk PRIMARY KEY ( product_id );

CREATE TABLE sale (
    sale_id       NUMBER(4) NOT NULL,
    sale_date     DATE,
    customer_id   NUMBER(4) NOT NULL,
    employee_id   NUMBER(4) NOT NULL,
    sale_total    NUMBER(7, 2)
);

ALTER TABLE sale ADD CONSTRAINT sale_pk PRIMARY KEY ( sale_id );

CREATE TABLE sales_line (
    sale_id      NUMBER(4) NOT NULL,
    product_id   NUMBER(4) NOT NULL,
    line_qty     NUMBER(4),
    line_total   NUMBER(7, 2)
);

ALTER TABLE sales_line ADD CONSTRAINT index_3 PRIMARY KEY ( sale_id,
                                                            product_id );

ALTER TABLE product
    ADD CONSTRAINT product_p_category_fk FOREIGN KEY ( category_id )
        REFERENCES p_category ( category_id );

ALTER TABLE sale
    ADD CONSTRAINT sale_customer_fk FOREIGN KEY ( customer_id )
        REFERENCES customer ( customer_id );

ALTER TABLE sale
    ADD CONSTRAINT sale_employee_id_fk FOREIGN KEY ( employee_id )
        REFERENCES employee ( employee_id );

ALTER TABLE sales_line
    ADD CONSTRAINT sales_line_product_fk FOREIGN KEY ( product_id )
        REFERENCES product ( product_id );

ALTER TABLE sales_line
    ADD CONSTRAINT sales_line_sale_fk FOREIGN KEY ( sale_id )
        REFERENCES sale ( sale_id );    

**Here are the triggers I have written so far:**

CREATE OR REPLACE TRIGGER trg_sale_total_ai AFTER INSERT OR UPDATE ON sales_line
FOR EACH ROW
BEGIN
    UPDATE sale
        SET sale_total = (sale_total + :NEW.line_total)         
        WHERE sale.sale_id = :NEW.sale_id;        
END;

Я пытался сделать как @Gordon Linoff (код ниже),но значение в таблице sale.line_total по-прежнему равно нулю.Я пытался с BEFORE UPDATE, то же самое:

CREATE OR REPLACE TRIGGER trg_sale_total_ai AFTER INSERT OR UPDATE ON sales_line
FOR EACH ROW
BEGIN
UPDATE sale     
        SET sale_total = (sale_total + 
                          (CASE WHEN sale_id = :NEW.sale_id THEN :NEW.line_total ELSE 0 END) -
                          (CASE WHEN sale_id = :OLD.sale_id THEN :OLD.line_total ELSE 0 END)
                         )  
        WHERE sale_id IN (:OLD.sale_id, :NEW.sale_id);

Я просто хочу обновить столбец sale.sale_total суммой значений sales_line.line_total после того, как я вставлю данные в таблицу sales_line.

**Here are the triggers I have written so far:**

CREATE OR REPLACE TRIGGER trg_sale_total_ai AFTER INSERT OR UPDATE ON sales_line
FOR EACH ROW
BEGIN
    UPDATE sale
        SET sale_total = (sale_total + :NEW.line_total)         
        WHERE sale.sale_id = :NEW.sale_id;        
END;

Спасибо

1 Ответ

0 голосов
/ 02 января 2019

Лучше всего выполнить

ALTER TABLE SALE
  DROP COLUMN SALE_TOTAL;

Это не тот столбец, который вам нужен, потому что, как вы только начинаете понимать, его поддержание станет кошмаром.Вместо этого вам нужна функция:

CREATE OR REPLACE FUNCTION COMPUTE_SALE_TOTAL(pinSale_id IN SALE.SALE_ID%TYPE)
  RETURN NUMBER
AS
  nSale_total  NUMBER;
BEGIN
  SELECT SUM(LINE_TOTAL)
    INTO nSale_total
    FROM SALES_LINE
    WHERE SALE_ID = pinSale_id;

  RETURN nSale_total;
END COMPUTE_SALE_TOTAL;

Затем в любой момент, когда вам нужно узнать, какова общая сумма продажи, вы вызываете эту функцию.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...