Resolution d'1 exercice pl/sql
Résolu
7ammouda
Messages postés
10
Statut
Membre
-
imoooo Messages postés 17 Statut Membre -
imoooo Messages postés 17 Statut Membre -
Bonjour,
est ce quelk1 peut me donner une solution pour cet exercice:
Créer un bloc PL/SQL qui détermine les n employés ayant les salaires les plus élevés.
a. La valeur de n est introduite via un paramètre de substitution SQL*PLUS.
b. Récupérez les noms et les salaires des n personnes les mieux rémunérées dans la table EMP
les enregistrer dans une table PL/SQL.
c. Assurez-vous qu'il n'y a aucun couple d'employés ayant le même salaire.
d. Testez les cas particuliers tels que n = 0 et n > au nombre d’employés dans la table EMP.
e. Affichez le contenu de la table PL/SQL à l’écran.
La table EMP est comme suit:
EMPNO(numero de l'employé)
ENAME(le nom de l'employé)
SAl(le salaire)
JOB
MGR(le manager de l'employé)
HIREDATE(date d'embauche)
DEPTNO(numero du departement)
est ce quelk1 peut me donner une solution pour cet exercice:
Créer un bloc PL/SQL qui détermine les n employés ayant les salaires les plus élevés.
a. La valeur de n est introduite via un paramètre de substitution SQL*PLUS.
b. Récupérez les noms et les salaires des n personnes les mieux rémunérées dans la table EMP
les enregistrer dans une table PL/SQL.
c. Assurez-vous qu'il n'y a aucun couple d'employés ayant le même salaire.
d. Testez les cas particuliers tels que n = 0 et n > au nombre d’employés dans la table EMP.
e. Affichez le contenu de la table PL/SQL à l’écran.
La table EMP est comme suit:
EMPNO(numero de l'employé)
ENAME(le nom de l'employé)
SAl(le salaire)
JOB
MGR(le manager de l'employé)
HIREDATE(date d'embauche)
DEPTNO(numero du departement)
A voir également:
- Resolution d'1 exercice pl/sql
- Réduire résolution image - Guide
- Logiciel sql - Télécharger - Bases de données
- Resolution changer pc - Télécharger - Divers Utilitaires
- Problème résolution écran 1920x1080 - Forum Windows 10
- Resolution native - Forum Ecran
9 réponses
Regarde juste un peu plus haut tu as la solution. Si tu ne comprends pas poses des questions au lieu de débilement remettre ta demande -_-
slt 7ammouda, t'inquiéte pas
voici la bonne solution :
SET SERVEROUTPUT ON
ACCEPT p_num PROMPT 'Saisissez le nombre d'employés les mieurs rénumérés:'
DECLARE
v_csal NUMBER;
v_count NUMBER;
v_num NUMBER:=&p_num;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR emp_cursor IS
SELECT ename, sal FROM emp
ORDER BY sal DESC;
TYPE typ_tab_emp IS TABLE OF emp_cursor%ROWTYPE
INDEX BY BINARY_INTEGER;
tab_emp typ_tab_emp;
BEGIN
SELECT COUNT(DISTINCT SAL), COUNT(SAL) INTO v_csal,v_count FROM EMP;
IF v_num=0 OR v_num>v_count THEN
DBMS_OUTPUT.PUT_LINE('Saisie erronée!');
ELSIF v_csal=v_count THEN
OPEN emp_cursor;
FETCH emp_cursor INTO v_ename, v_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND LOOP
tab_emp(emp_cursor%ROWCOUNT).ename:=v_ename;
tab_emp(emp_cursor%ROWCOUNT).sal:=v_sal;
FETCH emp_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE emp_cursor;
FOR cpt IN 1..v_num LOOP
DBMS_OUTPUT.PUT_LINE('Nom: '||tab_emp(cpt).ename||' et sal: '||tab_emp(cpt).sal);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('Il y a des employés qui ont le même salaire!');
END IF;
END;
/
voici la bonne solution :
SET SERVEROUTPUT ON
ACCEPT p_num PROMPT 'Saisissez le nombre d'employés les mieurs rénumérés:'
DECLARE
v_csal NUMBER;
v_count NUMBER;
v_num NUMBER:=&p_num;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR emp_cursor IS
SELECT ename, sal FROM emp
ORDER BY sal DESC;
TYPE typ_tab_emp IS TABLE OF emp_cursor%ROWTYPE
INDEX BY BINARY_INTEGER;
tab_emp typ_tab_emp;
BEGIN
SELECT COUNT(DISTINCT SAL), COUNT(SAL) INTO v_csal,v_count FROM EMP;
IF v_num=0 OR v_num>v_count THEN
DBMS_OUTPUT.PUT_LINE('Saisie erronée!');
ELSIF v_csal=v_count THEN
OPEN emp_cursor;
FETCH emp_cursor INTO v_ename, v_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND LOOP
tab_emp(emp_cursor%ROWCOUNT).ename:=v_ename;
tab_emp(emp_cursor%ROWCOUNT).sal:=v_sal;
FETCH emp_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE emp_cursor;
FOR cpt IN 1..v_num LOOP
DBMS_OUTPUT.PUT_LINE('Nom: '||tab_emp(cpt).ename||' et sal: '||tab_emp(cpt).sal);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('Il y a des employés qui ont le même salaire!');
END IF;
END;
/
creer la table "Messages" avec une seule colonne "Results" de tupe "Number(2)"
ecrivez un bloc PL/SQL pour insérer des nombres dans la table "Messages"
A.insérer les nombres de 1 à 10, en excluant 6 et 8.
B.effectuer une validation "commit" avant la fin du bloc.
C.afficher le contenu de la table "Messages" pour tester votre bloc PL/SQL.
ecrivez un bloc PL/SQL pour insérer des nombres dans la table "Messages"
A.insérer les nombres de 1 à 10, en excluant 6 et 8.
B.effectuer une validation "commit" avant la fin du bloc.
C.afficher le contenu de la table "Messages" pour tester votre bloc PL/SQL.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
comme ça, à première vue, mais je n'ai rien pour tester :
create table messages(results number(2));
declare
i number(2);
begin
for i in 1..10 loop
if i not in (6,8) then
insert into messages values (i);
end if;
end loop;
commit;
end;
/
select * from messages;
Bon pour fêter mon inscription sur le forum et comme je me suis amusé à écrire tout ça,je le poste, même si le sujet est marqué comme résolu.
Alors comme je n'ai pas de noyau Oracle sur place, je n'ai pas testé, même pas la syntaxe, mais ça peut donner une idée; ça devrait quand même pas être trop faux, le PL c'est mon métier, même si je ne manipule pas très souvent certaines notions comme les varray utilisés ici.
Alors comme je n'ai pas de noyau Oracle sur place, je n'ai pas testé, même pas la syntaxe, mais ça peut donner une idée; ça devrait quand même pas être trop faux, le PL c'est mon métier, même si je ne manipule pas très souvent certaines notions comme les varray utilisés ici.
set serveroutput on -- enable dbms_output
define n=5
declare
cursor csr_top_emp is
select ename, sal from emp order by sal desc;
type top_type is varray(&n) of csr_top_emp%ROWTYPE;
top_tab top_type;
top_idx pls_integer;
idx pls_integer;
prev_sal emp.sal%TYPE := -1;
exists_same_sal boolean := FALSE;
ex_n_to_low exception;
begin
top_idx := 0;
if &n <= 0 then
raise ex_n_to_low;
end if;
-- Parcours des employés par salaire décroissant
for csr_rec in csr loop
top_idx := top_idx + 1;
-- Détection salaires identiques
if csr_rec.sal = prev_sal then
exists_same_sal := TRUE;
end if;
prev_sal := csr_rec.sal;
-- collecte des top n
if top_idx <= &n then
top_tab(top_idx) := csr_rec;
end if;
end loop;
-- Affichage de la table des n top salaires
DBMS_OUTPUT.put_line(rpad('Employé', 30)||' '||lpad('Salaire', 12));
DBMS_OUTPUT.put_line(rpad(null, 30, '-')||' '||lpad(null, 12, '-'));
for idx in 1 .. top_idx loop
DBMS_OUTPUT.put_line(rpad(top_tab.ename, 30)||' '||lpad(top_tab.sal, 12));
end loop;
-- Affichage Warning si nombre demandé trop grand
if top_idx <= &n then
DBMS_OUTPUT.put_line('WARNING: Le nombre d''employés est inférieur au nombre demandé');
end if;
-- Affichage Warning si existe salaires identiques
if exists_same_sal = TRUE then
DBMS_OUTPUT.put_line('WARNING: Des employés ont un salaire identique');
end if;
exception
when ex_n_to_low then
DBMS_OUTPUT.put_line('ERROR: Le nombre d''employés demandé ne peut être négatif');
end;
/
Voici un début de réponse :
Ça te donne une bonne base pour continuer ;-)
CREATE OR REPLACE PROCEDURE Top_Employe(n IN NUMBER)
IS
nb_emp NUMBER;
CURSOR c_tab_temp
IS
SELECT ENAME, SAL
FROM tab_temp;
BEGIN
IF n < 0 THEN
DBMS_OUTPUT.put_line('Le nombre d''employé ne peut pas être négatif');
return;
END IF;
SELECT count(ENAME) INTO nb_emp FROM EMP;
IF nb_emp < n THEN
DBMS_OUTPUT.put_line('Le nombre d''employé dans la table est inférieur à ce que vous demandez');
return;
END IF;
INSERT INTO tab_temp
SELECT ENAME, SAL
FROM EMP
WHERE ROWNUM < n;
COMMIT;
--Vérification des salaires identiques
--Affichage des données contenues dans le curseur
END;
/
Ça te donne une bonne base pour continuer ;-)
je veux Créer un bloc PL/SQL qui détermine les n employés ayant les salaires les plus élevés en utilisant un curseur explicite.
a. La valeur de n est introduite via un paramètre de substitution SQL*PLUS.
b. Récupérez les noms et les salaires des n personnes les mieux rémunérées dans la table EMP et
les enregistrer dans une table PL/SQL.
c. Assurez-vous qu'il n'y a aucun couple d'employés ayant le même salaire.
d. Testez les cas particuliers tels que n = 0 et n > au nombre d’employés dans la table EMP.
e. Affichez le contenu de la table PL/SQL à l’écran.
la structure de la table est la suivante
empno (numero emp)
ename (nom)
job
mgr(manager)
sal(salaire)
hiredate(date d'embauche)
deptno(numéro département)
merci d'avance
a. La valeur de n est introduite via un paramètre de substitution SQL*PLUS.
b. Récupérez les noms et les salaires des n personnes les mieux rémunérées dans la table EMP et
les enregistrer dans une table PL/SQL.
c. Assurez-vous qu'il n'y a aucun couple d'employés ayant le même salaire.
d. Testez les cas particuliers tels que n = 0 et n > au nombre d’employés dans la table EMP.
e. Affichez le contenu de la table PL/SQL à l’écran.
la structure de la table est la suivante
empno (numero emp)
ename (nom)
job
mgr(manager)
sal(salaire)
hiredate(date d'embauche)
deptno(numéro département)
merci d'avance