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 :

Requête dynamique et where clause


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Par défaut Requête dynamique et where clause
    Bonjour à tous,

    J'ai créé la procédure ci-dessous qui doit me remonter des informations "Contact". En input de cette procédure j'ai n variables non obligatoire en possible critère de recherche. J'ai 2 critères de recherches obligatoires mais peu importe lesquels. Aussi, je ne sais jamais quel est le 1er critère que je vais utiliser ni le dernier.
    Du coup, je ne parviens pas à positionner mon 1er "AND".
    Dans mon exemple, je me retrouve avec 2 "AND" : "AND AND ...."

    Auriez-vous une methode à me proposer ?

    Merci,
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    CREATE OR REPLACE PROCEDURE Proxi_Scan_Req_Lieu_Occ (LIEU_ADDR IN VARCHAR2,LIEU_ZIPCODE IN VARCHAR2,LIEU_CITY IN VARCHAR2,BAT_NAME IN VARCHAR2,BAT_ENTRY IN VARCHAR2,LIEU_ETAGE IN VARCHAR2,LIEU_NUM IN VARCHAR2,OCC_CELL_PH IN VARCHAR2,OCC_WORK_PH IN VARCHAR2,OCC_HOME_PH IN VARCHAR2,CLT_NAME IN VARCHAR2,OCC_LST_NAME IN VARCHAR2,OCC_FST_NAME IN VARCHAR2,GRP_NAME IN VARCHAR2, CR_LIEU_OCC OUT SYS_REFCURSOR) AS
     
     
    	--sSearchSpec VARCHAR2(10000);
    	sqlstring VARCHAR2(30000);
    	sqlstring2 VARCHAR2(30000);
     
    BEGIN
     
    IF (LIEU_ADDR IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Lieu.ADDR = ' || '''' || LIEU_ADDR || ''' ';
    END IF;
     
    IF (LIEU_ZIPCODE IS NOT NULL) THEN 
    sqlstring := sqlstring || ' AND Lieu.ZIPCODE = ' || '''' || LIEU_ZIPCODE || ''' ';
    END IF;
     
    IF (LIEU_CITY IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Lieu.CITY = ' || '''' || LIEU_CITY || ''' ';
    END IF;
     
    IF (OCC_LST_NAME IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Occupant.LAST_NAME = ' || '''' || OCC_LST_NAME || ''' ';
    END IF;
     
    IF (OCC_FST_NAME IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Occupant.FST_NAME = ' || '''' || OCC_FST_NAME || ''' ';
    END IF;
     
    IF (BAT_NAME IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Batiment.NAME = ' || '''' || BAT_NAME || ''' ';
    END IF;
     
    IF (BAT_ENTRY IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Entree.DESCRIPTOR = ' || '''' || BAT_ENTRY || ''' ';
    END IF; 
     
    IF (LIEU_ETAGE IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Lieu_Ext.X_ETAGE = ' || '''' || LIEU_ETAGE || ''' ';
    END IF;
     
    IF (LIEU_NUM IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Lieu_Ext.X_NUM = ' || '''' || LIEU_NUM || ''' ';
    END IF;
     
    IF (OCC_CELL_PH IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Occupant.CELL_PH_NUM = ' || '''' || OCC_CELL_PH || ''' ';
    END IF;
     
    IF (OCC_WORK_PH IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Occupant.WORK_PH_NUM = ' || '''' || OCC_WORK_PH || ''' ';
    END IF;
     
    IF (OCC_HOME_PH IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Occupant.HOME_PH_NUM = ' || '''' || OCC_HOME_PH || ''' ';
    END IF;
     
    IF (CLT_NAME IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Client.NAME = ' || '''' || CLT_NAME || ''' ';
    END IF;
     
    IF (GRP_NAME IS NOT NULL) THEN
    sqlstring := sqlstring || 'AND Groupe.NAME = ' || '''' || GRP_NAME || ''' ';
    END IF;  
     
        OPEN CR_LIEU_OCC FOR
     
    /* ********************  RECHERCHE DU LIEU/CONTACT ********************* */
    SELECT  
      Lieu.ROW_ID "Lieu : Id", 
    FROM 
      S_ORG_EXT Groupe,
      S_ADDR_PER Lieu,
      S_ADDR_PER_CUTX Lieu_Ext,
      S_CONTACT Occupant,
      S_LST_OF_VAL Lov_Groupe,
      ...
      S_DOC_AGREE Contrat,
      S_ORG_EXT CLIENT
    WHERE Lov_Groupe.TYPE = 'PROXI_CATEGORIE_GROUPE'   			-- LOV TYPE
      ...
      AND Contrat.TARGET_OU_ID = CLIENT.ROW_ID				-- Lien Contrat / Client
      AND sqlstring2 = '''' || sqlstring || ''' ';
     
     
    END Proxi_Scan_Req_Lieu_Occ;
    /

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    merci d'éditer le message et d'utiliser la balise code (le #)

    Ce que je fais habituellement :
    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
    DECLARE
    v_join VARCHAR2(5);
    v_where VARCHAR2(2000);
    BEGIN
     IF p_1 IS NOT NULL
    THEN
     v_where := v_where || v_join || 'col1 = '|| p_1;
     v_join := ' AND ';
    END IF;
     IF p_2 IS NOT NULL
    THEN
     v_where := v_where || v_join || 'col2 = '|| p_2;
     v_join := ' AND ';
    END IF;
    ..
    END;

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Citation Envoyé par kinoboy44 Voir le message
    Du coup, je ne parviens pas à positionner mon 1er "AND".
    Dans mon exemple, je me retrouve avec 2 "AND" : "AND AND ...."
    Moi je commence par WHERE 1=1.

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Par défaut
    Merci pour ton retour. C'est efficace

    Citation Envoyé par skuatamad Voir le message
    Moi je commence par WHERE 1=1.

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

Discussions similaires

  1. BETWEEN dynamique dans la clause WHERE
    Par Maniz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/06/2012, 15h30
  2. Requête paramétrée avec une clause where IN(?)
    Par khayyam90 dans le forum JDBC
    Réponses: 4
    Dernier message: 22/02/2012, 12h50
  3. Réponses: 2
    Dernier message: 01/01/2009, 20h52
  4. Requête sql dans une clause Where
    Par PrinceMaster77 dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/07/2006, 11h30
  5. Requête dynamique en pagination
    Par pascal_fluck@hotmail.com dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/03/2005, 16h04

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