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 :

select avec un long


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 3
    Par défaut select avec un long
    Salut,
    J'utilise la version 9.2 d'Oracle.
    Et en fait j'aimerais savoir comment selectionner a pattir d'un where qui s'appliquera sur un long comme predicat
    je veux selectionner toutes les vues de la vue dba_views a partir d'un critere sur le texte:
    select view_name from dba_views where text like '%where%';

    je veux toutes les vues dont les définitions contiennent la clause where.
    cependant where ne s'applique pas avec un predicat sur un long et il met par consequent erreur
    ORA-00932: inconsistent datatypes: expected NUMBER got LONG
    alors comment faire??

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Effectivement, LIKE est interdit sur un LONG.

    Voila un package qui permet de s'affranchir de cette limite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE PACKAGE long_util authid current_user IS
     
    FUNCTION substring(insql in varchar2, leng in number, startpos in number)
    RETURN varchar2;
     
    FUNCTION likestr(insql in varchar2, pat in varchar2)
    RETURN NUMBER;
     
    end long_util;
    /
    show errors;
    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
    63
    64
    65
    66
    67
    CREATE OR REPLACE PACKAGE BODY long_util IS
     
    FUNCTION substring(insql in varchar2, leng in number, startpos in number)
    RETURN varchar2
    is
    sts number;
    stringsegment varchar2(4000);
    v_CursorID INTEGER;
    bytesread number;
    begin
    v_CursorID := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(v_CursorID, insql, DBMS_SQL.V7);
    DBMS_SQL.DEFINE_COLUMN_LONG(v_CursorID, 1);
    sts := DBMS_SQL.EXECUTE_AND_FETCH(v_CursorID);
    bytesread := leng;
    stringsegment := NULL;
    DBMS_SQL.COLUMN_VALUE_LONG(v_CursorID, 1, leng, startpos,
    stringsegment, bytesread);
    DBMS_SQL.CLOSE_CURSOR(v_CursorID);
    return stringsegment;
    EXCEPTION
    WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(v_CursorID);
    RAISE;
    end;
     
    FUNCTION likestr(insql in varchar2, pat in varchar2)
    RETURN number
    is
    startpos number;
    sts number;
    leng number;
    patlen number;
    chunksize number;
    stringsegment varchar2(4000);
    v_CursorID INTEGER;
    bytesread number;
    begin
    v_CursorID := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(v_CursorID, insql, DBMS_SQL.V7);
    DBMS_SQL.DEFINE_COLUMN_LONG(v_CursorID, 1);
    sts := DBMS_SQL.EXECUTE_AND_FETCH(v_CursorID);
    patlen := length(pat);
    chunksize := 4001 - patlen;
    bytesread := 4000;
    startpos := 0;
    while bytesread = 4000 loop
    DBMS_SQL.COLUMN_VALUE_LONG(v_CursorID, 1, 4000, startpos,
    stringsegment, bytesread);
    startpos := startpos + chunksize;
    IF bytesread > 0 THEN
    if stringsegment like pat then
    DBMS_SQL.CLOSE_CURSOR(v_CursorID);
    return 1;
    end if;
    END IF;
    end loop;
    DBMS_SQL.CLOSE_CURSOR(v_CursorID);
    return 0;
    EXCEPTION
    WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(v_CursorID);
    RAISE;
    end;
    END long_util;
    /
    show errors
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select constraint_name, search_condition
    from dba_constraints
    where (constraint_type = 'C')
    and (owner = 'GAPDEV101')
    and (
    long_util.likestr(
    'select search_condition from dba_constraints where '||
    'constraint_name='''||constraint_name||''' and owner='''||owner||'''',
    '%LOC_TYPE IN%')>0)

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 3
    Par défaut
    Oui je vois mais y'aurait il pas un autre moyen sans avoir a installé ce package ??

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    non

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 3
    Par défaut
    OK merci

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut
    Bonjour,

    J'ai créer le package que vous avez créé dans ma base Oracle et j'ai vérifié le sql indiqué (donné comme exemple) pour la recherche d'une chaîne de caractère string dans la table dba_constraints avec succès.

    Par contre, lorsque je veux rechercher une chaîne de caractère dans la table dba_views, cela ne fonctionne pas ou sinon mon sql n'est pas correct.

    Voici le sql que j'exécute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select view_name, text
      from dba_views
     where owner = 'SARIDRO'
       and (long_util.likestr(
                             'select text from dba_views where ' ||
                             'owner= '''|| owner ||'''', '%abcxxx%') > 0 
           );


    Pouvez-vous me dire si c'est un erreur dans la procèdure ou mon sql?

    Merci pour votre aide.

    Saridro

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    probablement la condition WHERE qui n'est pas bonne... notamment à cause de la casse et des retours chariots.

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut
    Ok, je viens de supprimer toute la cluase where, le retour chariot et malheureusement c'est toujours pareil. On ne retrouve rien.

    Voici le sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT view_name, text
      FROM dba_views
     WHERE owner = 'SARIDRO'
       AND (long_util.likestr('select text from dba_views','%abcxxx%') > 0);
    Dommage.

    Merci pour ton intervention

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu n'as pas compris mon message. Il n'y a probablement pas de vue qui contient : ''select text from dba_views"... par exemple ça peut être : "SELECT text FROM dba_views".

    Es-tu bien certain que le texte est bien présent tel quel ?

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

Discussions similaires

  1. Select avec bcp d'option = chargement trop long
    Par gato18 dans le forum Langage
    Réponses: 2
    Dernier message: 09/05/2012, 10h27
  2. Oracle 8 : INSERT SELECT avec NOT IN trop long
    Par davy.g dans le forum Oracle
    Réponses: 6
    Dernier message: 03/07/2007, 11h33
  3. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  4. pb de select avec size avec choix multiple
    Par La_picolle dans le forum ASP
    Réponses: 10
    Dernier message: 28/08/2003, 15h21
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04

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