Database Operations Examples

1/1
100%

Table emp

![](data:image/x-emf;base64...)

Table dept

![](data:image/x-emf;base64...)

\\\\ Effacer un département donné

set serveroutput on

VARIABLE g\_result VARCHAR2(50);

ACCEPT p\_deptno PROMPT ‘Donner le numéro du département :';

DECLARE

v\_result NUMBER(2) ;

BEGIN

DELETE

FROM dept

WHERE deptno = &p\_deptno;

dbms\_output.put\_line(' la suppression de '||Sql%rowcount||' enregsitrement(s)');

v\_result := SQL%rowcount;

:g\_result := (TO\_CHAR (v\_result) || ' enregistrement(s) supprimé(s)') ;

IF SQL%NOTFOUND Then

dbms\_output.put\_line('aucun enregistrement n’’a été trouvé ');

END IF;

END ;

/

PRAGMA EXCEPTION\_INIT

set serveroutput on

DECLARE

emp\_exist EXCEPTION;

PRAGMA EXCEPTION\_INIT (emp\_exist,-2292);

v\_deptno dept.deptno%TYPE := 20;

BEGIN

DELETE

FROM dept

WHERE deptno = v\_deptno;

COMMIT;

EXCEPTION

WHEN emp\_exist THEN

DBMS\_OUTPUT.PUT\_LINE('Suppression Impossible du dept: '||TO\_CHAR(v\_deptno)|| 'Employés existants ');

END;

/

--- MODIFIER LE SALAIRE D’UN EMPLOYE DE NOM DONNE

SET SERVEROUTPUT ON;

ACCEPT nom PROMPT 'donner le nom de l''employè : ';

DECLARE

nomemp emp.ename%type:='&nom';

OK exception;

Non\_trouve exception;

BEGIN

Update emp

SET sal = 200

Where ename = nomemp; ----- where ename='&nom';

IF SQL%NOTFOUND then

Raise non\_trouve;

else Raise ok;

END IF;

Exception

When non\_trouve then

DBMS\_OUTPUT.PUT\_LINE ('employé non trouvé ! ! ! ');

When OK then

DBMS\_OUTPUT.PUT\_LINE('MODIFICATION FAITE’);

END;

/

Afficher les employés CLERK du département 20, suivis de leurs nombres, et ensuite faire la même chose pour les SALESMAN du département 30.

DECLARE

CURSOR emp\_cursor (p\_job VARCHAR2(30),

p\_deptno NUMBER)

IS

SELECT empno, ename

FROM emp

Publicité

WHERE job = p\_job AND deptno = p\_deptno;

emp\_record emp\_cursor%ROWTYPE;

BEGIN

OPEN emp\_cursor (‘CLERK’,20);

LOOP

FETCH emp\_cursor INTO emp\_record;

EXIT WHEN emp\_cursor%NOTFOUND;

DBMS\_OUTPUT.PUT\_LINE(emp\_record.empno||’ ‘||emp\_record.ename);

END LOOP;

DBMS\_OUTPUT.PUT\_LINE(‘Nombred’’ employés: ’||emp\_cursor%ROWCOUNT);

CLOSE emp\_cursor;

OPEN emp\_cursor(‘SALESMAN’,30);

…………………………………………………………………...

END;

/

DECLARE

CURSOR emp\_cursor IS

SELECT ename, sal, deptno

FROM emp

WHERE deptno=20

FOR UPDATE OF sal NOWAIT;

BEGIN

FOR emp\_rec IN emp\_cursor

LOOP

IF emp\_rec.sal<2000 THEN

DBMS\_OUTPUT.PUT\_LINE(emp\_rec.ename||’

‘||emp\_rec.sal);

UPDATE emp

SET sal=sal\*1.1

WHERE CURRENT OF emp\_cursor;

END IF;

END LOOP;

COMMIT;

END;

/

-- Insérer dans une table pour chaque responsable la liste de ses employés

Drop table messages;

create table messages (msg varchar2(100));

set serveroutput on

DECLARE

CURSOR C1 IS select DISTINCT (mgr) from emp order by mgr ;

CURSOR C2 (v\_mgr number) IS

Select empno from emp

where mgr = v\_mgr

order by mgr;

v\_resp c1%rowtype ;

v\_emp c2%rowtype ;

BEGIN

OPEN C1 ;

LOOP

FETCH C1 INTO v\_resp;

EXIT when C1%NOTFOUND;

IF v\_resp.mgr IS not null THEN

INSERT Into messages Values ('responsable: '|| v\_resp.mgr);

End if; ???????????????????????

IF C2%ISOPEN THEN

close C2;

END IF;

OPEN C2 (v\_resp.mgr);

Loop

FETCH C2 into v\_emp;

exit when C2%NOTFOUND;

INSERT into messages values (' employé : '||v\_emp.empno);

EndLoop;

Close C2;

END LOOP;

Close C1;

Publicité

END;

/

Question : Insérer dans une table Resultat pour chaque département les noms de ses employés.

DECLARE

Cursor v\_cursor1 IS

SELECT deptno, dname

FROM dept;

v\_record1 v\_cursor1%rowtype;

CURSOR v\_cursor2 (v\_deptno dept.deptno%type) IS

SELECT ename

FROM emp

WHERE deptno = v\_deptno;

v\_record2 v\_cursor2%rowtype;

v\_msg varchar2(100):= ' ';

BEGIN

OPEN v\_cursor1;

loop

FETCH v\_cursor1 INTO v\_record1;

open v\_cursor2(v\_record1.deptno);

loop

FETCH v\_cursor2 INTO v\_record2;

EXIT when v\_cursor2%NOTFOUND ;

v\_msg := v\_msg || v\_record2.ename || ', ';

end loop; ----- boucle interne -----

EXIT when v\_cursor1%NOTFOUND ;

INSERT into resultat

Values (v\_record1.deptno, v\_record1.dname,v\_msg);

close v\_cursor2; ---- curseur des employés ---

v\_msg := '';

end loop; \\\\ boucle externe\\\\*\

close v\_cursor1; --- curseur des départments ----

COMMIT;

END;

/

-- Insérer dans une table pour chaque département la liste de ses employés

DROP table messages;

create table messages (msg varchar2(100));

set serveroutput on

DECLARE

CURSOR C1 IS SELECT DISTINCT (deptno) from emp

order by deptno;

CURSOR C2 (v\_deptno number) IS

SELECT empno, ename

FROM emp

WHERE deptno= v\_deptno;

v\_dept C1%rowtype ;

v\_emp C2%rowtype ;

BEGIN

OPEN C1 ;

LOOP

FETCH C1 INTO v\_dept;

EXIT When C1%NOTFOUND;

INSERT INTO messages Values ('département numéro: '|| v\_dept.deptno);

IF C2%ISOPEN THEN

Close C2;

END IF;

OPEN C2 (v\_dept.deptno);

Loop

FETCH C2 INTO v\_emp;

EXIT When C2%NOTFOUND;

INSERT into messages

values (' l’’employé '||v\_emp.empno||' '||v\_emp.ename);

End Loop;

Close C2;

END LOOP;

Close C1;

END;

Publicité

/

Revenu des employés ayant une commission et appartenant au même département d’un employé donné

create or replace function total\_revenu

(numemp in emp.empno%type) return NUMBER

IS

total number:=0;

CURSOR emp\_cursor IS

SELECT sal, comm

FROM emp

WHERE deptno = (SELECT deptno

FROM emp

WHERE empno=numemp)

and comm is not null;

TYPE emp\_record\_type IS RECORD

(com emp.comm%type,

Salaire emp.sal%type

);

emp\_record emp\_record\_type;

BEGIN

OPEN emp\_cursor;

loop

FETCH emp\_cursor INTO emp\_record;

EXIT when emp\_cursor%notfound;

total:=total+(emp\_record.salaire+emp\_record.com);

end loop;

CLOSE emp\_cursor;

return(total);

END;

/

EXECUTION

SQL> VARIABLE x number

SQL> execute :X:=total\_revenu(7369);

Procédure PL/SQL terminée avec succès.

SQL> PRINT X

X

----------

5950

Ecrire une procédure Afficher\_tables qui donne le nom de toutes vos tables

set serveroutput on

create or replace procedure AFFICHER\_tables

IS

CURSOR afficher\_nom IS

Select table\_name

From user\_tables;

BEGIN

dbms\_output.put\_line(' Nom des tables : ');

FOR nom IN afficher\_nom

LOOP

dbms\_output.put\_line( nom.table\_name);

END LOOP;

END;

/

EXECUTE afficher\_tables;

Ex3 : Ecrire une procédure pour afficher le nom, le salaire et la commission d’un employé donné.

CREATE OR REPLACEPROCEDURE Interr\_emp(

v\_id IN emp.empno%TYPE,

v\_name OUT emp.ename%TYPE,

v\_salary OUT emp.sal%TYPE,

v\_comm OUT emp.comm%TYPE)

IS

BEGIN

SELECT ename, sal, comm

INTO v\_name, v\_salary, v\_comm

FROM emp

WHERE empno = v\_id;

END Interr\_emp;

/

Publicité

EX4 : Ecrire une procédure pour afficher le nom et la ville d’un département donné.

set serveroutput on

set verify off

CREATE or REPLACE procedure TEST (n IN dept.deptno%type ,

nom OUT dept.dname%type,

ville OUT dept.loc%type)

IS

BEGIN

SELECT dname, loc INTO nom, ville

FROM dept

WHERE deptno = n;

END;

/

\\\ Programme principal \\\**

ACCEPT numero prompt 'donner le numéro du dept ';

DECLARE

dnom dept.dname%type;

dville dept.loc%type;

BEGIN

TEST (&numero, dnom,dville);

dbms\_output.put\_line('le nom du département est: ' ||dnom||’situé à ;’||dville);

END;

/

Ex5 : Ecrire une procédure pour afficher le lieu de travail d’un employé de nom donné (supposé unique).

set serveroutput on;

create or replace procedure emp\_lieu(

empname IN emp.ename%type)

IS

lieu\_travail dept.dname%type;

BEGIN

SELECT dname into lieu\_travail

FROM dept

WHERE deptno IN (select deptno

from emp

where emp.ename = empname);

dbms\_output.put\_line(empname||' travaille à ‘|| lieu\_travail);

END;

/

Ex6 : les employés qui travaillent avec un employé donné

set serveroutput on

create or replace PROCEDURE ENSEMBLES (

empnum IN emp.empno%type )

IS

CURSOR C\_ENS IS

SELECT ename

FROM emp

WHERE deptno = ( SELECT deptno

FROM emp

WHERE empno=empnum );

rec C\_ENS%rowtype ;

nom\_emp emp.ename%type;

BEGIN

SELECT ename INTO nom\_emp

FROM emp

WHERE empno = empnum;

dbms\_output.put\_line('les employés qui travaillent avec l’’employé ‘||nom\_emp || ' sont : ');

FOR rec IN C\_ENS

Loop

IF rec.ename != nom\_emp THEN

DBMS\_OUTPUT.PUT\_LINE(rec.ename);

END IF;

endloop;

END ;

/

Database Operations Examples

Programming, SQL, PL/SQL · lab

Voir tous les documents en bases de données

Table emp

![](data:image/x-emf;base64...)

Table dept

![](data:image/x-emf;base64...)

\\\\ Effacer un département donné

set serveroutput on

VARIABLE g\_result VARCHAR2(50);

ACCEPT p\_deptno PROMPT ‘Donner le numéro du département :';

DECLARE

v\_result NUMBER(2) ;

BEGIN

DELETE

FROM dept

WHERE deptno = &p\_deptno;

dbms\_output.put\_line(' la suppression de '||Sql%rowcount||' enregsitrement(s)');

v\_result := SQL%rowcount;

:g\_result := (TO\_CHAR (v\_result) || ' enregistrement(s) supprimé(s)') ;

IF SQL%NOTFOUND Then

dbms\_output.put\_line('aucun enregistrement n’’a été trouvé ');

END IF;

END ;

/

PRAGMA EXCEPTION\_INIT

set serveroutput on

DECLARE

emp\_exist EXCEPTION;

PRAGMA EXCEPTION\_INIT (emp\_exist,-2292);

v\_deptno dept.deptno%TYPE := 20;

BEGIN

DELETE

FROM dept

WHERE deptno = v\_deptno;

COMMIT;

EXCEPTION

WHEN emp\_exist THEN

DBMS\_OUTPUT.PUT\_LINE('Suppression Impossible du dept: '||TO\_CHAR(v\_deptno)|| 'Employés existants ');

END;

/

--- MODIFIER LE SALAIRE D’UN EMPLOYE DE NOM DONNE

SET SERVEROUTPUT ON;

ACCEPT nom PROMPT 'donner le nom de l''employè : ';

DECLARE

nomemp emp.ename%type:='&nom';

OK exception;

Non\_trouve exception;

BEGIN

Update emp

SET sal = 200

Where ename = nomemp; ----- where ename='&nom';

IF SQL%NOTFOUND then

Raise non\_trouve;

else Raise ok;

END IF;

Exception

When non\_trouve then

DBMS\_OUTPUT.PUT\_LINE ('employé non trouvé ! ! ! ');

When OK then

DBMS\_OUTPUT.PUT\_LINE('MODIFICATION FAITE’);

END;

/

Afficher les employés CLERK du département 20, suivis de leurs nombres, et ensuite faire la même chose pour les SALESMAN du département 30.

DECLARE

CURSOR emp\_cursor (p\_job VARCHAR2(30),

p\_deptno NUMBER)

IS

SELECT empno, ename

FROM emp

Publicité

WHERE job = p\_job AND deptno = p\_deptno;

emp\_record emp\_cursor%ROWTYPE;

BEGIN

OPEN emp\_cursor (‘CLERK’,20);

LOOP

FETCH emp\_cursor INTO emp\_record;

EXIT WHEN emp\_cursor%NOTFOUND;

DBMS\_OUTPUT.PUT\_LINE(emp\_record.empno||’ ‘||emp\_record.ename);

END LOOP;

DBMS\_OUTPUT.PUT\_LINE(‘Nombred’’ employés: ’||emp\_cursor%ROWCOUNT);

CLOSE emp\_cursor;

OPEN emp\_cursor(‘SALESMAN’,30);

…………………………………………………………………...

END;

/

DECLARE

CURSOR emp\_cursor IS

SELECT ename, sal, deptno

FROM emp

WHERE deptno=20

FOR UPDATE OF sal NOWAIT;

BEGIN

FOR emp\_rec IN emp\_cursor

LOOP

IF emp\_rec.sal<2000 THEN

DBMS\_OUTPUT.PUT\_LINE(emp\_rec.ename||’

‘||emp\_rec.sal);

UPDATE emp

SET sal=sal\*1.1

WHERE CURRENT OF emp\_cursor;

END IF;

END LOOP;

COMMIT;

END;

/

-- Insérer dans une table pour chaque responsable la liste de ses employés

Drop table messages;

create table messages (msg varchar2(100));

set serveroutput on

DECLARE

CURSOR C1 IS select DISTINCT (mgr) from emp order by mgr ;

CURSOR C2 (v\_mgr number) IS

Select empno from emp

where mgr = v\_mgr

order by mgr;

v\_resp c1%rowtype ;

v\_emp c2%rowtype ;

BEGIN

OPEN C1 ;

LOOP

FETCH C1 INTO v\_resp;

EXIT when C1%NOTFOUND;

IF v\_resp.mgr IS not null THEN

INSERT Into messages Values ('responsable: '|| v\_resp.mgr);

End if; ???????????????????????

IF C2%ISOPEN THEN

close C2;

END IF;

OPEN C2 (v\_resp.mgr);

Loop

FETCH C2 into v\_emp;

exit when C2%NOTFOUND;

INSERT into messages values (' employé : '||v\_emp.empno);

EndLoop;

Close C2;

END LOOP;

Close C1;

Publicité

END;

/

Question : Insérer dans une table Resultat pour chaque département les noms de ses employés.

DECLARE

Cursor v\_cursor1 IS

SELECT deptno, dname

FROM dept;

v\_record1 v\_cursor1%rowtype;

CURSOR v\_cursor2 (v\_deptno dept.deptno%type) IS

SELECT ename

FROM emp

WHERE deptno = v\_deptno;

v\_record2 v\_cursor2%rowtype;

v\_msg varchar2(100):= ' ';

BEGIN

OPEN v\_cursor1;

loop

FETCH v\_cursor1 INTO v\_record1;

open v\_cursor2(v\_record1.deptno);

loop

FETCH v\_cursor2 INTO v\_record2;

EXIT when v\_cursor2%NOTFOUND ;

v\_msg := v\_msg || v\_record2.ename || ', ';

end loop; ----- boucle interne -----

EXIT when v\_cursor1%NOTFOUND ;

INSERT into resultat

Values (v\_record1.deptno, v\_record1.dname,v\_msg);

close v\_cursor2; ---- curseur des employés ---

v\_msg := '';

end loop; \\\\ boucle externe\\\\*\

close v\_cursor1; --- curseur des départments ----

COMMIT;

END;

/

-- Insérer dans une table pour chaque département la liste de ses employés

DROP table messages;

create table messages (msg varchar2(100));

set serveroutput on

DECLARE

CURSOR C1 IS SELECT DISTINCT (deptno) from emp

order by deptno;

CURSOR C2 (v\_deptno number) IS

SELECT empno, ename

FROM emp

WHERE deptno= v\_deptno;

v\_dept C1%rowtype ;

v\_emp C2%rowtype ;

BEGIN

OPEN C1 ;

LOOP

FETCH C1 INTO v\_dept;

EXIT When C1%NOTFOUND;

INSERT INTO messages Values ('département numéro: '|| v\_dept.deptno);

IF C2%ISOPEN THEN

Close C2;

END IF;

OPEN C2 (v\_dept.deptno);

Loop

FETCH C2 INTO v\_emp;

EXIT When C2%NOTFOUND;

INSERT into messages

values (' l’’employé '||v\_emp.empno||' '||v\_emp.ename);

End Loop;

Close C2;

END LOOP;

Close C1;

END;

Publicité

/

Revenu des employés ayant une commission et appartenant au même département d’un employé donné

create or replace function total\_revenu

(numemp in emp.empno%type) return NUMBER

IS

total number:=0;

CURSOR emp\_cursor IS

SELECT sal, comm

FROM emp

WHERE deptno = (SELECT deptno

FROM emp

WHERE empno=numemp)

and comm is not null;

TYPE emp\_record\_type IS RECORD

(com emp.comm%type,

Salaire emp.sal%type

);

emp\_record emp\_record\_type;

BEGIN

OPEN emp\_cursor;

loop

FETCH emp\_cursor INTO emp\_record;

EXIT when emp\_cursor%notfound;

total:=total+(emp\_record.salaire+emp\_record.com);

end loop;

CLOSE emp\_cursor;

return(total);

END;

/

EXECUTION

SQL> VARIABLE x number

SQL> execute :X:=total\_revenu(7369);

Procédure PL/SQL terminée avec succès.

SQL> PRINT X

X

----------

5950

Ecrire une procédure Afficher\_tables qui donne le nom de toutes vos tables

set serveroutput on

create or replace procedure AFFICHER\_tables

IS

CURSOR afficher\_nom IS

Select table\_name

From user\_tables;

BEGIN

dbms\_output.put\_line(' Nom des tables : ');

FOR nom IN afficher\_nom

LOOP

dbms\_output.put\_line( nom.table\_name);

END LOOP;

END;

/

EXECUTE afficher\_tables;

Ex3 : Ecrire une procédure pour afficher le nom, le salaire et la commission d’un employé donné.

CREATE OR REPLACEPROCEDURE Interr\_emp(

v\_id IN emp.empno%TYPE,

v\_name OUT emp.ename%TYPE,

v\_salary OUT emp.sal%TYPE,

v\_comm OUT emp.comm%TYPE)

IS

BEGIN

SELECT ename, sal, comm

INTO v\_name, v\_salary, v\_comm

FROM emp

WHERE empno = v\_id;

END Interr\_emp;

/

Publicité

EX4 : Ecrire une procédure pour afficher le nom et la ville d’un département donné.

set serveroutput on

set verify off

CREATE or REPLACE procedure TEST (n IN dept.deptno%type ,

nom OUT dept.dname%type,

ville OUT dept.loc%type)

IS

BEGIN

SELECT dname, loc INTO nom, ville

FROM dept

WHERE deptno = n;

END;

/

\\\ Programme principal \\\**

ACCEPT numero prompt 'donner le numéro du dept ';

DECLARE

dnom dept.dname%type;

dville dept.loc%type;

BEGIN

TEST (&numero, dnom,dville);

dbms\_output.put\_line('le nom du département est: ' ||dnom||’situé à ;’||dville);

END;

/

Ex5 : Ecrire une procédure pour afficher le lieu de travail d’un employé de nom donné (supposé unique).

set serveroutput on;

create or replace procedure emp\_lieu(

empname IN emp.ename%type)

IS

lieu\_travail dept.dname%type;

BEGIN

SELECT dname into lieu\_travail

FROM dept

WHERE deptno IN (select deptno

from emp

where emp.ename = empname);

dbms\_output.put\_line(empname||' travaille à ‘|| lieu\_travail);

END;

/

Ex6 : les employés qui travaillent avec un employé donné

set serveroutput on

create or replace PROCEDURE ENSEMBLES (

empnum IN emp.empno%type )

IS

CURSOR C\_ENS IS

SELECT ename

FROM emp

WHERE deptno = ( SELECT deptno

FROM emp

WHERE empno=empnum );

rec C\_ENS%rowtype ;

nom\_emp emp.ename%type;

BEGIN

SELECT ename INTO nom\_emp

FROM emp

WHERE empno = empnum;

dbms\_output.put\_line('les employés qui travaillent avec l’’employé ‘||nom\_emp || ' sont : ');

FOR rec IN C\_ENS

Loop

IF rec.ename != nom\_emp THEN

DBMS\_OUTPUT.PUT\_LINE(rec.ename);

END IF;

endloop;

END ;

/