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

PL/SQL Oracle Discussion :

[10g] Execution d'une Procédure d'un package depuis une autre procédure du package


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    CUCARACHA
    Invité(e)
    Par défaut [10g] Execution d'une Procédure d'un package depuis une autre procédure du package
    Salut,

    J'ai créé un gros package qui contient ce type de proc :

    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
     
    PROCEDURE BU_GetCreate(
        pNAME IN VARCHAR2,
        pReturnCursor OUT SYS_REFCURSOR
    )
    IS
        vID NUMBER := null;
    BEGIN
        BEGIN
            SELECT P.ID INTO
                vID
            FROM
                FHR_BU P
            WHERE
                P.BU_NAME = pNAME;
                exception
                    when NO_DATA_FOUND then
                        vID := null;
        END;
     
        IF (vID is null) THEN
            --Creation de l'enregistrement 
            INSERT INTO FHR_BU ( 
                BU_NAME
            ) VALUES (
                pNAME
            ) returning FHR_BU.ID into vID;
        END IF;
    END;
    Puis une autre procédure qui me permet d'injecter une grosse ligne issue d'un web service dans mes tables.

    J'avais pensé (à tort bien entendu) que ceci fonctionnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
        vGetCreateCursor SYS_REFCURSOR; 
        vBU_ID NUMBER := null; 
    ...
        BU_GetCreate(BUSINESS_UNIT,vGetCreateCursor);
        SELECT B.ID INTO vBU_ID 
        FROM vGetCreateCursor B;
    ...
    Marcha pa...

    J'ai aussi essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
        vGetCreateCursor SYS_REFCURSOR; 
        vBU_ID NUMBER := null; 
    ...
        UMBRELLA_GetCreate(UMB_NAME,UMB_ID,vGetCreateCursor);
        OPEN vGetCreateCursor;
        FETCH vGetCreateCursor INTO vBU_ID;
    Marcha pas non plus...

    Ma question est la suivante :

    Comment faire pour sélectionner la ligne retournée via le curseur ?

    D'avance merci

    Laurent

    PS je sais Google est mon ami etc... J'ai déjà cherché mais je n'arrive pas à trouver un ex. clair.

    J'ai trouvé des trucs comme ça mais marcha pas non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     exec sql BEGIN DECLARE SECTION;... var1, var2, ... varn ...
     exec sql END DECLARE SECTION;
     
     exec sql DECLARE cursor-name CURSOR FOR CALL routine-invocation;
     
     exec sql OPEN cursor-name;
     
     loop as required
        exec sql FETCH cursor-name INTO :var1,:var2,...,:varn;
     end loop

  2. #2
    CUCARACHA
    Invité(e)
    Par défaut
    Je crois que j'ai trouvé, le curseur restait ouvert dans la proc, donc ne pas faire de open après... je vais vérifier si ça marche lorsque j'aurais tout fini

  3. #3
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut
    Salut,

    Dans ta procédure, que retournes-tu dans ton paramêtre OUT de type SYS_REFCURSOR ?

    Salutations.

    cala

  4. #4
    CUCARACHA
    Invité(e)
    Par défaut Oui (mais)
    Salut,

    Oui car c'était de vielles méthodes qui remplissaient des Dataset (de m....)

    J'ai finalement revu toutes mes procédures GetCreate, je les ai remplacées par des fonctions.

    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
     
    FUNCTION BU_GetCreate(
        pNAME IN VARCHAR2
    ) RETURN NUMBER
    IS
        vID NUMBER := null;
    BEGIN
        BEGIN
            SELECT P.ID INTO
                vID
            FROM
                FHR_BU P
            WHERE
                P.BU_NAME = pNAME;
                exception
                    when NO_DATA_FOUND then
                        vID := null;
        END;
     
        IF (vID is null) THEN
            --Creation de l'enregistrement 
            INSERT INTO FHR_BU ( 
                BU_NAME
            ) VALUES (
                pNAME
            ) returning FHR_BU.ID into vID;
        END IF;
        RETURN vID;
    END;
    Que j'appelle ensuite comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        vBU_ID := BU_GetCreate
            (
                PORTFOLIO_BUSINESS_UNIT
            );
    Je ne sais pas encore si ça fonctionne mais en tous les cas le Package compile (c'est déjà ça).

    Merci pour ta participation

    Laurent

  5. #5
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut
    Salut,
    Si tu veux retourner un simple résultat et non une collection, effectivement la fonction est appropriée. Ton code dois marché sans problème.

    Les SY_REFCURSOR sont utilisé dans d'autre cas, pour le passage de collection entre procédure. Par exemple tu peux créer une variable de type SYS_REFCURSEUR et lui attribué une requête SQL ou une variable de type VARCHAR2 contenant un code SQL dedans.

    Salutations,

    Cala

  6. #6
    CUCARACHA
    Invité(e)
    Par défaut
    Tu pourrais me donner un exemple simple ?

    Tu veux dire une FUNCTION qui RETURN SYS_REFCURSOR ?

    Si oui, cette syntaxe m'intéresse et en particulier comment on affecte le résultat de la sélection dans le curseur.

    Je n'en ai pas besoin là tout de suite mais c'est pour bientôt, je ne le sens...

    Merci

    ++

    Laurent

  7. #7
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut
    voici un exemple qui reçois en paramètre un SYS_REFCURSOR. Cette méthode est intéressante que tu veux créer des procédure dont le traitement est identique dans plusieurs cas mais que la requête de sélection n'est pas toujours la même. On ne veux pas créer une procédure de traitement par requête à cause que le filtre est variable.
    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
     
    SET SERVEROUTPUT ON;
    DECLARE
     
      mysql varchar2(100);
      P_CUR SYS_REFCURSOR;
     
      RESUL PLS_INTEGER;
     
      FUNCTION MYCALL(MYCUROUT IN SYS_REFCURSOR) RETURN PLS_INTEGER
      IS
        MYID PLS_INTEGER;
     
      BEGIN
     
        FETCH MYCUROUT INTO MYID;
     
        RETURN MYID;
      END;
     
    BEGIN
     
      mysql := 'select (100+200) as res from dual';
     
      OPEN P_CUR FOR mysql;
      RESUL := MYCALL(P_CUR);
      CLOSE P_CUR;
     
      DBMS_OUTPUT.PUT_LINE('RESULTAT = ' || RESUL);
     
    END;

Discussions similaires

  1. Copier une valeur dans un champs depuis une procédure
    Par zinabd dans le forum Designer
    Réponses: 8
    Dernier message: 20/11/2008, 09h31
  2. executer une commande sur un serveur depuis une page web
    Par nico33410 dans le forum Général Conception Web
    Réponses: 12
    Dernier message: 21/04/2007, 19h02
  3. Appel procédure d'un package depuis un autre package?
    Par Maglight dans le forum Oracle
    Réponses: 1
    Dernier message: 23/03/2007, 14h14
  4. Tester l'existence d'un package depuis une appli.net
    Par meuledor dans le forum Oracle
    Réponses: 3
    Dernier message: 27/09/2005, 16h18
  5. Réponses: 4
    Dernier message: 16/09/2003, 10h51

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