SGBD Projet
SGBD Projet
|---------------------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|-----------------------------| Les Sequences des Tableaux
|----------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|-----------------------------| L'indexation des Tableaux
|-----------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
|----------------------------------------------------------------------------------
-----------------------|
INSERT INTO LivraisonCom (nocde, dateliv, livreur, modepay, etatcdel)
VALUES (
(SELECT nocde FROM Commandes WHERE etatcde = 'EC'),CURRENT_TIMESTAMP, (SELECT
idpers FROM Personnel
WHERE nompers = 'Traouli' AND prenompers = 'Ahmed') ,
'avant_livraison', 'EC');
|----------------------------------------------------------------------------------
-----------------------|
|-----------------------------| Creation de Package et Procedures
|---------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|
|------------------------------------| Gestion de Commandes
|---------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|
create or replace PACKAGE PKG_COMMAND_MANAGEMENT AS
PROCEDURE add_command(p_noclt NUMBER, p_etatcde CHAR DEFAULT 'EC');
PROCEDURE modify_command_state(p_nocde NUMBER, p_new_state CHAR);
PROCEDURE cancel_command(p_nocde NUMBER);
PROCEDURE search_command(p_nocde NUMBER DEFAULT NULL, p_noclt NUMBER DEFAULT
NULL, p_datecde DATE DEFAULT NULL);
END PKG_COMMAND_MANAGEMENT;
/******************************************/
create or replace PACKAGE BODY PKG_COMMAND_MANAGEMENT AS
PROCEDURE add_command(p_noclt NUMBER, p_etatcde CHAR DEFAULT 'EC') IS
v_datecde DATE := SYSDATE;
BEGIN
INSERT INTO commandes (nocde, noclt, datecde, etatcde)
VALUES (commandes_seq.NEXTVAL, p_noclt, v_datecde, p_etatcde);
END add_command;
/******************************************/
PROCEDURE modify_command_state(p_nocde NUMBER, p_new_state CHAR) IS
v_current_state CHAR(2);
BEGIN
SELECT etatcde INTO v_current_state FROM commandes WHERE nocde = p_nocde;
|----------------------------------------------------------------------------------
-----------------------|
|------------------------------------| Gestion des Livraisons
|-------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|
create or replace PACKAGE PKG_DELIVERY_MANAGEMENT AS
PROCEDURE add_delivery(p_nocde NUMBER, p_livreur NUMBER, p_modepay CHAR DEFAULT
'avant_livraison');
PROCEDURE cancel_delivery(p_nocde NUMBER);
PROCEDURE modify_delivery(p_nocde NUMBER, p_new_date DATE, p_new_livreur NUMBER);
PROCEDURE search_delivery(p_nocde NUMBER DEFAULT NULL, p_livreur NUMBER DEFAULT
NULL, p_villeclt CHAR DEFAULT NULL, p_dateliv DATE DEFAULT NULL);
END PKG_DELIVERY_MANAGEMENT;
/******************************************/
create or replace PACKAGE BODY PKG_DELIVERY_MANAGEMENT AS
PROCEDURE add_delivery(p_nocde NUMBER, p_livreur NUMBER, p_modepay CHAR DEFAULT
'avant_livraison') IS
v_dateliv DATE := SYSDATE;
BEGIN
INSERT INTO LivraisonCom (nocde, dateliv, livreur, modepay, etatcdel)
VALUES (p_nocde, v_dateliv, p_livreur, p_modepay, 'EC');
END add_delivery;
/******************************************/
PROCEDURE cancel_delivery(p_nocde NUMBER) IS
BEGIN
-- Additional logic can be added based on the provided requirements
UPDATE LivraisonCom SET etatcdel = 'AN' WHERE nocde = p_nocde;
-- Update HCommandesAnnulees avantliv=TRUE a l'aide d'un trigger
CREATE OR REPLACE TRIGGER hcommandesannulees_update
AFTER UPDATE ON commandes
FOR EACH ROW
WHEN (NEW.etatcde = 'AN' AND OLD.etatcde != 'AN')
DECLARE
v_numclt NUMBER(4);
BEGIN
SELECT noclt INTO v_numclt FROM commandes WHERE nocde = :NEW.nocde;
UPDATE HCommandesAnnulees
SET avantliv = 1
WHERE nocde = :NEW.nocde AND numclt = v_numclt;
END hcommandesannulees_update;
END cancel_delivery;
/******************************************/
PROCEDURE modify_delivery(p_nocde NUMBER, p_new_date DATE, p_new_livreur NUMBER)
IS
BEGIN
UPDATE LivraisonCom SET dateliv = p_new_date, livreur = p_new_livreur WHERE
nocde = p_nocde;
END modify_delivery;
--Trigger pour livreur ne doit pas dépasser les 15 commandes par jour et par ville
CREATE OR REPLACE TRIGGER livraisoncom_limit_trigger
BEFORE INSERT OR UPDATE ON LivraisonCom
FOR EACH ROW
DECLARE
v_deliveries_today NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_deliveries_today
FROM LivraisonCom
WHERE livreur = :NEW.livreur
AND TRUNC(dateliv) = TRUNC(SYSDATE)
AND ROWNUM <= 15;
IF v_deliveries_today >= 15 THEN
RAISE_APPLICATION_ERROR(-20001, 'Le livreur a atteint le nombre maximum de
livraisons pour aujourd''hui.');
END IF;
END livraisoncom_limit_trigger;
/******************************************/
PROCEDURE search_delivery(p_nocde NUMBER DEFAULT NULL, p_livreur NUMBER DEFAULT
NULL, p_villeclt CHAR DEFAULT NULL, p_dateliv DATE DEFAULT NULL) IS
v_result LivraisonCom%ROWTYPE; -- Declare a variable to store the result
BEGIN
IF p_nocde IS NOT NULL THEN
SELECT * INTO v_result FROM LivraisonCom WHERE nocde = p_nocde;
ELSIF p_livreur IS NOT NULL THEN
SELECT * INTO v_result FROM LivraisonCom WHERE livreur = p_livreur;
ELSIF p_villeclt IS NOT NULL THEN
NULL; -- Replace this with the actual query
ELSIF p_dateliv IS NOT NULL THEN
SELECT * INTO v_result FROM LivraisonCom WHERE dateliv = p_dateliv;
ELSE
RETURN;
END IF;
DBMS_OUTPUT.PUT_LINE('Result: ' || v_result.nocde || ', ' || v_result.dateliv
|| ', ' || v_result.livreur || ', ' || v_result.modepay || ', ' ||
v_result.etatcdel);
END search_delivery;
END PKG_DELIVERY_MANAGEMENT;
/******************************************/
--Trigger Pour verifie que le livreur ne depasse pas 15 commandes par jour
create or replace TRIGGER livraisoncom_limit_trigger
BEFORE INSERT OR UPDATE ON LivraisonCom
FOR EACH ROW
DECLARE
v_deliveries_today NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_deliveries_today
FROM LivraisonCom
WHERE livreur = :NEW.livreur
AND TRUNC(dateliv) = TRUNC(SYSDATE)
AND ROWNUM <= 15;
IF v_deliveries_today >= 15 THEN
RAISE_APPLICATION_ERROR(-20001, 'Le livreur a atteint le nombre maximum de
livraisons pour aujourd''hui.');
END IF;
END livraisoncom_limit_trigger;
/******************************************/
|----------------------------------------------------------------------------------
-----------------------|
|-------------------------------------| Gestion des Articles
|--------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|
/******************************************/
IF v_article_count = 0 THEN
INSERT INTO Articles (refart, designation, prixA, prixV, codetva, categorie)
VALUES (p_refart, p_designation, p_prixA, p_prixV, p_codetva, p_categorie);
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('Article with refart ' || p_refart || ' already
exists.');
END IF;
END AddArticle;
/******************************************/
PROCEDURE ModifyArticle(
p_refart IN CHAR,
p_designation IN VARCHAR2,
p_prixA IN NUMBER,
p_prixV IN NUMBER,
p_codetva IN NUMBER,
p_categorie IN CHAR
) IS
v_article_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_article_count
FROM Articles
WHERE refart = p_refart;
/******************************************/
/******************************************/
/******************************************/
PROCEDURE SearchArticle(
p_refart IN CHAR DEFAULT NULL,
p_designation IN VARCHAR2 DEFAULT NULL,
p_categorie IN CHAR DEFAULT NULL
) IS
BEGIN
FOR article IN (
SELECT *
FROM Articles
WHERE (refart = p_refart OR p_refart IS NULL)
AND (designation = p_designation OR p_designation IS NULL)
AND (categorie = p_categorie OR p_categorie IS NULL)
AND is_deleted = 'N'
) LOOP
DBMS_OUTPUT.PUT_LINE('Refart: ' || article.refart || ', Designation: ' ||
article.designation || ', PrixA: ' || article.prixA || ', PrixV: ' || article.prixV
|| ', CodeTVA: ' || article.codetva || ', Categorie: ' || article.categorie);
END LOOP;
END SearchArticle;
END ArticleManagement;
|----------------------------------------------------------------------------------
-----------------------|