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 :

Curseur / DBLink


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut Curseur / DBLink
    Bonjour

    j'ai la fonction ci-dessous qui teste l'existence d'un DB_LINK.

    Ma première question est : qu'est-ce qu'un DB_LINK exactement ? (De ce que j'en sais actuellement c'est plus ou moins une chaîne de connexion à une base ?)

    Ma seconde est : si le DB_LINK est trouvé, la fonction sort avec TRUE mais le CURSOR n'est pas fermé. Est-ce que si je ferme le curseur après le FETCH je peux encore tester le %FOUND ?

    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
    FUNCTION FB_TST_DBLINK (P_DBLINK ZSYS.A_DBK%TYPE)
     RETURN BOOLEAN
    IS
     
    CURSOR cur_dblink (p_dblink in zsys.a_dbk%type) IS
    SELECT sysdate from dual@p_dblink;
     
    rec_dblink cur_dblink%rowtype;
     
    BEGIN
     
    OPEN cur_dblink(p_dblink);
     
    FETCH cur_dblink INTO rec_dblink;
    	IF cur_dblink%found THEN
    		RETURN TRUE;
    	END IF;
    CLOSE cur_dblink;
     
    RETURN FALSE;
     
    EXCEPTION
    WHEN OTHERS
         pck_g_mes.pb_cre_mes_exc ('fb_tst_dblink');
    END FB_TST_DBLINK;
    Merci.

  2. #2
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut...
    il me semble que tu n'as pas besoin d'un curseur pour ça...

    essaye ceci :
    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
    create or replace 
        function TestDBLink (pv_DBLink IN Varchar2)
        Return Boolean
    Is
        dTemp           Date ;
        DBLNotExists    Exception ;
        pragma exception_init (DBLNotExists, -2019) ;
    Begin
        Execute immediate 'Select sysdate from dual@'||pv_DBLink into dTemp ;
     
        return True ;
     
        Exception
        When DBLNotExists
        Then
            return False ;
    End ;
    EDIT :
    j'ai modifié mon code pour catcher l'exception ora-02019 (DBLink n'existe pas)

  3. #3
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Merci.

    Mais chez mon client les normes de dév impose le curseur

    Donc mes questions restent en cours, mais je note ta solution

  4. #4
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Alors pour ta première question :
    OUI un DBLink est une chaîne de connexion stockées en base qui permet de faire communiquer 2 bases de données. ATTENTION, comme la chaîne de connexion est unique pour un DBLink, tu iras TOUJOURS pointer sur le même schéma de la base distante lorsque tu te réfère au même DBLink.

    Pour ta deuxième question :
    NON tu ne peux plus faire appel à %Found sur un curseur fermé.
    par contre comme tu fais un IF pour tester ta variable et renvoyer True, tu peux simplement mettre ensuite une clause else avec le return False.
    et comme là tu as déjà fait ton test, tu peux fermer ton curseur AVANT le Return.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    OPEN cur_dblink(p_dblink); 
     
    FETCH cur_dblink INTO rec_dblink; 
       IF cur_dblink%found THEN 
          CLOSE cur_dblink;
          RETURN TRUE; 
       ELSE
          CLOSE cur_dblink;
          RETURN False ;
       END IF; 
    ...

  5. #5
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Nickel ! Merci. Bon aprem.

  6. #6
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Ré-ouverture.

    Dans mon code ci-dessus, est VARCHAR2.

    Si je laisse mon tel quel j'ai l'erreur de compile

    ORA-04054 : lien base de données P_DBLINK inexistant.
    de même si je déclare explicitement p_dblink en varchar2.

    Or si je met en dur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT sysdate from dual@"maBase";
    dans le curseur, je n'ai plus l'erreur.

    Ma requête refuse de recevoir un paramètre, après le @, est-ce normal :

    Merci.

  7. #7
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Re...
    oui c'est normal, parce que pour intervenir au niveau de la structure du Select, ici la clause FROM, tu dois faire du SQL dynamique.

    tu peux t'inspirer de ma première solution... tu verras que j'ai justement dû utiliser le SQL dynamique (Execute Immediate) pour pouvoir "jouer" avec les DB_Link.

    EDIT :
    voici un "mix" de ma première proposition, mais AVEC un curseur :
    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
    create or replace 
        function TestDBLink (pv_DBLink IN Varchar2) 
        Return Boolean 
    Is 
        dTemp           Date ; 
        DBLNotExists    Exception ;
        pragma exception_init (DBLNotExists, -2019) ;  
     
        vSQL            Varchar2(4000);
        i               sys_refcursor ;
     
    Begin 
     
        vSQL := 'Select sysdate from dual@'||pv_DBLink ;
     
        Open i for vSQL ;
        Fetch i into dTemp ;
        Close i ;
     
        return True ; 
     
        Exception 
        When DBLNotExists 
        Then 
            Close i ;
            return False ; 
    End ;

  8. #8
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Je suis sur une base 8i (dsl j'avais pas précisé)

    bah allez je prend ta première solution.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Curseur & DBLink & Procedure
    Par mhicauber dans le forum PL/SQL
    Réponses: 5
    Dernier message: 21/04/2010, 10h11
  2. Masquer le curseur en mode MS-DOS
    Par Alex120 dans le forum C
    Réponses: 2
    Dernier message: 10/07/2002, 09h30
  3. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09
  4. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54
  5. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 17h09

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