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 :

trop de dblink ouverts par les fonctions appelées dans une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut trop de dblink ouverts par les fonctions appelées dans une procédure
    Bonjour a tous,

    Je suis sur une architecture multiple et je dois créer une procédure de centralisation de données (pour reporting).

    DB1, Oracle 10.1
    ||
    || (db link)
    V
    DB2, Oracle 9.2
    || || ...
    V V
    DB3a, Oracle 9.2 | DB3b, Oracle 9.2 ...

    Une procédure de DB1 fait appel a n fonctions sur DB2. Chacune de ces fonctions effectuent un select sur une DB3, travail le résultat et renvoie le résultat.

    Les appels de fonction se font via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT mafonction@db2 INTO maVariable FROM dual;
    Chaque fonction ressemble a cela:
    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
    CREATE OR REPLACE FUNCTION F_MA_FONCTION return varchar2    
    IS
     
        CURSOR diff IS
            SELECT 
                f1.champ1, 
                f2.champ2
            FROM 
                table_locale f1 FULL OUTER JOIN table_distante@DB3n f2 ON f1.id = f2.id 
            WHERE 
                condition(f1, f2);
     
        -- Variables
        w_message       VARCHAR2(32767);
     
    BEGIN
     
        -- Initilisation des variables
        w_message:='entête informative';
     
        FOR current IN diff LOOP
          w_message:=w_message||' infos structurées sur les resultats';
        END LOOP;
     
        return w_message;
    EXCEPTION
        WHEN OTHERS THEN
            w_message := 'SQL ERROR: '||SQLERRM;
            return w_message;
    END;
    /
    Tout vas bien dans le meilleur des mondes ... ou pas

    La limite du nombre de dblink ouvert sur la base DB2 est de 4. Dés que la procédure appelle la 5eme fonction (appelant elle-même une 5eme base DB3e), je récupère une erreure de DB2 me disant que le nombre maximum de dbLink est ouvert. Pourtant, les fonctions sont appelées séquentiellement.

    J'ai tenté de placer un commit avant le return des fonction mais cela ne semble pas autorisé par Oracle. Dans la procédure, je comit après chaque appel de fonction mais cela ne change rien.

    Après des recherches sur internet, il semblerais que la session ouverte sur DB2 par la procédure soit persistante et que tant qu'elle n'est pas fermée, les dblink ouverts le restent, bloquant (inutilement) une place.

    D'ou ma question, comment puis-je fermer ma session entre chaque appel a une fonction depuis ma procédure?
    S'il y a une technique plus simple ou plus propre, quelle est-elle?

    Merci d'avance.

    Cordialement.

  2. #2
    Membre expérimenté
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Par défaut
    Une solution, augmenter le nombre de db links utilsables simultanément par une session :

    Augmenter le paramètre d'initialisation OPEN_LINKS de 4 (le défaut) à la valeur désirée : 10 par exemple.

    Ou bien fermer les db links plus utilisés par la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alter session close database link xxxx

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut
    Bonjour,

    Tout d'abord, merci pour ta réponse.

    Il se trouve que je n'ai pas accès a la configuration (donc pas a OPEN_LINKS) sinon, j'aurais opté pour cette solution simple dés le départ

    Pour ce qui est du ALTER session close DATABASE LINK xxxx, je l'ai également croisé sur internet mais ne suis pas parvenu a l'utiliser. Ou que je le place dans mon code, impossible de compiler la fonction par la suite.

    Je cherche encore donc ^^

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par illeriane Voir le message
    Bonjour a tous,

    Je suis sur une architecture multiple et je dois créer une procédure de centralisation de données (pour reporting).

    DB1, Oracle 10.1
    ||
    || (db link)
    V
    DB2, Oracle 9.2
    || || ...
    V V
    DB3a, Oracle 9.2 | DB3b, Oracle 9.2 ...

    Une procédure de DB1 fait appel a n fonctions sur DB2. Chacune de ces fonctions effectuent un select sur une DB3, travail le résultat et renvoie le résultat.
    ...
    Vous est parti sur un mauvais chemin qui mène au désastre. Peut être qu'il est le temps de réviser Oracle Concepts.

  5. #5
    Membre expérimenté
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Par défaut
    Mnitu n'a pas tort, tu risques d'avoir beaucoup de problèmes à développer une solution de ce genre.

    Néanmoins, pour répondre à ta question tu peux exécuter des alter session en utilisant execute immediate.
    Pour ce qui est des commit, ils ne servent à rien si tu ne fais pas de mise à jour de données.

    Enfin si tes dblinks sont publics, tu risques bien de ne pas avoir le droit de les fermer, ce qui ramène à la solution 1

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut
    Bonjour,

    J'ai lu le document indiqué mais n'ai pas bien vu sur quoi je pèche. D'un autre coté, je travail sur une structure définie sur laquelle je n'ai aucune possibilité de modification structurelle. Je ne peux que greffer des fonctions, procédures et des vues.

    Il semble qu'il ne me reste qu'a tenter de négocier avec le dba.

    Merci a vous.

  7. #7
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par sgora Voir le message
    Pour ce qui est des commit, ils ne servent à rien si tu ne fais pas de mise à jour de données.
    Ca c'est vrai en contexte monobase.
    Dès lors qu'on utilise des liens entre base de données, on entre dans les transactions distribuées, quand bien même elles ne contiennent que des SELECT.

    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
    SQL> select count(*) from emp@distant;
     
      COUNT(*)
    ----------
            14
     
    SQL> alter session close database link distant;
    ERROR:
    ORA-02080: lien de base de données en cours d'utilisation
     
     
    SQL> commit;
     
    Validation effectuée.
     
    SQL> alter session close database link distant;
     
    Session modifiée.
    Et cette transaction distribuée doit être terminée (par COMMIT ou ROLLBACK) avant qu'on puisse refermer le lien de base de données.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2013, 23h40
  2. [XL-2003] Comment utiliser les fonctions ESSBASE dans une macro excel ?
    Par kharon_rp dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/04/2010, 14h17
  3. Appeler une fonction scalaire dans une procédure stockée
    Par Chacha35 dans le forum Développement
    Réponses: 0
    Dernier message: 10/11/2009, 11h18
  4. Réponses: 2
    Dernier message: 05/12/2006, 18h12
  5. Lire les fonctions contenues dans une DLL
    Par uranium-design dans le forum Windows
    Réponses: 5
    Dernier message: 06/09/2006, 11h47

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