{Oracle} script procédure

oliv -  
chuka Messages postés 980 Statut Membre -
Bonjour,

pouvez-vous m'aider à effectuer la procédure pour écrire à l'écran ensemble des heures où une personne est à deux endroits à la fois.

MERCI D'AVANCE
Configuration: Windows XP
Firefox 3.0.11

12 réponses

  1. oliv
     
    ce n'est pas une histoire de loggin lol voici les tables

    Choix : id_o,id_p
    Cours : id, ue, promo, options
    Etudiant : id, nom, prenom, promo, options
    Options : id, intitule
    Promo : id, intitule
    UE : id, intitule, nbr

    On rajoute les tables suivantes :

    Salles : id, nom, type
    type peut valoir : C (pour cours), TD ou TP.

    Profs : id, nom, prenom

    Horaire : id, heure_debut, heure_fin

    EdT : id, salle, promo, options, ue, prof, type, horaire, jour,
    Id est l’identifiant, salle, promo, options, ue prof, horaire sont des clefs étrangères sur les tables salles, promo, options, ue, profs et horaire. Jour peut valoir lundi, mardi, …, dimanche, Type peut valoir C, TD ou TP.

    VOICI CE QUE JE DOIS FAIRE
    - Une procédure qui écrit à l’écran l’ensemble des horaires où un profs est à deux endroits à la fois.
    1
  2. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    CREATE OR REPLACE PROCEDURE ma_procedure IS
    CURSOR c1 IS SELECT prof,horaire,jour,COUNT(prof) FROM EdT HAVING COUNT(prof)>1  ;--récupère l'id des profs,l'horaire et jour où ils sont  à deux endroits différents pour le même horaire
    cur1 c1%ROWTYPE;
    nom_p VARCHAR(50);
    prenom_p VARCHAR(50); 
    BEGIN
      
       OPEN c1;
       FETCH c1 INTO cur1;
       WHILE c1%FOUND LOOP
       SELECT nom, prenom INTO nom_p,prenom_p FROM Profs where id=cur1.prof;--selectionne nom du prof et prenom
       DBMS_OUTPUT.PUT_LINE(nom_p||' '||' '||prenom_p||' '||TO_CHAR(cur1.horaire,'DD/MM/YYYY HH24:MI:ss'));--affiche à l'ecran
       FETCH c1 INTO cur1;
       END LOOP;
       CLOSE c1;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    END ma_procedure;
    /

    Y'a peut-etre quelques erreurs... mais tu as la philosophie du truc
    @+
    1
  3. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    Sur Oracle 10g, tu peux faire un truc du style:
    select * from v_$session
    ou
    select * from V_$SESSION_CONNECT_INFO
    J'espere ca pourra t'aider!!
    @+
    0
  4. oliv
     
    merci pour ta réponse mais il faut que je passe par un create procedure et je suppose par un begin pour faire une boucle.

    serait-il possible de m'aider pour l'écriture du script.

    MERCI d'AVANCE
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    Y'a pas de probleme pour t'aider mais tu les récupères dans quelle table les données?
    Perso, j'ai pas trouvé de vue ou table où il y avait un historique des sessions....( j'ai du créer des trigger et une table afin d'avoir les données voulues...)
    Tiens moi au jus!!
    @+
    0
  7. oliv
     
    bonjour,

    je fais ma requête sous oracle avec slq developper. si ça peux répondre à ta question pour ma demande.

    Merci
    0
  8. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    Dans quelle table ou vue tu vas recupérer les données?
    0
  9. oliv
     
    DANS UNE TABLE PROFSALLE JE VEUX LA NOMMER
    0
  10. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    alors voilà ce que j'ai fais...j'espere ca pourra t'aider!!
    Creation des triggers de connexion et deconnexion

    CREATE OR REPLACE TRIGGER ONLOGGOFF
    BEFORE LOGOFF
    ON DATABASE
    DECLARE
    tmpVar VARCHAR(50);
    BEGIN

    INSERT INTO MYLOG_SESSION (idnex,OSNAME,DATETIME,STATUS) VALUES (mylogon.NEXTVAL,SYS_CONTEXT('USERENV','OS_USER'),SYSDATE,'F');

    EXCEPTION
    WHEN OTHERS THEN
    -- Consider logging the error and then re-raise
    RAISE;
    END onloggoff;
    /

    CREATE OR REPLACE TRIGGER ONLOON
    AFTER LOGON
    ON DATABASE
    DECLARE
    BEGIN

    INSERT INTO MYLOG_SESSION (idnex,OSNAME,DATETIME,STATUS) VALUES (mylogon.NEXTVAL,SYS_CONTEXT('USERENV','OS_USER'),SYSDATE,'O');

    EXCEPTION
    WHEN OTHERS THEN
    -- Consider logging the error and then re-raise
    RAISE;
    END onloon;
    /

    Creation de la Table:

    CREATE TABLE MYLOG_SESSION
    (
    IDNEX INTEGER,
    OSNAME VARCHAR2(50 BYTE),
    DATETIME DATE,
    SID NUMBER,
    SERIAL NUMBER,
    STATUS CHAR(1 BYTE)
    )

    Et la procedure:
    DECLARE
    CURSOR c1 IS SELECT DISTINCT OSNAME FROM MYLOG_SESSION;--recupere tous les users enregistrés
    CURSOR c2 (OSN VARCHAR) IS SELECT * FROM MYLOG_SESSION WHERE OSNAME=OSN ORDER BY datetime ASC;--recuperations des données par utilisateurs
    cur2 c2%ROWTYPE;
    cur1 c1%ROWTYPE;
    cur3 c2%ROWTYPE;
    tmp CHAR;
    i INTEGER;
    BEGIN
       OPEN c1;
       i:=0;--compteur pour afficher les resultats
       FETCH c1 INTO cur1;
       			WHILE c1%FOUND LOOP --boucle pour balayer tous les utilisateurs
    				  OPEN c2(cur1.OSNAME); --selection des données utilisateurs
       				  FETCH c2 INTO cur2;
    						WHILE c2%FOUND LOOP --boucle pour verifier si 2 connexions à des endroits differents (si 2 'O' consecutif, il a ouvert 2 session à deux endroits differents
    						tmp:=cur2.STATUS;
       							 WHILE tmp='O' AND c2%FOUND LOOP --comptage->si i>1 alors 2 connexions
    							   	  i:=i+1;
    								  cur3:=cur2;
    								  FETCH c2 INTO cur2;
    								  tmp:=cur2.STATUS;
    					   		 END LOOP;
    							 IF (i>1) THEN --si le compteur est >1 alors on affiche la personne et la derniere heure de la connexion ouverte
    							 DBMS_OUTPUT.PUT_LINE(cur3.OSNAME||' '||TO_CHAR(cur3.DATETIME,'DD/MM/YYYY HH24:MI:ss')||' '||cur3.STATUS);
    							 END IF;
    						i:=0; --remise à zero du compteur
    						FETCH c2 INTO cur2;
    						END LOOP;
    					CLOSE c2;
    					FETCH c1 INTO cur1;
       			END LOOP;				
    	CLOSE c1;	   
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    	   
    END;


    Je sais pas si cela pourra t'aider mais bon....tu trouveras sinon des pistes!!
    @+
    0
  11. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    Ok, je croyais que tu voulais les utilisateurs connectés à la DB sur 2 postes différent en meme temps...je suis partie en sucette!!lool
    Je regarde, je te tiens au jus!!
    @+
    0
  12. oliv
     
    merci beaucoup pour ta réactivité et tes réponses jevais regarder ça.
    0
  13. chuka Messages postés 980 Statut Membre 379
     
    Salut,
    manque le group by dans cette expression....
    CURSOR c1 IS SELECT prof,horaire,jour,COUNT(prof) FROM EdT
    group by prof,horaire,jour
    HAVING COUNT(prof)>1
    @+
    0