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 :

ORA-02018: lien de base de données du même nom qu'une connex


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut ORA-02018: lien de base de données du même nom qu'une connex
    dans une procedure stockee, je passe en parametre des elements utils pour construire le DATABASE LINK.

    je cree mon database link ==> OK

    j'ouvre un curseur sur une des tables de ma base de donnees eloignee pour rappatrier des donnees dans une table de ma base locale. ==> OK

    pour chaque LOOP , je fais un test d'existence à travers une requete ( donc un curseur implicite). ==> OK

    je fais un INSERT de mes donnees == > OK

    une fois mon FETCH arrivé au bout je CLOSE mon CURSEUR ==> OK

    puis je DROP mon lien et c'est la que le message d'erreur apparait .


    PS : j'ai ete oblige de mettre un commit apres OPEN mon_cur car apres la requete, il ne trouvait plus son pointeur ds le FETCH.
    alors j'ai pense mettre un commit apres le CLOSE . Helas....

    si l'un de vous a une idee ou mieux une solution, je suis preneur.

    merci d'avance.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    As tu bien fermé le curseur et commité avant de dropper le DB Link ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    oui, j'ai mis un commit apres le close ( sans savoir pourquoi il faut le mettre) mais cela ne change rien pour l'erreur.

    autre precision : lorque que je precompile ma proc ( @ma_proc), je peux lancer le DROP apres ???????

    -----------------------------------------------------------------------------------
    voci le code de ma proc

    create or replace procedure trait_enseignant(SID IN varchar2, LINK IN varchar2, ID IN varchar2, AUTH IN varchar2)
    is
    date_trait date :=sysdate;
    nom_trait varchar2(15) := 'ENSEIGNANT';
    tab_gri varchar2(50) := 'enseignant';
    tab_apo varchar2(50) := 'personnel';
    tab_trt varchar2(50) := 'trait_apogee';
    sql_smt varchar2(2000) ;
    msg varchar2(300) ;
    pb_trait exception;
    begin
    -- affectation des variables passees en parametre
    begin
    -- ouverture database link via sql dynamic :"execute immediate"
    sql_smt := 'create database link '||LINK||' connect to '||ID||' identified by '||AUTH||' using '||SID;
    execute immediate sql_smt;
    EXCEPTION
    when others then
    msg := 'Pb ouverture database link';
    insert into trait_apogee values(date_trait,nom_trait,msg,'KO',sysdate);
    commit;
    raise pb_trait ; -- sortie du traitement
    end;
    -- traitement du personnel venant d'APOGEE vers GRILLE
    tab_apo := tab_apo||'@'||LINK;
    declare
    boucle integer := 0;
    rec_per personnel@apot%rowtype;
    cmp_gri enseignant.cod_cmp_gri%type;
    cursor PER is
    select distinct(apo.cod_per), apo.cod_scc,apo.cod_etb, apo.cod_cmp,apo.lib_nom_usu_per,apo.lib_nom_pat_per
    ,apo.lib_pr1_per,apo.lib_ad1_per,apo.lib_ad2_per,apo.lib_ad3_per,apo.num_tel_per
    from personnel@apot apo, enseignant gri
    where apo.cod_per = gri.cod_per_apo(+)
    and apo.tem_en_sve_per = 'O'
    and apo.cod_cmp in (select cod_cmp_ens from cmp_enseignant)
    and gri.cod_per_apo is null;
    begin
    -- boucle de traitement sur le curseur
    open PER;
    commit;
    FETCH PER into rec_per.cod_per, rec_per.cod_scc,rec_per.cod_etb,rec_per.cod_cmp,rec_per.lib_nom_usu_per,rec_per.lib_nom_pat_per
    ,rec_per.lib_pr1_per,rec_per.lib_ad1_per,rec_per.lib_ad2_per,rec_per.lib_ad3_per,rec_per.num_tel_per;
    boucle := boucle +1;
    LOOP
    exit when PER%notfound;
    begin
    -- init composante grille en fonction composante enseignant
    sql_smt := 'select cod_cmp_gri from cmp_grille where cod_cmp_gri = :1';
    execute immediate sql_smt into cmp_gri using rec_per.cod_cmp;
    dbms_output.put_line('Pb traitement:cmp : '||SQLCODE||' '||SQLERRM);
    exception
    when no_data_found then
    cmp_gri := 'MIM';
    when others then
    cmp_gri := 'MIM';
    end;
    -- insertion du nouvel enseignant ds la table ENSEIGNANT
    /*insert into enseignant ( cod_per_apo, cod_scc, cod_etb, cod_cmp_gri, cod_cmp_ens, lib_nom_usu_per, lib_nom_pat_per, lib_pr1_per,
    lib_ad1_per, lib_ad2_per, lib_ad3_per, num_tel_per, tem_en_sve_ens, dat_cre_ens)
    values(rec_per.cod_per, rec_per.cod_scc, rec_per.cod_etb, cmp_gri, rec_per.cod_cmp, rec_per.lib_nom_usu_per, rec_per.lib_nom_pat_per
    , rec_per.lib_pr1_per, rec_per.lib_ad1_per ,rec_per.lib_ad2_per ,rec_per.lib_ad3_per ,rec_per.num_tel_per, 'O', sysdate);
    commit;*/
    FETCH PER into rec_per.cod_per, rec_per.cod_scc,rec_per.cod_etb,rec_per.cod_cmp,rec_per.lib_nom_usu_per,rec_per.lib_nom_pat_per
    ,rec_per.lib_pr1_per,rec_per.lib_ad1_per,rec_per.lib_ad2_per,rec_per.lib_ad3_per,rec_per.num_tel_per;
    boucle := boucle +1;
    END LOOP;
    msg := PER%ROWCOUNT||' enseignants mis à jour.';
    close PER;
    commit;
    -- insertion resultat du traitement ds TRAIT_APOGEE
    insert into trait_apogee values(date_trait,nom_trait,msg,'OK',sysdate);
    commit;
    EXCEPTION
    when others then
    msg := 'Pb traitement : '||SQLCODE||' '||SQLERRM;
    insert into trait_apogee values(date_trait,nom_trait||0,msg,'KO',sysdate);
    insert into trait_apogee values(date_trait,nom_trait||1,sql_smt,'KO',sysdate);
    commit;
    end;
    begin
    -- fermeture du lien par drop
    sql_smt := 'drop database link '||LINK;
    execute immediate sql_smt;
    EXCEPTION
    when others
    then
    msg := 'Pb fermeture database link';
    insert into trait_apogee values(date_trait,nom_trait||2,msg,'KO',sysdate);
    commit;
    end;
    -- traitement des exceptions
    EXCEPTION
    when pb_trait
    then
    dbms_output.put_line(' le traitemment ne sait pas termine correctement');
    when others
    then
    dbms_output.put_line(' erreur '||SQLCODE||' '||SQLERRM);
    end;
    /

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    merci d'utiliser les balises [code]... là c'est illisible désolé

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Je pense effectivement que ton DB Link est utilisé.

    Regarder ce que donne les requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from v$DBLINK 
     
    ALTER SESSION CLOSE DATABASE LINK ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    excuser moi, je suis novice sur les forum
    je ne sais pas ce que c'est de mettre une balise CODE

    mais j'ai bien effectue un commit apres le close.


    je ne comprends pas pourquoi on doit commiter apres l'OPEN et le CLOSE du curseur ?

    est-ce le fait du lien DBLINK ou il faut le faire à chaque fois que l'on doit utiliser un curseur explicite ou meme plusieurs imbriques.

    c'est ma premiere proc un peu compliquee, et j'en ai d'autres plus hard avec 5 ou 6 fichiers en entree et 5 ou 6 en sortie.

    j'ai consulte la doc sur DBLINK, mais il n'y a pas d'exemple en PROC

    mon souci est que mon DBA ne veut pas que je garde le lien ouvert en permanence donc je le cree pour chaque traitement

    voila, j'espere avoir ete un peu plus clair.

    merci

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    règles du forum

    Il faut commiter pour libérer le verrou sur le DB Link, merci de tester l'occupation du DB Link avec les reqûêtes que je t'ai fourni avant de chercher plus avant

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    je ne vois pas de close database link dans ta procédure --> tu ne peux dès lors pas le dropper puisque celui-ci est encore ouvert

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    effectivement, il manquait la fermeture de la connexion à la base distante:

    alter session close database link nom_data_base_link;

    apres je peux effectuer :

    drop database link nom_data_base_link;


    ??? ce que je comprends pas, c'est dans le cas ou je n'ouvre pas de curseur, c'est à dire un insert avec select, je n'ai aucun pb pour droper ma database link.


    sinon merci à vous deux pour votre temps et vos precieux renseignements.

    a plus

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    tout simplement parce que si n'utilise pas ton curseur, tu n'utilises pas ton db link ...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    ok,

    mais le select et l'insert se font sur une table faisant partie de la base distante.

    donc cela veut dire que ds un curseur implicite la fermerture se fait aussi implicitement ??

    apres je ne enuierais plus, promis.

    a plus

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    si tu avais utilisé la balise code tu verrais plus facilement que les insert dont tu parles ne font pas appel au db link ...


  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    ?? c'est quoi la balise Code

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    cf l'icone Code losque tu réponds et les régles du forum

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    ok j'ai compris merci

    je ferai mieux la prochaine fois

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2013, 12h20
  2. Réponses: 0
    Dernier message: 11/06/2012, 17h30
  3. Liens entre bases de données hétérogènes
    Par Velodrom dans le forum Oracle
    Réponses: 1
    Dernier message: 17/03/2006, 10h34
  4. Lien de base de donnée
    Par Maglight dans le forum Oracle
    Réponses: 16
    Dernier message: 27/12/2005, 11h22

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