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 963
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    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, 11h15
  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, 11h14
  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, 14h15
  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, 00h43
  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, 21h02

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