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

SQL Oracle Discussion :

La chasse aux dblinks


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut La chasse aux dblinks
    Bonjour a tous

    -- Oracle 11g, linux 5

    Je suis en train de creer un graph avec "R"
    qui est destiné a desiner un MAP des dblinks d'une base de données. J'arrive a un resultat pas trop mal (je donne le script R a tous ceux qui seront interessés).
    Mais il y a une fonction que je n'arrive pas a desiner. Le graph affiche la quantité de dblink public, la quantité de dblink <> public et desine une ligne qui va vers la destination.
    Je voudrais pouvoir desiner en rouge les dblink qui n'arrive nulle part...

    Par exemple ce dblink fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select count(1) from dual@monlink;
     
      COUNT(1)
    ----------
             1
    et celui ci ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     select count(1) from dual@ORAC4;
    select count(1) from dual@ORAC4
                              *
    ERROR at line 1:
    ORA-02019: connection description for remote database not found
    Mon probleme est de capturer ce resultat. Lorsque le resultat est 1 c'est ok mais lorsque le dblink ne fonctionne pas j'ai un ORA-
    Et je sais pas le capturer avec une simple requête SQL, je ne souaite pas utiliser PL car avec R je sais pas trop comment recuperer la sortie.

    l'ideal serait un decode ou un case de la requete select count(1) from dual@

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select case count(1) when 1 then 1 else 0 end from dual@LINK;
    Avec ce CASE si le dblink existe j'obtient : 1 mais s'il n'existe pas j'ai pas 0 j'ai le ORA-
    sniff

    Quelqu'un a une idée ?

    D'avance merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    je ne souaite pas utiliser PL car avec R je sais pas trop comment recuperer la sortie.
    Et avec une fonction pipeline pour catcher l'exception et renvoyer 0 ?

  3. #3
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonsoir

    je viens de regarde la doc de pipelined... je vois pas comment l'utiliser a partir d'une requête.
    Dans la doc ils parlent de bloc PL...
    T'as pas un exemple ?
    D'avance merci

  4. #4
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Tu ne vas pas pouvoir catcher tes erreurs et exception directement en sql. C'est pas vraiment fait pour.

    Par contre, effectivement, en PL, tu vas pouvoir le faire
    Tu vas retrouver un bloc classic en PL de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE
       LE$Fin  Exception ;
       …
    Begin
       …..
       Raise LE$Fin ;
       …
    EXCEPTION
       WHEN LE$Fin Then
           ……….
    END ;
    Dans ta partie exception, c'est la que tu vas pouvoir gerer ton cas d'erreur.
    http://sheikyerbouti.developpez.com/...age=Chap1#L1.3

  5. #5
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut
    oui en PL pas de probleme.. Bon alors je vais essayer de placer du code PL dans "R".
    Je passerais les commentaire ici si je trouve une solution qui fonctionne.

    Merci a tous !

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Pas forcément besoin d'une fonction pipelined une fonction table suffit.
    Je pensais à un truc comme ça :
    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
    SQL> create or replace function func_test_dblink (p_dblink in varchar)
      2  return sys.odcinumberlist
      3  as
      4    dblink_fail EXCEPTION;
      5    PRAGMA EXCEPTION_INIT(dblink_fail, -2019);
      6    l_tab sys.odcinumberlist := sys.odcinumberlist();
      7  begin
      8    l_tab.extend;
      9    execute immediate 'select 1 into l_tab(l_tab.last) from dual@'||p_dblink;
     10    return l_tab;
     11  exception
     12    when dblink_fail then
     13      l_tab(l_tab.last) := 0;
     14      return l_tab;
     15  end;
     16  /
     
    Function created.
     
    SQL> select * from table(func_test_dblink('TOTO'));
     
    COLUMN_VALUE
    ------------
               0
     
    SQL>
    Après on peut améliorer la fonction pour qu'elle renvoie la liste des dblinks avec le code asssocié.

    Et donc ce qui est pratique c'est que dans R on passera une requête SQL et pas du code PL/SQL qui reste stocké dans Oracle.

  7. #7
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonsoir
    a pas mal, et bien je vais essayer.

    avec le retour de la fonction c'est sufisant, vue que avec R j'utilise juste le code de retour pour filtrer.
    Genial

    Merci a tous !

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ou même une fonction simple non ?
    Nota : je n'ai pas été aussi loin que skuatamad dans la gestion des erreurs.
    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
    create or replace function func_test_dblink (p$_dblink  varchar2)
    return pls_integer
    is
    begin
        execute immediate 'select 1 from dual@' || func_test_dblink.p$_dblink;
        return 1;
     
        exception when others then
            return 0;
    end;
    /
     
    select func_test_dblink('NEXISTEPAS') as rtr from dual;
     
           RTR
    ----------
             0 
     
    select func_test_dblink('EXISTE')     as rtr from dual;
     
           RTR
    ----------
             1
    Sinon Oracle propose un Oracle R Enterprise, mais je ne connais pas les services rendus.

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ou même une fonction simple non ?
    Ah oui

    Quand j'ai proposé la fonction pipelined j'étais plus ambitieux avec la possibilité de récupérer tous les dblink et le code associé en un coup.
    Puis quand j'ai implémenté le test je suis resté sur l'idée mais comme je n'avais pas de dblink créés sur mon XE je me suis limité à un test d'un seul dblink envoyé en paramètre...

    Du coup c'est complètement inutilement complexe.

  10. #10
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonjour a tous

    alors voila je suis de retour de vacances... C'est trop dur.
    Enfin bref, j'ai repris le script R et je suis arrivé a un resultat. Pour tous ceux qui seraient interessés voici l'explication et le code.
    Le script se connecte a une base de donnée via ODBC, donc dans R vous devez installer le package RODBC
    Une fois installé, vous pouvez faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    library("RODBC")
    con <- odbcConnect("ALIASODBC", uid="user", pwd="xxxxxxx",believeNRows=FALSE )
    Une fois connecté le script compte la quantité de dblinks de type public et non public.
    Pour chaque cathegorie, le script desine une ligne verte pour les dblink qui repondent et rouge pour ceux qui ne repondent pas.
    Au bout de la ligne vous avez le nom du dblink et le nom de la destination avec le format: nom_destination
    Le script ouvre une fenêtre de 200 par 200 et le contenu est affiché de forme dinamique selon la quantité de dblink a afficher.
    Je n'ai pas testé avec une quantité > a 50 dblinks... donc le resultat peu être tres horrible s'il y a beaucoup de dblinks.
    Je vous laisse le script pour si qq'un veux essayer.

    R est très puissant, je ne connaissais pas et en quelques jours j'ai reussi a creer un graph (pas beau) mais util.

    A plus et merci pour l'aide
    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
    # Conexion a la base de datos por odbc
    library("RODBC")
    con <- odbcConnect("bico", uid="qq372719", pwd="xxxxxxx",believeNRows=FALSE )
     
    # Querys para sacar la info que necesitamos
    dbName <- sqlQuery(con, "SELECT instance_name, host_name from v$instance",errors=FALSE)
    nbrbdlinks <- sqlQuery(con, "SELECT count(1) as NBR from dba_db_links where owner <>'PUBLIC'",errors=FALSE)
    nbrPbdlinks <- sqlQuery(con, "SELECT count(1) as NBR from dba_db_links where owner='PUBLIC'",errors=FALSE)
    dest <- sqlQuery(con, "SELECT DB_LINK, substr(host,1,10) HOST from dba_db_links where owner <>'PUBLIC'",errors=FALSE)
    destP <- sqlQuery(con, "SELECT substr(host,1,10) HOST from dba_db_links where owner = 'PUBLIC'",errors=FALSE)
     
    linkName <- sqlQuery(con, "select db_link from dba_db_links where owner <>'PUBLIC'", errors=FALSE)
    PlinkName <- sqlQuery(con, "select db_link from dba_db_links where owner='PUBLIC'", errors=FALSE)
     
    # Empieza el dibujo aqui
    # Info general
    plot(c(1, 200), c(1, 200), type= "n", xlab = "", ylab = "")
    title (main = paste0("Mapa de los dblinks del entorno: ", dbName$INSTANCE_NAME, "_", 
           dbName$HOST_NAME),sub="Luis Diaz - Emergencies & improvments")
     
    # Repartition de dblinks por tipo (publico o no)
    text(35,203,cex=0.8,"dbLinks no públicos")
    rect(40, 180, 60, 200, density = 0, lty=2,border = "green")
    text(45,190,paste0(nbrbdlinks))
     
    text(175,203,cex=0.8,"dbLinks públicos")
    rect(180, 180, 200, 200, density = 0,border = "yellow")
    text(185,190,paste0(nbrPbdlinks))
     
    ## Pintar los destinos de los dblinks NO PUBLICOS
    for(row in 1:nrow(linkName)){
    	query <- paste0("select count(1) from dual@", linkName$DB_LINK[row])
    	test <- sqlQuery(con, query)
     
    	if (test[1]=='1'){
    		segments(45,180, (((row-1)*200/nbrbdlinks$NBR)+5), 80, col= 'green')
    	}else{
    		segments(45,180, (((row-1)*200/nbrbdlinks$NBR)+5), 80, col= 'red')
    	}
     
    	text ((((row-1)*200/nbrbdlinks$NBR)+5),45, cex=0.5, paste(dest$DB_LINK[row], '_', dest$HOST[row]),srt=90)
    }
     
    ## Pintar los destinos de los dblinks PUBLICOS
    for(rowP in 1:nrow(PlinkName)){
    	queryP <- paste0("select count(1) from dual@", PlinkName$DB_LINK[rowP])
    	testP <- sqlQuery(con, queryP)
     
    	if (testP[1]=='1'){
    		segments(185,180, (((rowP-1)*200/nbrbdlinks$NBR)+180), 130, col= 'green')
    	}else{
    		segments(185,180, (((rowP-1)*200/nbrbdlinks$NBR)+180), 130, col= 'red')
    	}
     
    	text ((((rowP-1)*200/nbrbdlinks$NBR)+180),125, cex=0.5, paste(dest$DB_LINK[rowP], '_', dest$HOST[rowP]))
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/02/2010, 10h23
  2. Chasse aux Warnings générés par Utilcls.h
    Par JeanNoel53 dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2009, 19h41
  3. La chasse aux bugs (jeu d'Echecs)
    Par Sub0 dans le forum Développement 2D, 3D et Jeux
    Réponses: 117
    Dernier message: 06/11/2008, 09h46
  4. [Upload] la chasse aux dossiers vides
    Par tremeur53 dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2007, 17h54
  5. La chasse aux fuites de mémoire
    Par TocTocKiéLà? dans le forum Choisir un environnement de développement
    Réponses: 4
    Dernier message: 02/09/2007, 20h35

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