0% found this document useful (0 votes)
13 views10 pages

SGBD Projet

The document creates several database tables to model business entities like articles, clients, orders etc. It defines primary keys, foreign keys, constraints and indexes on the tables. Sample data is then inserted into the tables using sequences to generate primary key values. Procedures are also defined to manage commands.

Uploaded by

zenkriiheb
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views10 pages

SGBD Projet

The document creates several database tables to model business entities like articles, clients, orders etc. It defines primary keys, foreign keys, constraints and indexes on the tables. Sample data is then inserted into the tables using sequences to generate primary key values. Procedures are also defined to manage commands.

Uploaded by

zenkriiheb
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 10

|-------------------------| Creation de Tableaux et leur Constraint

|---------------------------------|
|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE articles (


refart CHAR(4) PRIMARY KEY,
designation VARCHAR2(30) NOT NULL,
prixA NUMBER(8,2) NOT NULL,
prixV NUMBER(8,2) NOT NULL,
codetva NUMBER(1) NOT NULL,
categorie CHAR(10),
qtestk NUMBER(5) NOT NULL,
CONSTRAINT articles_price_check CHECK (prixV > prixA),
CONSTRAINT articles_unique_article UNIQUE (designation)
);

|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE clients (


noclt NUMBER(4) CONSTRAINT clients_pk PRIMARY KEY,
nomclt VARCHAR2(30) NOT NULL,
prenomclt VARCHAR2(30) NULL,
adrclt VARCHAR2(60) NOT NULL,
code_postal NUMBER(5) NOT NULL,
villeclt CHAR(30) NOT NULL,
telclt NUMBER(8) NOT NULL,
CONSTRAINT clients_name_format CHECK (REGEXP_LIKE(nomclt, '^[A-Za-z0-9 ]+$')),
CONSTRAINT clients_phone_number_format CHECK (REGEXP_LIKE(telclt, '^[0-9]
{8}$')),
CONSTRAINT clients_unique_client UNIQUE (nomclt, prenomclt)
);

|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE commandes (


nocde NUMBER(6),
noclt NUMBER(4) NOT NULL,
datecde DATE DEFAULT SYSDATE NOT NULL,
etatcde CHAR(2) DEFAULT 'EC' NOT NULL,
CONSTRAINT pk_commandes PRIMARY KEY (nocde),
CONSTRAINT fk_commandes_clients FOREIGN KEY (noclt) REFERENCES clients (noclt),

CONSTRAINT ck_commandes_etat CHECK (etatcde IN ('EC', 'PR', 'LI', 'SO', 'AN',


'AL'))
);

|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE ligcdes (


nocde NUMBER(6),
nolig NUMBER(2),
refart CHAR(4) NOT NULL,
qtecde NUMBER(5) NOT NULL,
CONSTRAINT ck_ligcdes_nolig CHECK (nolig > 0),
CONSTRAINT fk_ligcdes_commandes FOREIGN KEY (nocde) REFERENCES commandes
(nocde),
CONSTRAINT fk_ligcdes_articles FOREIGN KEY (refart) REFERENCES articles
(refart),
CONSTRAINT pk_ligcdes PRIMARY KEY (nocde, nolig)
);

|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE Postes (


codeposte VARCHAR2(10) CONSTRAINT poste_pk PRIMARY KEY,
libelle VARCHAR2(30) NOT NULL,
indice NUMBER(2) NOT NULL
);

|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE Personnel (


idpers NUMBER(4) CONSTRAINT personnel_pk PRIMARY KEY,
nompers VARCHAR2(30) NOT NULL,
prenompers VARCHAR2(30) NOT NULL,
adrpers VARCHAR2(60) NOT NULL,
villepers VARCHAR2(30) NOT NULL,
telpers NUMBER(8) NOT NULL,
d_embauche DATE NOT NULL,
login VARCHAR2(30) UNIQUE NOT NULL,
motP CHAR(8) NULL,
codeposte VARCHAR2(10) NOT NULL,
CONSTRAINT fk_personnel_poste FOREIGN KEY (codeposte) REFERENCES postes
(codeposte),
CONSTRAINT personnel_login_not_null CHECK (login IS NOT NULL),
CONSTRAINT personnel_phone_number_format CHECK (REGEXP_LIKE(telpers, '^[0-9]
{8}$'))
);

|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE LivraisonCom (


nocde NUMBER(6) NOT NULL,
dateliv DATE NOT NULL,
livreur NUMBER(6) NOT NULL,
modepay CHAR(15) NOT NULL,
etatcdel CHAR(2) NOT NULL,

CONSTRAINT fk_Livraison_com1 FOREIGN KEY (nocde) REFERENCES commandes (nocde),


CONSTRAINT fk_livraison_com2 FOREIGN KEY (livreur) REFERENCES personnel
(idpers),
CONSTRAINT ck_livraison_com CHECK (modepay IN ('avant_livraison',
'apres_livraison')),
CONSTRAINT pk_livraison_com PRIMARY KEY (nocde, dateliv),
CONSTRAINT ck_livraison_com_etat CHECK (etatcdel IN ('EC', 'LI', 'AL')),
CONSTRAINT ck_livraisoncom_max CHECK (livreur <= 15)
);
--Trigger pour la contarint de date_temps--
CREATE OR REPLACE TRIGGER livraisoncom_time_trigger
BEFORE INSERT ON LivraisonCom
FOR EACH ROW
DECLARE
current_hour NUMBER;
BEGIN
current_hour := TO_NUMBER(TO_CHAR(SYSDATE, 'HH24'));

IF :NEW.modepay = 'avant_livraison' AND current_hour >= 9 THEN


RAISE_APPLICATION_ERROR(-20001, 'Livraison avant 9h non autorisée.');
ELSIF :NEW.modepay = 'apres_livraison' AND current_hour >= 14 THEN
RAISE_APPLICATION_ERROR(-20002, 'Livraison après 14h non autorisée.');
END IF;
END;

|----------------------------------------------------------------------------------
-----------------------|

CREATE TABLE HCommandesAnnulees (


nocde NUMBER(6) CONSTRAINT hcommandesannulees_nocde_fk REFERENCES
commandes(nocde),
numclt NUMBER(4) CONSTRAINT hcommandesannulees_numclt_fk REFERENCES
clients(noclt),
nbrart NUMBER(5) NOT NULL,
montantc NUMBER(8, 2) NOT NULL,
datecde DATE NOT NULL,
dateAnnulation DATE NOT NULL,
code_postal NUMBER(5) NOT NULL,
AvantLiv NUMBER(1) NOT NULL CHECK (AvantLiv IN (0, 1)),
CONSTRAINT pk_hcommandesannulees PRIMARY KEY (nocde, numclt)
);

|----------------------------------------------------------------------------------
-----------------------|
|-----------------------------| Les Sequences des Tableaux
|----------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|

CREATE SEQUENCE articles_seq START WITH 1 INCREMENT BY 1;


CREATE SEQUENCE clients_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE commandes_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE ligcdes_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE livraisoncom_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE personnel_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE poste_seq START WITH 1 INCREMENT BY 1;

|----------------------------------------------------------------------------------
-----------------------|
|-----------------------------| L'indexation des Tableaux
|-----------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|

CREATE INDEX idx_articles_designation ON Articles(designation);


CREATE INDEX idx_clients_nomclt ON Clients(nomclt);
CREATE INDEX idx_commandes_etat ON Commandes(etatcde);
CREATE INDEX idx_ligcdes_refart ON LigCdes(refart);
CREATE INDEX idx_livraisoncom_etatcdel ON LivraisonCom(etatcdel);
CREATE INDEX idx_livraisoncom_modepay ON LivraisonCom(modepay);
CREATE INDEX idx_personnel_nompers ON Personnel(nompers);
CREATE INDEX idx_postes_libelle ON Postes(libelle);
|----------------------------------------------------------------------------------
-----------------------|
|--------------------------| L'isertion de donnees dans les Tableaux
|------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|

INSERT INTO Articles (refart, designation, prixA, prixV, codetva, categorie,


qtestk)
VALUES (articles_seq.NEXTVAL, 'Téléviseur HD', 499.99, 699.99, 1, 'Électronique',
50);

|----------------------------------------------------------------------------------
-----------------------|

INSERT INTO Clients (noclt, nomclt, prenomclt, adrclt, code_postal, villeclt,


telclt)
VALUES (clients_seq.NEXTVAL, 'Ben Ali', 'Mohamed', 'Avenue Habib Bourguiba', 1000,
'Tunis', 12345678);

|----------------------------------------------------------------------------------
-----------------------|

INSERT INTO Commandes (nocde, noclt, datecde, etatcde)


VALUES (commandes_seq.NEXTVAL, 1, SYSDATE, 'EC');

|----------------------------------------------------------------------------------
-----------------------|

INSERT INTO LigCdes (nocde, nolig, refart, qtecde)


VALUES ((SELECT nocde FROM Commandes WHERE etatcde = 'EC'), 1,(SELECT refart FROM
Articles
WHERE designation = 'Téléviseur HD'), 5);

|----------------------------------------------------------------------------------
-----------------------|

INSERT INTO Postes (codeposte, libelle, indice)


VALUES ('001', 'Magasinier', 1);
INSERT INTO Postes (codeposte, libelle, indice)
VALUES ('LIVR', 'Livreur', 1);

|----------------------------------------------------------------------------------
-----------------------|

INSERT INTO Personnel (idpers, nompers, prenompers, adrpers, villepers, telpers,


d_embauche, login, motP, codeposte)
VALUES (personnel_seq.NEXTVAL, 'Mabrouk', 'Ahmed', 'Rue de la Liberté', 'Sousse',
98765432, SYSDATE, 'amabrouk', '12345', '001');
INSERT INTO Personnel (idpers, nompers, prenompers, adrpers, villepers, telpers,
d_embauche, login, motP, codeposte)
VALUES (personnel_seq.NEXTVAL,'Traouli','Ahmed', 123 Livraison St', 'Tunis',
12345678, CURRENT_DATE, 'ahmed',
'0000', 'LIVR');

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

IF v_current_state = 'EC' AND p_new_state IN ('PR', 'LI', 'SO') THEN


UPDATE commandes SET etatcde = p_new_state WHERE nocde = p_nocde;
ELSIF v_current_state = 'EC' AND p_new_state = 'AN' THEN
UPDATE commandes SET etatcde = p_new_state WHERE nocde = p_nocde;
ELSIF v_current_state = 'PR' AND p_new_state = 'AN' THEN
UPDATE commandes SET etatcde = p_new_state WHERE nocde = p_nocde;
ELSIF v_current_state = 'PR' AND p_new_state = 'AL' THEN
UPDATE commandes SET etatcde = p_new_state WHERE nocde = p_nocde;
ELSE
NULL;
END IF;
END modify_command_state;
/******************************************/
PROCEDURE cancel_command(p_nocde NUMBER) IS
BEGIN
UPDATE commandes SET etatcde = 'AN' WHERE nocde = p_nocde;
END cancel_command;
/******************************************/
PROCEDURE search_command(p_nocde NUMBER DEFAULT NULL, p_noclt NUMBER DEFAULT
NULL, p_datecde DATE DEFAULT NULL) IS
v_result commandes%ROWTYPE;
BEGIN
IF p_nocde IS NOT NULL THEN
SELECT * INTO v_result FROM commandes WHERE nocde = p_nocde;
ELSIF p_noclt IS NOT NULL THEN
SELECT * INTO v_result FROM commandes WHERE noclt = p_noclt;
ELSIF p_datecde IS NOT NULL THEN
SELECT * INTO v_result FROM commandes WHERE datecde = p_datecde;
ELSE
RETURN;
END IF;
DBMS_OUTPUT.PUT_LINE('Result: ' || v_result.nocde || ', ' || v_result.noclt ||
', ' || v_result.datecde || ', ' || v_result.etatcde);
END search_command;
END PKG_COMMAND_MANAGEMENT;

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

--Trigger pour La mis à jour de la livraison


CREATE OR REPLACE TRIGGER livraisoncom_time_trigger
BEFORE INSERT OR UPDATE ON LivraisonCom
FOR EACH ROW
DECLARE
v_current_hour NUMBER;
BEGIN
SELECT TO_NUMBER(TO_CHAR(SYSDATE, 'HH24'))
INTO v_current_hour
FROM dual;
IF (v_current_hour >= 9 AND :NEW.modepay = 'avant_livraison') OR
(v_current_hour >= 14 AND :NEW.modepay = 'apres_livraison') THEN
NULL; -- Allow the update
ELSE
RAISE_APPLICATION_ERROR(-20002, 'La mise à jour de la livraison doit être
effectuée avant 9h ou avant 14h.');
END IF;
END livraisoncom_time_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
|--------------------------------------------|
|----------------------------------------------------------------------------------
-----------------------|

create or replace PACKAGE ArticleManagement AS


PROCEDURE AddArticle(
p_refart IN CHAR,
p_designation IN VARCHAR2,
p_prixA IN NUMBER,
p_prixV IN NUMBER,
p_codetva IN NUMBER,
p_categorie IN CHAR
);
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
);
PROCEDURE DeleteArticleLogical(p_refart IN CHAR);
PROCEDURE DeleteArticlePhysical(p_refart IN CHAR);
PROCEDURE SearchArticle(
p_refart IN CHAR DEFAULT NULL,
p_designation IN VARCHAR2 DEFAULT NULL,
p_categorie IN CHAR DEFAULT NULL
);
END ArticleManagement;

/******************************************/

create or replace PACKAGE BODY ArticleManagement AS


PROCEDURE AddArticle(
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;

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;

IF v_article_count > 0 THEN


IF p_prixV > p_prixA THEN
UPDATE Articles
SET designation = p_designation,
prixA = p_prixA,
prixV = p_prixV,
codetva = p_codetva,
categorie = p_categorie
WHERE refart = p_refart;
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('Error: prixV must be greater than prixA.');
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE('Article with refart ' || p_refart || ' does not
exist.');
END IF;
END ModifyArticle;

/******************************************/

PROCEDURE DeleteArticleLogical(p_refart IN CHAR) IS


BEGIN
UPDATE Articles
SET is_deleted = p_refart
WHERE refart = p_refart AND is_deleted = 'N';
COMMIT;
END DeleteArticleLogical;

/******************************************/

PROCEDURE DeleteArticlePhysical(p_refart IN CHAR) IS


BEGIN
DELETE FROM Articles
WHERE refart = p_refart AND is_deleted = 'N';
COMMIT;
END DeleteArticlePhysical;

/******************************************/

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;

|----------------------------------------------------------------------------------
-----------------------|

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy