Advertisement
codisinmyvines

dlyaDenisa

Oct 6th, 2021
1,197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE TABLE availability_details(
  2.     num_warehouse INT NOT NULL CHECK ( num_warehouse>0 ),
  3.     id_detail INT NOT NULL CHECK ( id_detail>0 ),
  4.     unit_detail VARCHAR(3) NOT NULL DEFAULT 'шт',
  5.     quantity_in_warehouse INT NOT NULL CHECK ( quantity_in_warehouse>=0 ),
  6.     date_last_oper DATE NOT NULL,
  7.     PRIMARY KEY (num_warehouse,id_detail)
  8. );
  9. CREATE TABLE details(
  10.     id_detail SERIAL NOT NULL PRIMARY KEY CHECK ( id_detail>0 ),
  11.     type_of_detail TEXT NOT NULL,
  12.     name_of_detail TEXT NOT NULL,
  13.     unit_detail VARCHAR(3) NOT NULL DEFAULT 'шт',
  14.     price_unit_detail DECIMAL NOT NULL CHECK ( price_unit_detail>0 )
  15. );
  16. CREATE TABLE shipment_accounting(
  17.     num_warehouse INT NOT NULL CHECK ( num_warehouse>0 ),
  18.     num_of_ship_doc INT NOT NULL CHECK ( num_of_ship_doc>0 ),
  19.     id_customer INT NOT NULL CHECK ( id_customer>0 ),
  20.     id_ready_detail INT NOT NULL CHECK ( id_ready_detail>0 ),
  21.     unit_detail VARCHAR(3) NOT NULL DEFAULT 'шт',
  22.     quantity INT NOT NULL CHECK ( quantity>=0 ),
  23.     date_of_ship_acc DATE NOT NULL,
  24.     PRIMARY KEY (num_warehouse,num_of_ship_doc),
  25.     CONSTRAINT fkdu_num_ware_house_id_detail FOREIGN KEY(num_warehouse,id_ready_detail)
  26.         REFERENCES availability_details(num_warehouse,id_detail) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
  27.     CONSTRAINT fk_id_detail FOREIGN KEY (id_ready_detail) REFERENCES details(id_detail) DEFERRABLE INITIALLY DEFERRED
  28. );
  29.  
  30. //триггеры и их создание
  31. CREATE OR REPLACE FUNCTION trigger_before_del_id_detail() RETURNS
  32.     trigger AS'
  33.    BEGIN
  34.    DELETE FROM shipment_accounting WHERE id_ready_detail=old.id_detail;
  35.    DELETE FROM availability_details WHERE id_detail=old.id_detail;
  36.    RETURN old;
  37.    END;
  38. ' LANGUAGE plpgsql;
  39. CREATE TRIGGER tr_id_detail_before
  40. BEFORE DELETE ON details FOR EACH ROW
  41. EXECUTE PROCEDURE trigger_before_del_id_detail();
  42.  
  43. CREATE OR REPLACE FUNCTION trigger_before_upd_id_detail() RETURNS
  44.     trigger AS'
  45.    BEGIN
  46.    UPDATE shipment_accounting
  47.    SET id_ready_detail=new.id_detail
  48.    WHERE id_ready_detail=old.id_detail;
  49.    UPDATE availability_details
  50.    SET id_detail=new.id_detail
  51.    WHERE id_detail=old.id_detail;
  52.    RETURN new;
  53.    END;
  54. ' LANGUAGE plpgsql;
  55. CREATE TRIGGER tr_id_detail_before_upd
  56. BEFORE UPDATE ON details FOR EACH ROW
  57. EXECUTE PROCEDURE trigger_before_upd_id_detail();
  58.  
  59. //заполнение таблиц, заполняй внимательнее не забудь проверить!!!
  60. INSERT INTO details(type_of_detail, name_of_detail, price_unit_detail)
  61. VALUES ('собственное','доска',508),
  62.        ('собственное','профнастил',1135),
  63.        ('покупное','цемент',208),
  64.        ('собственное','металлочерепица',1364),
  65.        ('покупное','шифер',557);
  66. INSERT INTO availability_details(num_warehouse, id_detail, quantity_in_warehouse, date_last_oper)
  67. VALUES (7,1,200,DATE '2021-12-04'),
  68.        (6,4,300,DATE '2021-02-04'),
  69.        (8,5,100,DATE '2021-11-02'),
  70.        (9,3,250,DATE '2021-11-15'),
  71.        (10,4,500,DATE '2021-12-05'),
  72.        (7,2,306,DATE '2021-12-04'),
  73.        (9,5,250,DATE '2021-12-14');
  74. INSERT INTO shipment_accounting(num_warehouse, num_of_ship_doc, id_customer, id_ready_detail, quantity, date_of_ship_acc)
  75. VALUES (9,1,1,3,200, DATE'2021-11-04'),
  76.        (7,2,2,1,122, DATE'2021-12-05'),
  77.        (8,3,3,5,200, DATE'2021-11-011'),
  78.        (6,4,1,4,200, DATE'2021-10-04'),
  79.        (10,5,1,4,200, DATE'2021-12-04'),
  80.        (7,6,2,2,122, DATE'2021-12-05'),
  81.        (9,7,1,5,200, DATE'2021-11-04');
  82.  
  83. //процедура
  84. CREATE PROCEDURE get_quantity_orders_and_details(IN id_cust INT, INOUT quantity_orders INT, INOUT quantity_details INT)
  85. AS $$
  86.     BEGIN
  87.         quantity_orders:=(SELECT COUNT(id_customer) FROM  shipment_accounting WHERE id_customer=id_cust);
  88.         quantity_details:=(SELECT SUM(quantity) FROM shipment_accounting WHERE id_customer=id_cust);
  89.     END;
  90. $$ LANGUAGE plpgsql;
  91. CALL get_quantity_orders_and_details(1,0,0);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement