IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Procedure ou fonction PL/QSL


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    ça a marcher au premier coup mais maintenant, à chaque execution j'ai un message:
    Détection d'interblocage pendant l'attente d'une ressource
    Est ce la transaction autonome qui ne se ferme pas? (et comment on la ferme si c'est bien ça...)

    MERCI POUR TOUT!!!!!!

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Tu peux montrer tout ton code (description des tables + trigger + fonction) et la requête svp


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    Merci infiniment de ton aide. Voilà mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    create table QUESTIONNAIRE(
    idquestionnaire varchar2(5) 
    	constraint K2 primary key,
    titre varchar2(50),
    duree number(3)
    );
     
    create table QUESTION (
    idquestion number(5) constraint K3 primary key,
    refquestionnaire varchar2(5), 
    text varchar2(100),
    typereponse varchar2(1),
    constraint KE3 foreign key (refquestionnaire)
    	references QUESTIONNAIRE(idquestionnaire)
    );
     
    create table REPONSE(
    refquestion number(5),
    text varchar2(100), 
    OuiNon number(1),
    constraint KE4 foreign key (refquestion )
    	references QUESTION(idquestion)
    );
     
    create table PREREQUIS(
    refquestionnaire varchar2(5),
    refquestionnairerequis varchar2(5),
    constraint KE5 foreign key (refquestionnaire) 
    	references QUESTIONNAIRE(idquestionnaire) ,
    constraint KE6 foreign key (refquestionnairerequis) 
    	references QUESTIONNAIRE(idquestionnaire)
    );
     
    create table CONTRAINTDATE(
    refquestionnaire varchar2(5),
    datedebut date,
    periodicite number(3),
    unite number(3),
    constraint KE7 foreign key (refquestionnaire)
    	references QUESTIONNAIRE(idquestionnaire)
    );
     
    CREATE OR REPLACE TRIGGER Del_Question
      Before delete ON Questionnaire
      	FOR EACH ROW 
      BEGIN
    	Delete from Question where Question.RefQuestionnaire = :OLD.IdQuestionnaire;
    	Delete from PreRequis where PreRequis.RefQuestionnaire = :OLD.IdQuestionnaire;
    	Delete from CONTRAINTDATE where CONTRAINTDATE.RefQuestionnaire = :OLD.IdQuestionnaire;
      END;
    /
     
    CREATE OR REPLACE TRIGGER Del_Reponse
      Before delete ON Question
      	FOR EACH ROW 
      BEGIN
    	Delete from Reponse where Reponse.RefQuestion = :OLD.IdQuestion;
      END;
    /
     
     
    CREATE SEQUENCE auto_RefQuestion      START WITH 1 INCREMENT BY 1 MAXVALUE 99999;
     
    Create or replace Function add_question (RefQuest VarChar2,TextQ VarChar2,TypeQ Varchar2) 
    Return number as
    	pragma autonomous_transaction;
    	V_seq integer;
    Begin  
       Insert into Question (idquestion,refquestionnaire,text,typereponse) 
       values               (auto_RefQuestion.nextVal, RefQuest,TextQ,TypeQ)
       	return idQuestion into v_seq;
       commit;    
       Return (v_seq);
    End; 
    /
     
     
     
    Create or replace Function add_session (Login VarChar2,Questionnaire VarChar2) 
    Return number as
       pragma autonomous_transaction;
       v_seq number; 
    Begin  
       Insert into SessionQCM(idsession,reflogin, refQuestionnaire,DateSession) 
        values               (auto_RefSession.nextVal, Login,Questionnaire, SysDate)
        return IdSession into V_Seq;
    commit;    
       Return (v_seq); 
    End; 
    /

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    et le code qui déclenche l'erreur ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    le voilà pardon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL> select add_question('GEO1','Paris','M') from dual;
    select add_question('GEO1','Paris','M') from dual
           *
    ERREUR à la ligne 1 :
    ORA-00060: Détection d'interblocage pendant l'attente d'une ressource
    ORA-06512: à "S3A3.ADD_QUESTION", ligne 6

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    ah!!! 2 minutes c'est peut être un probleme du au server de l'école?

  7. #7
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Il manque la table SESSIONQCM et sinon dans la fonction add_session, il y a une erreur de syntaxe :

    Il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    returning IdSession into V_Seq

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    Desolé, je me perd un peu dans mes affaires...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    create table SESSIONQCM(
    idsession number(5),  
    reflogin varchar2(10), 
    refquestionnaire varchar2(5),
    score number(5),
    datesession date,
    constraint KE1 foreign key (reflogin)
    	references UTILISATEUR(idlogin),
    constraint KE2 foreign key (refquestionnaire)
    	references QUESTIONNAIRE(idquestionnaire)
    );
     
    create table UTILISATEUR(
    idlogin varchar2(10),
    mdp varchar2(10), 
    nom varchar2(20),
    prenom varchar2(20),
    statut varchar2(20),
    DejaConnecte number(1),
    constraint K1 primary key(idlogin) 
    );
     
    CREATE SEQUENCE auto_RefSession       START WITH 1 INCREMENT BY 1 MAXVALUE 99999;

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pourquoi : pragma autonomous_transaction ?

  10. #10
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Ecoutes, moi ca marche en faisant la correction que je t'ai dis au niveau de la clause RETURNING :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    SQL> select add_question('GEO1','Paris','M') from dual; 
    select add_question('GEO1','Paris','M') from dual
           *
    ERROR at line 1:
    ORA-02291: violation de contrainte (U91879.KE3) d'intégrité - touche parent
    introuvable
    ORA-06512: à "U91879.ADD_QUESTION", ligne 6
    ORA-06512: à ligne 1
     
     
    -- j'ai rajouté une entrée dans QUESTIONNAIRE
    SQL> /
     
    ADD_QUESTION('GEO1','PARIS','M')
    --------------------------------
                                   2
     
    SQL> /
     
    ADD_QUESTION('GEO1','PARIS','M')
    --------------------------------
                                   3
     
    SQL> /
     
    ADD_QUESTION('GEO1','PARIS','M')
    --------------------------------
                                   4
     
    SQL> /
     
    ADD_QUESTION('GEO1','PARIS','M')
    --------------------------------
                                   5
    Apparemment la syntaxe insert ... values return ... into ... compile mais ne fais pas ce que le returning fait.



    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  11. #11
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Citation Envoyé par orafrance
    pourquoi : pragma autonomous_transaction ?
    Parce que Jésus (Jesus144 tu permets que je t'appelles Jésus ), souhaites que la ligne soit insérée alors qu'il fait un simple select de la fonction... Je connais pas d'autre moyen ?


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Par défaut
    CA MARCHE!!!
    C'est juste que dans le code de l'interface, j'avais oublier de faire un commit après la création de mon questionnaire, et que comme c'est deux transaction différentes...
    Je n'arrive pas encore a lire mon record set, mais la requette s'éffectue sans soucis... et je retrouve ma ligne dans la table...
    Merci a tous, Et pardon pour mes chti soucis d'organisation!

  13. #13
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Mouais, je sais pas s'il faudrait pas étudier une solution alternative parce que si à chaque fois que tu as deux sessions qui essaient concurremment de faire cet insert, tu te prends un interblocage, c'est pas glop !


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  14. #14
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par lalystar
    Citation Envoyé par orafrance
    pourquoi : pragma autonomous_transaction ?
    Parce que Jésus (Jesus144 tu permets que je t'appelles Jésus ), souhaites que la ligne soit insérée alors qu'il fait un simple select de la fonction... Je connais pas d'autre moyen ?


    Laly.
    PRAGMA RESTRICT_REFERENCES ne serait-il pas plus approprié ?

  15. #15
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    PRAGMA RESTRICT_REFERENCES j'avais lu que c'est une sorte d'engagement que la fonction ne modifie pas la base.

    Sans autonomous transaction, ca serait bizarre que tu fasses un select et qu'il faille committer :o


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  16. #16
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    A oui, c'est le COMMIT le problème bien sûr... OK, j'ai compris

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Comparaison Procedures stockees - Fonctions
    Par k'n1 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/06/2006, 06h31
  2. Réponses: 9
    Dernier message: 30/03/2006, 16h44
  3. creation d'une procedure ou fonction toute simple?
    Par atlas2003 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 16/11/2005, 14h56
  4. procedure ou fonction de conversion
    Par arezki76 dans le forum Oracle
    Réponses: 2
    Dernier message: 14/11/2005, 15h36
  5. Procedures et fonctions
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 08/05/2004, 23h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo