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

Deski Discussion :

Problème avec retour d'une procédure stockée


Sujet :

Deski

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut Problème avec retour d'une procédure stockée
    Bonjour,

    Je soumet mon problème en espérant que quelqu'un pourra me renseigner.
    But de la procédure:
    Sélectionner des enregistrements basé sur trois paramètres en entrée (no.employé, date début, date fin) faire un traitement simple sur les enr. et retourner les enr.

    J'ai créé une procédure (BD oracle) où j'ai mes 3 paramètres IN et un IN/OUT de type REF CURSOR.

    CREATE OR REPLACE PROCEDURE SP_Absence_employe(matricule IN varchar2, date_deb IN date, date_fin IN date,
    p_cursor IN OUT TYPES.cursortype)

    IS
    cursor c1 (matr varchar2, debut date, fin date) IS
    select t2.ch1, t2.ch2, t1.ch3,t3.ch4, sum(t1.chg5/3600) hres
    from ((t2 inner join t1 on t2.id = t1.id)
    inner join t3 on t1.codeid = t3.codeid)
    where (t2.id = matr) and
    (t1.date between debut and fin) and
    (t1.codeid in (19201,19202,19203,19301,19302))
    group by t2.ch1, t2.ch2, t1.ch3, t3.ch4
    order by t1.date;

    v_matr varchar2(15);
    v_nom varchar2(64);
    v_deb date;
    v_date date;
    v_fin date;
    v_code varchar2(50);
    v_hres number(16,6);
    b4_matr varchar2(15);
    b4_date date;
    b4_code varchar2(50);
    tothr number(16,6);

    BEGIN

    OPEN c1(matricule, date_deb, date_fin);
    FETCH c1
    INTO v_matr, v_nom, v_date, v_code, v_hres;

    b4_matr := v_matr;
    b4_date := v_date;
    v_deb := v_date;
    b4_code := v_code;
    tothr := 0;

    LOOP
    Traitement des enregistrements j'ai enlevé le code qui traite... pas vraiment nécessaire.

    INSERT INTO FICHIER (table temporaire)
    (MATRICULE, DATE_DEBUT, DATE_FIN, CODE_PAIE, HEURES)
    VALUES
    (b4_matr, v_deb, b4_date, b4_code, tothr);

    FETCH c1
    INTO v_matr, v_nom, v_date, v_code, v_hres;
    EXIT WHEN c1%NOTFOUND;

    END LOOP;

    CLOSE c1;

    OPEN p_cursor FOR
    SELECT MATRICULE, DATE_DEBUT, DATE_FIN, CODE_PAIE, HEURES
    FROM FICHIER;

    END SP_Absence_employe;

    Ma procédure fonctionne bien lorsque je la teste avec l'utilitaire TOAD.
    P_cursor contient mes enregistrements.

    Mon problème est lorsque j'essaie de l'appeler avec BO, j'entre mes trois paramètres et lorsque je l'exécute il me donne le message erreur suivant.

    Exception: DBD, ORA-08103: object no longer exists State: N/A

    J'ai l'impression d'être près du but à moins qu'il est impossible d'accéder à mes enregistrements de cette façon.

    Merci d'avance si quelque à une réponse

    A+
    Hélène

  2. #2
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Bonjour Hélène,
    Ca fait plaisir de voir un peu de PL/SQL sur le Forim BO ...

    J'ai lu le code de ta procédure et bien que n'ayant pas encore bu mon café ...
    [FONT=Courier]
    Je n'y vois pas de raison il est en tout point conforme aux exemples proposés par BO (je suppose que TYPES.cursortype est défini ).

    Côté Supervisor tu as la connection dans l'onglet procédure stockées ?
    Dans les restrictions de profil utilisateur les procédures stockées te sont autorisées ?
    Dans BO tu as ta procédure dans la liste ?
    [/FONT]
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Salut Bruno2R !!!

    Quel plaisir de voir que mon problème peut intéresser quelqu'un. Je voudrais vraiment passer à autre chose. J'ai épluché l'aide de BO mais les exemples donnés sont souvent plus "basics" que ce que l'on a besoin d'obtenir.

    Eh.....

    Oui ---> TYPES.cursortype est défini
    Oui ---> Côté Supervisor tu as la connection dans l'onglet procédure stockées ?
    Oui ---> Dans les restrictions de profil utilisateur les procédures stockées te sont autorisées ?
    Oui ---> Dans BO tu as ta procédure dans la liste ?

    Le message erreur que j'obtiens c'est vraiment à la toute fin lorsque j'exécute ma SP à travers BO.

    Ce qui signifie: que j'ai choisi "procédures stockées", qu'il m'a montré la connexion à choisir, que j'ai choisi la procédure à exécuter, qu'il m'a donné la fenêtre pour que je puisse entrer mes paramètres et croyant que mes misères étaient résolues j'ai appuyé sur le bouton "éxécuter"

    Je crois que mon message erreur concerne mon paramètre p_cursor...

    Je te donne la définition de mon curseur au cas où...
    CREATE OR REPLACE PACKAGE APP_RH_KRONOS.TYPES
    AS
    TYPE
    cursorType IS REF CURSOR;
    END ;

    Merci de te pencher là-dessus, me laisse pas tomber je suis au bout de la route !!! Je n'ai plus d'idées.

    En attendant ta prochaine réponse qui aura un certain décalage car je suis au Québec (Canada), je travaille à un autre dossier.

    A+
    Hélène

  4. #4
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Pour tout te dire .... je fais du SQL PL/SQL toute la journée mais je n'ai jamais utilisé de procédure stockée dans BO (je crée plutôt de l'infocentre dans Oracle sur lequel je fais des univers ou du sql à la carte)

    Je me suis donc précipité sur le manuel d'accès aux données et le mauel utilisateur où les exemple sont succints mais conformes à ce que tu as fait.
    Leur exemple de définition de curseur est la suivante Manuel d'accès aux données p67 :
    Creating a Cursor inside a Package
    A package is a database object that contains related PL/SQL types, objects, and
    To create a package, you can use the following statement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE or REPLACE PACKAGE catalog_data AS
    TYPE CatCurTyp IS REF CURSOR RETURN all_objects%ROWTYPE
    END catalog_data
    Ne trouves tu pas bizarre que dans le tiens il n'y ait pas de RETURN ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Je te donne la définition de mon curseur au cas où...
    CREATE OR REPLACE PACKAGE APP_RH_KRONOS.TYPES 
    AS
    TYPE cursorType IS REF CURSOR; 
    END ;
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    BRUNO2R,

    Je me suis défini un curseur général. Il prendra la structure d'une table temporaire dans ma procedure.

    Honnêtement, je ne vois pas quoi mettre... RETURN ?


    Le savoir n'est important que s'il est partagé.
    Hélène

  6. #6
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Mais justement Hélène,
    Table temporaire et Exception: DBD, ORA-08103: object no longer exists
    Ca te fait penser à rien ?

    As tu essayé avec RETURN ?
    Je viens de découvrir que dans la version Francaise deu Manuel daccès aux données le seul exemple de procédure stockée est basé sur Microsoft SQL Server:

    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
    Utilisation d’une procédure stockée pour rapatrier des données
    Cette section explique comment rapatrier des données dans un rapport
    BusinessObjects à l’aide d’une procédure stockée. L’exemple suivant utilise une
    procédure stockée qui renvoie des données provenant de la base de données
    eMode exploitant Microsoft SQL Server. La procédure utilise l’état et le nom de
    l’article comme paramètres d’entrée et renvoie une liste de magasins situés dans
    l’état et le total des ventes des articles ayant des noms similaires à celui spécifié.
    La requête figurant dans la procédure stockée se présente comme suit (@state
    et @article sont les paramètres transmis à la procédure) :
    SELECT ol.shop_name,al.article_label,
    SUM (sf.quantity_sold) as total_sold
    FROM outlet_lookup ol INNER JOIN (
    shop_facts SF INNER JOIN article_lookup al
    ON sf.article_id = al.article_id )
    ON ol.shop_id = sf.shop_id
    WHERE ol.state = @state
    AND al.article_label LIKE '%' + @article + '%'
    GROUP BY ol. shop_name,
    al.article_label
    Alors que dans la version En Glish c'est un peu plus complet :

    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
    Stored procedures support in BusinessObjects
    The following sections list the stored procedures supported by BusinessObjects.
    .. Supported Stored Procedures
    Business Objects products support the following stored procedures:
    • Any PL/SQL procedures that return result sets through a REF Cursor.
    • PL/SQL stored procedures that have at least one IN/OUT REF cursor variable
    parameter and no OUT or IN/OUT parameter.
    .. Unsupported Stored Procedures
    The following stored procedures are not supported by Business Objects
    products:
    • Any PL/SQL procedure that does not return result sets through a REF
    CURSOR parameter
    • Any PL/SQL procedures having at least one OUT parameter
    • Any PL/SQL function
    • Any PL/SQL procedure having one IN/OUT parameter of a type different than a REF CURSOR, for example, VARRAY
    • Any PL/SQL Table function
    Ensure that your stored procedures are compatible withe Business Objects
    products.
    Setting up stored procedure access
    To allow user access to stored procedures in BusinessObjects, implement thefollowing steps before they create connections:
    1. Create a cursor inside a package. See Creating a Cursor inside a Package
     
    2. Create the stored procedures using the defined cursor. See Creating a Stored
     
    Both stages are done using Procedural Language/Standard Query Language
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (PL/SQL)... Creating a Cursor inside a Package
    A package is a database object that contains related PL/SQL types, objects, and
    subprograms.
    To create a package, you can use the following statement:
    CREATE or REPLACE PACKAGE catalog_data AS
    TYPE CatCurTyp IS REF CURSOR RETURN
    all_objects%ROWTYPE;
    END catalog_data;
    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
    .. Creating a Stored Procedure
    Stored procedures are sets of PL/SQL statements grouped together to perform
    a specific task.
    NOTE
    In BusinessObjects, you can only access standalone procedures.
    To create a stored procedure on your database, use the following statement:
    CREATE or REPLACE PROCEDURE get_allobjects(cat_cv IN OUT
    catalog_data.catcurtyp) AS
    BEGIN
    OPEN cat_cv FOR SELECT * FROM all_objects;
    END;
    or, if you want to include several parameters:
    CREATE or REPLACE PROCEDURE get_ownerobjects(owner_name IN
    varchar2, cat_cv IN OUT catalog_data.catcurtyp) AS
    BEGIN
    OPEN cat_cv FOR SELECT * FROM all_objects WHERE
    owner=owner_name;
    END;
    In both statements, use catcurtyp cursor that you previously created in thepackage. 
     
    In the examples, catalog_data.catcurtyp is used.
    See your Oracle documentation for more information on how to create packages and stored procedures.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Packaged stored procedures and standalone stored procedures
    The following is a packaged declaration, it is not supported by BusinessObjects:
    CREATE or REPLACE PACKAGE pac2 AS
    TYPE curtyp IS REF CURSOR RETURN GUEST%ROWTYPE;
    PROCEDURE pproc(cat_cv IN OUT curtyp);
    END pac2;
    The following is a standalone stored procedure, it is supported by
    BusinessObjects:
    CREATE or REPLACE PACKAGE pac1 AS
    TYPE curtyp IS REF CURSOR RETURN GUEST%ROWTYPE;
    END pac1;
    You need the Package definition at least to create the cursor type.
    Bon sur ce je rentre chez moi il est déjà tard ici
    A demain pour la suite du feuilleton.
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    BRUNO2R,

    comme je te l'ai dit précédemment j'avais déjà tout épluché l'info que tu as mis dans ton dernier messsage.

    OK j'ai essayé quelques options

    1- j'ai ajouter un return
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE PACKAGE APP_RH_KRONOS.TYPES 
    AS
        TYPE cursorType IS REF CURSOR RETURN
        TX_ABSENCE%ROWTYPE ; 
    END ;
    Sans succès...

    2- Ensuite au conseil d'un collègue, j'ai appliqué à la lettre le code qu'ils donnent dans ton exemple soit:

    J'ai enlevé le statut temporaire de ma table, j'ai ajouté du data bidon pour faire un test, j'ai appelé ma procédure de la même façon qu'il était inscrit et bingo tout a fonctionné...

    ... sauf que j'aimerais bien travailler avec une table temporaire (virtuelle) associée à la session ce qui signifierait que plusieurs usagers pourraient simultanément appeler la même requête (procédure).

    Je peux toujours m'en sortir avec une table non temporaire alors je devrai avoir un champs qui indiquerais le poste qui a nourrit l'enregistrement pour pouvoir ensuite sélectionner tous les enregistrements appartenant à ce poste. Ça je le sais depuis le début.

    Enfin, il faut que ça aboutisse alors je vais peut-être me tourner vers cette solution.

    Si tu penses à quelque chose, fais-moi signe.

    merci
    bye

    Hélène

  8. #8
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    J'ai pensé à ton problème et ton ernier message me conforte dans ce qui n'était qu'une intuition (relation entre table temporaire et Ora-08103).

    Je pense que tu dois faire le deuil de cette table ... temporairement !
    Il se trouve que tu a fait l'impasse dès tonpremier message sur le traitement qui aboutit à cette table temporaire.
    j'ai enlevé le code qui traite... pas vraiment nécessaire.
    Ce traitement ne peut-il se faire dans le SELECT du curseur ?
    Puisque semble-t-il son objet est de calculer le total du nombre d'heures tothr tu devrais pouvoir l'obtenir à l'aide de jointures, voir de requêtes imbriquées directement dans le premier curseur.

    Qu'en penses tu ?
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Salut,

    À peine quelques gorgées de mon premier café avalées...

    Ce traitement ne peut-il se faire dans le SELECT du curseur ?
    Puisque semble-t-il son objet est de calculer le total du nombre d'heures tothr tu devrais pouvoir l'obtenir à l'aide de jointures, voir de requêtes imbriquées directement dans le premier curseur.


    Après maintes tentatives, je n'ai pas réussi à obtenir ce que j'ai besoin, sinon il y a belle lurette que je me serais tourné vers le SQL à la carte.

    Mon résultat final doit me donner les enregistrements d'absence d'un employé X entre deux dates passées en paramètes. Dans mon fichier, les enregistrements sont par jour et l'usager ne veut pas voir tous les enregistrements. Il veut seulement savoir si X a été absent du yyy au zzz. Imagine un employé en absence long terme 6 mois, ça ferait un rapport volumineux.

    ex. 8142 M. Patate 2007-01-03 Absence 12 h
    8142 M. Patate 2007-01-04 Absence 12 h
    8142 M. Patate 2007-01-05 Absence 12 h
    8142 M. Patate 2007-05-02 Absence 8 h
    8142 M. Patate 2007-05-26 Absence 4 h

    résultat
    8142 M. Patate 2007-01-03 2007-01-05 Absence 24 h
    8142 M. Patate 2007-05-02 2007-05-02 Absence 8 h
    8142 M. Patate 2007-05-26 2007-05-26 Absence 4 h

    S'il y a <= 3 jours de différence entre les dates, je continue à lire parce que c'est toujours la même absence. Les employés étant sur des quarts de travail il n'y a pas de tx's les journée non cédulées c'est pourquoi je dois tenir compte du 3 jours.


    Voilà, je t'ai tout dit... des fois que tu aurais ...

  10. #10
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    ALORS QUELLE VERSION ORACLE ?8? 9? 10?

    Autre chose, comment fait tu ?
    ex. 8142 M. Patate 2007-01-03 Absence 12 h
    8142 M. Patate 2007-01-04 Absence 12 h
    8142 M. Patate 2007-01-05 Absence 12 h
    8142 M. Patate 2007-05-02 Absence 8 h
    8142 M. Patate 2007-05-26 Absence 4 h

    résultat
    8142 M. Patate 2007-01-03 2007-01-05 Absence 24 h
    8142 M. Patate 2007-05-02 2007-05-02 Absence 8 h
    8142 M. Patate 2007-05-26 2007-05-26 Absence 4 h
    Pour trouver
    8142 M. Patate 2007-01-03 2007-01-05 Absence 24 h
    moi j'en vois 36 ...
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  11. #11
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Désolé, après avoir bu tout mon café j'en vois aussi 36

    On est à la version oracle 9.2, mais j'ai pris le temps de parler avec le DBA car je savais que nous changions de version de ce système et il m'a dit que le nouveau serveur serait oracle 10. Nouvelle version d'ici la fin novembre 2007.

    .... je suppose fonctions analytiques qui ne sont pas disponibles en orale 9 ?

    Y'a des semaines où j'aimerais bien être coiffeuse !!!

  12. #12
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Certaines fonctions analytiques sont apparues en v 9i
    Manqué.

    Bon je dois partir en week-end (oui on a un peu d'avance sut toi pour l'heure).
    Si tu peux fais passer la partie de traitement que je vois si on peut l'écrire autrement que dans une table temporaire.

    Coiffeuse !!
    Non je préfère l'extension sql à l'extension tif
    Bye
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  13. #13
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Voilà la procédure complète...

    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
    CREATE OR REPLACE PROCEDURE SP_Absence_employe(matricule IN varchar2, date_deb IN date, date_fin IN date,
                                                p_cursor IN OUT TYPES.cursortype)
     
    IS
        cursor c1 (matr varchar2, debut date, fin date) IS
        select t2.chp1, t2.chp2, t1.chp3, t3.chp4, sum(t1.chp5/3600) hres
        from ((t2 inner join t1 on t2.id = t1.id)
              inner join t3 on t1.codeid = t3.codeid)
        where (t2.chp1 = matr) and 
              (t1.date between debut and fin) and
              (t1.codeid in(302,703,1104,2502,2503))          
        group by t2.chp1, t2.chp2, t1.chp3, t3.chp4
        order by t1.date;
     
        v_matr      varchar2(15);
        v_nom       varchar2(64);
        v_deb       date;
        v_date      date;
        v_fin       date;
        v_code      varchar2(50);
        v_hres      number(16,6);
        b4_matr     varchar2(15);
        b4_nom      varchar(64);
        b4_date     date;
        b4_code     varchar2(50);
        tothr       number(16,6);
     
        BEGIN
     
        OPEN    c1(matricule, date_deb, date_fin);
        FETCH   c1
         INTO v_matr, v_nom, v_date, v_code, v_hres;
     
        b4_matr := v_matr;
        b4_date := v_date;
        v_deb   := v_date;
        b4_code := v_code;
        b4_nom  := v_nom;
        tothr   := 0;
     
        LOOP
            IF v_matr = b4_matr and
                v_code = b4_code then
     
                 IF (v_date - b4_date) <= 3 then
                     tothr := tothr + v_hres;
                 ELSE
                     INSERT INTO tx_absence 
                                 (MATRICULE, NOM, DATE_DEBUT, DATE_FIN, CODE_PAIE, HEURES)
                         VALUES
                                 (b4_matr, b4_nom, v_deb, b4_date, b4_code, tothr);
                     v_deb  := v_date;
                     tothr  := v_hres;
                 END IF;
     
            ELSE 
     
                 INSERT INTO tx_absence 
                                 (MATRICULE, NOM, DATE_DEBUT, DATE_FIN, CODE_PAIE, HEURES)
                         VALUES
                                 (b4_matr, v_nom, v_deb, b4_date, b4_code, tothr);
                 v_deb   := v_date;
                 tothr := v_hres;
            END IF;
     
            b4_matr := v_matr;
            b4_date := v_date;
            b4_code := v_code; 
            b4_nom  := v_nom;   
     
            FETCH   c1
            INTO v_matr, v_nom, v_date, v_code, v_hres;
            EXIT WHEN c1%NOTFOUND;   
     
            END LOOP;
     
            INSERT INTO tx_absence 
                        (MATRICULE, NOM, DATE_DEBUT, DATE_FIN, CODE_PAIE, HEURES)
                 VALUES
                        (b4_matr, v_nom, v_deb, b4_date, b4_code, tothr);
     
            CLOSE c1;
     
           OPEN p_cursor FOR
           SELECT MATRICULE, NOM, DATE_DEBUT, DATE_FIN, CODE_PAIE, HEURES
            FROM TX_ABSENCE;
     
         END  SP_Absence_employe;
    On s'en reparle...

    A+
    Hélène

  14. #14
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Merci,
    J'essaierai de l'étudier ce week-end.
    En attendant tu pourrais jeter un coup d'oeil à cette possibilité d'emboiter les curseurs (doc oracle)
    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
    In this example, we find a specified location ID, and a cursor from which we can fetch all the departments in that location. As we fetch each department's name, we also get another cursor that lets us fetch their associated employee details from another table.
      CREATE OR REPLACE procedure emp_report(p_locid number) is
    TYPE refcursor is ref cursor;
    -- The query returns only 2 columns, but the second column is
    -- a cursor that lets us traverse a set of related information.
     
    CURSOR c1 is
    SELECT l.city,
    CURSOR(SELECT d.department_name,
    CURSOR(SELECT e.last_name
    FROM employees e
    WHERE e.department_id = d.department_id) as ename
    FROM departments d where l.location_id = d.location_id) dname
    FROM locations l
    WHERE l.location_id = p_locid;
     
    loccur refcursor;
    deptcur refcursor;
    empcur refcursor;
     
    V_city locations.city%type;
    V_dname departments.department_name%type;
    V_ename employees.last_name%type;
     
    BEGIN
    OPEN c1;
    LOOP
    FETCH C1 INTO v_city, loccur;
    EXIT WHEN c1%notfound;
    -- We can access the column C1.city, then process the results of
    -- the nested cursor.
     
    LOOP
    FETCH loccur INTO v_dname, deptcur; -- No need to open
    EXIT WHEN loccur%notfound;
     
    LOOP
    FETCH deptcur into v_ename; -- No need to open
    EXIT WHEN deptcur%notfound;
    DBMS_OUTPUT.PUT_LINE(v_city ||' '||v_dname||' '||v_ename);
    END LOOP;
    END LOOP;
    END LOOP;
    close c1;
    END;
    /
    Fais aussi un break
    Courage ... t'es la meilleure des coiffeuses
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  15. #15
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Merci Bruno2R,

    je vais regarder ce que tu as envoyé lorsque j'aurai une minute...

    "la coiffeuse" c'est une blague interne dans mon secteur (où je suis la seule femme). Quand j'en ai marre de l'informatique ou que je suis débordée je leur dis toujours "Quelqu'un peut-il me dire pourquoi je ne suis pas une coiffeuse ce matin ? " (à noter que ces propos ne se veulent pas péjoratif).




    Hélène

  16. #16
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Bonjour Hélène,

    Je vais t'avouer un truc :

    BO IL SE CROIT PLUS TORDU QUE NOUS !
    EH BIEN NON !
    ALORS ON VA PAS LUI LAISSER LE DERNIER MOT

    J'ai relu (oh et avec quelle délectation !) ton PL/SQL.
    Et quelque chose me chagrine :
    CREATE OR REPLACE PROCEDURE SP_Absence_employe(matricule IN varchar2, date_deb IN date, date_fin IN date,
    p_cursor IN OUT TYPES.cursortype)
    Voudrais-tu essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE OR REPLACE PROCEDURE SP_Absence_employe( matricule IN varchar2, 
    date_deb IN date, date_fin IN date, 
    IN OUT REF CURSOR p_cursor )
    SINON
    Tu devrais essayer de déclarer le curseur dans un package avec cette spécifité (mais peut-être l'as tu fait (TYPES.cursortype?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE or REPLACE PACKAGE catalog_data AS
    TYPE CatCurTyp IS REF CURSOR RETURN
    all_objects%ROWTYPE;
    END catalog_data;
     
    et utiliser ensuite cette référence ...
    CREATE OR REPLACE PROCEDURE SP_Absence_employe(matricule IN varchar2,  
    date_deb IN date, date_fin IN date, 
    IN OUT catalog_data.catcurtyp
    Dis moi ce que ça donne ....

    Ce que je viens de trouver sur le forum USA de BO semble confirmer cette piste :
    I am giving you a sample code for oracle, using SCOTT schema. When you want to use Stored Procedures, you have to use REF CURSOR. This procedure accepts a user input and retrieves the results.
    -- First you will be creating a package.
    -- Second you will be using the REF CURSOR and writing the code for Stored Procedure.
    -- Use sql editor of create a stored procedure as below:
    Step 1: Declaring a Package.
    Code:
    CREATE OR REPLACE PACKAGE SCOTT.my_package AS
    TYPE bo_cursor_type IS REF CURSOR;
    END my_package;

    Step 2: Declaring a Stored Procedure.
    Code:
    CREATE OR REPLACE PROCEDURE SCOTT.get_employees_by_dept(Para IN Number ,bo_cursor IN OUT
    my_package.bo_cursor_type)
    IS
    CURSOR c1 IS SELECT * from emp;
    BEGIN
    FOR rec IN c1 LOOP
    OPEN bo_cursor for SELECT * from emp where deptno = para;
    END LOOP;
    END get_employees_by_dept;

    Step 3: Compile and execute the SP.
    Step 4: Grant Privileges to execute this procedure to a user, say 'XYZ' (user)
    Step 5: Create a connection in Supervisor which is pointing to XYZ schema in the database.
    Step 6: Create a report by selecting the Stored Procedure (instead of Universe)
    Hope this helps.
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  17. #17
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut Bon matin monsieur Bruno...
    hum...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Voudrais-tu essayer :
     
    Code :
    CREATE OR REPLACE PROCEDURE SP_Absence_employe( matricule IN varchar2, 
    date_deb IN date, date_fin IN date, 
    IN OUT REF CURSOR p_cursor )
    ne passe pas à la compile...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PLS-00103: Encountered the symbol "IN" when expecting one of the following:
              <an identifier> <a double-quoted delimited-identifier>
              current
    et ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Tu devrais essayer de déclarer le curseur dans un package avec cette spécifité (mais peut-être l'as tu fait (TYPES.cursortype?)
     
     
    Code :
    CREATE or REPLACE PACKAGE catalog_data AS
    TYPE CatCurTyp IS REF CURSOR RETURN
    all_objects%ROWTYPE;
    END catalog_data;
     
    et utiliser ensuite cette référence ...
    CREATE OR REPLACE PROCEDURE SP_Absence_employe(matricule IN varchar2,  
    date_deb IN date, date_fin IN date, 
    IN OUT catalog_data.catcurtyp
    je l'ai programmé ainsi ou presque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE PACKAGE APP_RH_KRONOS.TYPES 
    AS
        TYPE cursorType IS REF CURSOR;
    END ;
     
    CREATE OR REPLACE PROCEDURE APP_RH_KRONOS.SP_Absence_employe(matricule IN varchar2, date_deb IN date, date_fin IN date,
                                                p_cursor IN OUT TYPES.cursortype)
    je devrais peut-être prendre le temps d'essayer les curseurs imbriqués !
    Plus le temps passe et je vais me retrouver avec la version d'oracle 10g !
    pour pouvoir mettre à profit les fonctions analytiques dont tu m'as dit que tout se ferait seul

    Le feuilleton tourne en rond, ils doit y en avoir qui ont changé de chaine depuis longtemps !

    et le cartésien n'ayant pas encore trouver la solution se pencha encore plus car il voulait sauver la belle... à suivre

    Hélène

  18. #18
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut table temporaire
    Bonjour Amie au loin

    Je viens d'avoir un nouveau jouet tout neuf pour monter mon infocentre en Oracle 10g ... YES !

    Et lisant quelques lignes de la littérature de ladite version je tombe sur ça :

    "Les tables temoraires ont été introduites dans Oracle 8i ...."
    ça nous le savions toi et moi puisque tu l'utilises dans ta procédure problématique tic tic

    En parcourant la syntaxe de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE GLOBAL TEMPORARY TABLE
    je découvreen option facultative :
    [ON COMMIT { DELETE | PRESERVE } ROWS
     
    où DELETE >> 
    Pour une table temporaire spécifique à une transaction (choix par défaut !!!)
    cette clause demande au système de vider la table, 
    TRUNCATE après chaque COMMIT.
     
    où PRESERVE >> 
    Pour une table temporaire spécifique à une session
    cette clause demande au système de vider la table, 
    TRUNCATE lorsque la session se termine
    Ne te semble-t-il pas, ma chère Amie, que tu puisses entrevoir ici un remède à la volatilité de tes résultats ?????

    A essayer (sous reserve que l'option existe dès la version 8i ... à vérifier.

    Bientôt une bonne nouvelle ??
    Je me languis ...
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  19. #19
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 29
    Points
    29
    Par défaut MONSIEUR Bruno


    Appelons-le MONSIEUR

    Voyant qu'il y avait autre chose a essayé et que ça ne demandait pas trop d'efforts de programmation, la paresseuse en moi s'est ruée pour modifier le tout et attendre patiemment les résultats.... et s'Il avait raison, si ça fonctionnait, ça a pas mal d'allure, est-ce que je peux espérer

    Et bien oui, bingo
    J'ai toujours su que tu y arriverait

    Je commence par la vague car il n'y a pas de "Smileys" qui font une ovation

    Là était le problème parce que maintenant ça fonctionne "a one".
    Lorsqu'on crée une table temporaire si on ne spécifie pas "on commit" il met delete par défaut. D'ailleurs dans la première semaine de nos échanges , un collègue m'avait fait remarqué cela mais je n'y avait pas vraiment fait attention.


    Blague à part, je veux sincèrement te remercier Bruno. je sais que tu as mis du temps pour résoudre mon problème et ça je l'apprécie vraiment.

    Fin du feuilleton
    le cavalier regarda la belle et lui dit: "ce n'est qu'un au revoir" et il s'en retourna pour sauver d'autres âmes en détresse.


    A+
    Sainte...Hélène

  20. #20
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    C'est trop...
    Merci à Toi pour ces félicitations... Mais

    Le boulot n'est pas tout à fait fini :
    Je veux te signaler un autre avantage à tirer de la solution.
    Ne pas oublier de définir la table temporaire en GLOBAL (option également facultative... je sens que je vais me passionner pour ces nuances optionnelles)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE [GLOBAL] TEMPORARY TABLE
    Pourquoi ?
    "GLOBAL" signale qu'il s'agit d'une table temporaire et que sa définition est visible par toutes les sessions. Les données, elles, ne sont visibles que par la session qui les insère dans la table !

    Ce qui semblait être un de tes premiers soucis.
    ... sauf que j'aimerais bien travailler avec une table temporaire (virtuelle) associée à la session ce qui signifierait que plusieurs usagers pourraient simultanément appeler la même requête (procédure).
    C'était le 18/10/2007 il y a si longtemps déjà Ouaf!

    Bon on se la marque
    A 254 affichages on va passer à autre chose...
    N'empêche je suis super content car ça m'a vraiment appris quelquechose !
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Retour d'une procédure stockée Oracle avec paramètre NULL
    Par Hobbi1 dans le forum VB.NET
    Réponses: 4
    Dernier message: 22/12/2014, 19h07
  2. Réponses: 2
    Dernier message: 22/02/2013, 15h24
  3. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  4. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 17h45
  5. Valeur de retour d'une procédure stockée
    Par Rudyweb dans le forum MFC
    Réponses: 4
    Dernier message: 25/02/2005, 17h52

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