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 :

Extraction db_link d'une requête [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Par défaut Extraction db_link d'une requête
    Bonjour,

    Nous avons activé l'audit trail Oracle sur une base de données.

    Nous souhaitons à partir de la colonne SQLTEXT de la table SYS.AUD$ qui contient les query des utilisateurs, extraire pour chaque requête le nom des db_link utilisaient.

    J'avais créé la fonction ci-dessous qui fonctionnait correctement dans mon environnement de TEST.
    Seulement on est en train de réaliser un POC et la procédure d'extraction est tombée sur une requête d'un utilisateur qui fait 9000 caractères.

    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
    57
    58
    59
    60
    61
    62
    CREATE OR REPLACE FUNCTION SYS.F_CHU_GET_DB_LINK_NAME (v_query IN VARCHAR2, v_username IN VARCHAR2) RETURN VARCHAR2 IS
        -- Variable pour la query en VARCHAR2
        v_query_char    VARCHAR2(32000);
        -- Variable INDEX pour parcourir la requete
        j_num           NUMBER;
        i_num           NUMBER;
        -- Variable pour formatter le retour liste des db_link
        v_db_link_name  VARCHAR2(500);
        v_db_link_lst   VARCHAR2(500);
        -- Pour compter si db_link existe
        v_count         INTEGER;
        -- Variable requete SQL
        v_sql           VARCHAR2(2200);
    BEGIN
        -- Venant d'un CLOB il est possible qu'il y ait des retour chariot, on les supprime
        v_query_char := replace(v_query,chr(10),'');
        -- Verification si un @ se trouve dans la requete
        IF UPPER(v_query_char) LIKE '%@%' THEN
            i_num:= 1;
            -- On separe avec le @
            FOR I IN (SELECT REGEXP_SUBSTR(UPPER(v_query_char),'(.*?)(@|$)', 1, LEVEL, NULL, 1 ) AS value FROM DUAL CONNECT BY LEVEL <= regexp_count(UPPER(v_query_char), '@')+1)
            LOOP
                -- On ne prend pas le premier qui est avant le premier @
                IF i_num <> 1 THEN
                    j_num:= 1;
                    -- On split avec un espace
                    FOR J IN (SELECT REGEXP_SUBSTR(UPPER(i.value),'(.*?)([[:space:]]|$)', 1, LEVEL, NULL, 1 ) AS value FROM DUAL CONNECT BY LEVEL <= regexp_count(UPPER(i.value), '[[:space:]]')+1)
                    LOOP
                        IF j_num = 1 THEN
                            -- On supprime les virgules
                            v_db_link_name := REPLACE (j.value, ',','');
     
                            -- Verification si la chaine recuperee correspond bien a un db_link qui existe dans la base courante
                            v_sql := 'SELECT COUNT(*) FROM DBA_DB_LINKS WHERE DB_LINK = :v_db_link_name AND OWNER IN (''PUBLIC'', :v_username)';
                            EXECUTE IMMEDIATE v_sql INTO v_count USING v_db_link_name,v_username;
     
                            -- SI v_count different de 0 c'est que le db_link existe dans la base source
                            IF( v_count != 0 ) THEN
                                v_db_link_lst := v_db_link_lst || v_db_link_name || ',';                      
                            END IF;
                        END IF;
                        j_num := j_num +1;
                    END LOOP;
                END IF;
                i_num := i_num +1;
            END LOOP;
        ELSE
            -- Pas de @ dans le SQL_TEXT donc pas de db_link dans la requete
            v_db_link_lst := 'UNKNOWN';
        END IF;
     
        IF v_db_link_lst LIKE '%,' THEN
            -- Remove de la derniere virgule
            v_db_link_lst := SUBSTR(v_db_link_lst, 0, LENGTH(v_db_link_lst) - 1);
        ELSIF v_db_link_lst LIKE '' THEN
            v_db_link_lst := 'UNKNOWN';
        END IF;
     
        -- Retour de la variable
        return v_db_link_lst;
    END;
    /
    J'obtiens cette erreur à l'exécution de cette fonction sur la requête volumineuse.
    Rapport d'erreur -
    ORA-01460: demande d'une conversion non implémentée ou irréaliste
    01460. 00000 - "unimplemented or unreasonable conversion requested"
    L'erreur est générée sur la première boucle FOR.

    Pour le moment je n'arrive pas à trouver de solution à mon problème.
    Surement que ma fonction n'est pas optimisé du tout ... (mais ça ce n'est pas très grave, dans ce cas il faut juste extraire les données pour les traiter ensuite sur un autre modèle de données).

    Avez-vous une idée s'il vous plait ?

    Merci d'avance pour votre aide,

    Matt

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    Si SYS.AUD$.sqltext est un CLOB pourquoi déclarez-vous des VARCHAR2 ?

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Par défaut
    Bonjour,

    En effet, c'est mieux.
    Merci pour ton aide,
    Matt

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

Discussions similaires

  1. [AC-2007] Calculer le nombre de jours d'extraction dans une requête access.
    Par shakapouet dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 29/04/2014, 12h15
  2. Extraction dans une requête de données de la même table
    Par *alexandre* dans le forum Développement
    Réponses: 1
    Dernier message: 20/07/2009, 12h14
  3. Extraction de tous les Lundis du mois dans une requête
    Par cumpa100 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 07/02/2008, 15h15
  4. Extraction de données dans une requête
    Par alainGL dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 05/02/2008, 01h43
  5. [Oracle] Extraction et fragmentation des résultats d'une requête
    Par lancelotparis dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/08/2007, 22h02

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