Sie sind auf Seite 1von 4

-- Create CLIENT table

CREATE TABLE CLIENT (


NumCli NUMBER(10) PRIMARY KEY,
Nom VARCHAR2(20),
Prenom VARCHAR2(30),
DN DATE,
Rue VARCHAR2(70),
CP NUMBER(5),
Ville VARCHAR2(30)
);

-- Create PRODUIT table


CREATE TABLE PRODUIT (
NumProd NUMBER(10) PRIMARY KEY,
Desig VARCHAR2(80),
PU NUMBER(8,5),
NumFour NUMBER(10),
CONSTRAINT FK_NumFour FOREIGN KEY (NumFour) REFERENCES FOURNISSEUR (NumFour)
);

-- Create FOURNISSEUR table


CREATE TABLE FOURNISSEUR (
NumFour NUMBER(10) PRIMARY KEY,
RaisonSoc VARCHAR2(60),
Ville VARCHAR2(30)
);

-- Create COMMANDE table


CREATE TABLE COMMANDE (
RefCmd VARCHAR2(10) PRIMARY KEY,
DateC DATE,
NumCli NUMBER(10),
CONSTRAINT FK_NumCli FOREIGN KEY (NumCli) REFERENCES CLIENT (NumCli)
);

-- Create LGCMD table


CREATE TABLE LGCMD (
NumProd NUMBER(10),
RefCmd VARCHAR2(10),
Qte NUMBER(2),
TauxTva NUMBER(4,2),
PRIMARY KEY (NumProd, RefCmd),
CONSTRAINT FK_NumProd FOREIGN KEY (NumProd) REFERENCES PRODUIT (NumProd),
CONSTRAINT FK_RefCmd FOREIGN KEY (RefCmd) REFERENCES COMMANDE (RefCmd)
);

-- Create FACTURE table


CREATE TABLE FACTURE (
Ref_facture VARCHAR2(10) PRIMARY KEY,
Date_facture DATE,
Montant_fact NUMBER(4,2),
NumCli NUMBER(10),
CONSTRAINT FK_NumCli2 FOREIGN KEY (NumCli) REFERENCES CLIENT (NumCli)
);

-- Create a new user


CREATE USER Gest_magasin IDENTIFIED BY Gestion;
-- Grant necessary privileges to the user
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE TO Gest_magasin;

DESC nom_de_table;

/////
DECLARE
v_num_four fournisseur.numfour%type := 1; -- Remplacer 1 par le numéro du
fournisseur de Tunis
v_prix_ttc produit.pu%type;
CURSOR c_produits IS
SELECT numprod, pu*1.206 AS prix_ttc
FROM produit
WHERE numfour = v_num_four;
BEGIN
FOR prod IN c_produits LOOP
v_prix_ttc := prod.prix_ttc;
DBMS_OUTPUT.PUT_LINE('Produit ' || prod.numprod || ' : ' || v_prix_ttc || '
DT');
END LOOP;
END;

DECLARE
v_ref_facture facture.ref_facture%type;
v_montant_total facture.montant_fact%type;
v_frais_transport CONSTANT NUMBER(2) := 7;
BEGIN
FOR c IN (SELECT numcli, nom, prenom FROM client) LOOP
v_ref_facture := 'FACT' || c.numcli;
SELECT SUM(qte*pu) INTO v_montant_total FROM lgcmd WHERE refcmd IN (SELECT
refcmd FROM commande WHERE numcli = c.numcli);
IF v_montant_total < 300 THEN
v_montant_total := v_montant_total + v_frais_transport;
END IF;
INSERT INTO facture (ref_facture, date_facture, montant_fact, numcli,
montant_a_payer)
VALUES (v_ref_facture, SYSDATE, v_montant_total, c.numcli, v_montant_total);
DBMS_OUTPUT.PUT_LINE('Facture créée pour ' || c.nom || ' ' || c.prenom || ' : '
|| v_ref_facture || ', montant total : ' || v_montant_total || ' DT');
END LOOP;
END;

-- Ajouter la colonne Remise


ALTER TABLE facture ADD (remise NUMBER(5,2));

-- Ajouter la colonne Montant_a_payer


ALTER TABLE facture ADD (montant_a_payer NUMBER(7,2));

-- Mettre à jour les colonnes Remise et Montant_a_payer pour chaque facture


DECLARE
v_remise CONSTANT NUMBER(3,2) := 0.08;
BEGIN
FOR f IN (SELECT ref_facture, montant_fact FROM facture) LOOP
IF f.montant_fact > 1000 THEN
UPDATE facture SET remise = f.montant_fact * v_remise, montant_a_payer =
f.montant_fact * (1 - v_remise)
WHERE ref_facture = f.ref_facture;
DBMS_OUTPUT.PUT_LINE('Remise de ' || f.montant_fact * v_remise || ' DT
appliquée sur la facture ' || f.ref_facture);
ELSE
UPDATE facture SET montant_a_payer = montant_fact WHERE
or
ALTER TABLE Facture ADD Remise NUMBER(5,2);
ALTER TABLE Facture ADD Montant_a_payer NUMBER(8,2);

UPDATE Facture
SET Remise = CASE WHEN Montant_fact > 1000 THEN Montant_fact * 0.08 ELSE 0 END,
Montant_a_payer = Montant_fact - (CASE WHEN Montant_fact > 1000 THEN
Montant_fact * 0.08 ELSE 0 END);

DECLARE
v_ref_facture VARCHAR2(20);
v_montant_facture NUMBER(10, 2);
BEGIN
FOR c IN (SELECT NumCli, CONCAT('FACT', NumCli) AS ref_facture
FROM CLIENT)
LOOP
SELECT SUM(pu * qte)
INTO v_montant_facture
FROM PRODUIT p, LGCMD l, COMMANDE c
WHERE p.NumProd = l.NumProd
AND l.RefCmd = c.RefCmd
AND c.NumCli = c.NumCli;

IF v_montant_facture < 300 THEN


v_montant_facture := v_montant_facture + 7;
END IF;

v_ref_facture := c.ref_facture;

INSERT INTO FACTURE (Ref_facture, Date_facture, Montant_fact, NumCli)


VALUES (v_ref_facture, SYSDATE, v_montant_facture, c.NumCli);
END LOOP;
END;
/

DECLARE
v_ref_facture VARCHAR2(20);
v_montant_facture NUMBER(10, 2);
BEGIN
FOR c IN (SELECT NumCli, CONCAT('FACT', NumCli) AS ref_facture
FROM CLIENT)
LOOP
SELECT SUM(PU * QTE)
INTO v_montant_facture
FROM PRODUIT p, LGCMD l, COMMANDE c
WHERE p.NumProd = l.NumProd
AND l.RefCmd = c.RefCmd
AND c.NumCli = c.NumCli;

IF v_montant_facture < 300 THEN


v_montant_facture := v_montant_facture + 7;
END IF;

v_ref_facture := c.ref_facture;

INSERT INTO FACTURE (Ref_facture, Date_facture, Montant_fact, NumCli)


VALUES (v_ref_facture, SYSDATE, v_montant_facture, c.NumCli);
END LOOP;
END;
/

DECLARE
v_ref_facture FACTURE.Ref_facture%TYPE;
v_montant_facture FACTURE.Montant_fact%TYPE;
v_remise NUMBER(8,2);
BEGIN
FOR facture IN (SELECT * FROM FACTURE WHERE Montant_fact > 1000) LOOP
v_ref_facture := facture.Ref_facture;
v_montant_facture := facture.Montant_fact;
v_remise := v_montant_facture * 0.08;

UPDATE FACTURE SET Remise = v_remise, Montant_a_payer = v_montant_facture -


v_remise WHERE Ref_facture = v_ref_facture;
END LOOP;

DBMS_OUTPUT.PUT_LINE('Remise de 8% des montant >1000dt appliquée avec succès !');


END;

Das könnte Ihnen auch gefallen