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 :

SQL dynamique - Récupérer tous les champs sauf certains


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Par défaut SQL dynamique - Récupérer tous les champs sauf certains
    Bonjour à tous,

    Je suis en 9i. [PL/SQL]

    En fait j'aimerai beaucoup que vous m'aidiez à construire une requête dynamiquement en récupérant les champs de sélection dans la table "user_tab_columns".

    En fait le but est de récupérer tous les champs sauf certains.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from user_tab_columns where table_name='TARTICLE'
    and column_name <> 'ETATOBJET'
    Après la construction de la requête on l'exécute avec EXECUTE IMMEDIATE.

    En vous remerciant d'avance.
    Boutss

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    un execute immediate d'un select, ça te sert à quoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SQL> exec execute immediate 'select * from emp'
     
    PL/SQL procedure successfully completed.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Si on est sûr que la requête ne retourne qu'une seule ligne, on peut utiliser EXECUTE IMMEDIATE et récupérer le résultat dans des variables avec la clause INTO: voir l'exemple 8.1 dans le Application Developer's Guide - Fundamentals.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Par défaut
    En fait je me suis peut-être un peu avancé.
    Je pensais que le execute immédiate permettait d'exécuter une requête sql dynamique.

    Au temps pour moi.

    Non en fait le résultat retournera plusieurs un grand nombre de ligne et sera stocké dans un fichier texte via spool.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par boutss
    En fait je me suis peut-être un peu avancé.
    Je pensais que le execute immédiate permettait d'exécuter une requête sql dynamique.

    Au temps pour moi.

    Non en fait le résultat retournera plusieurs un grand nombre de ligne et sera stocké dans un fichier texte via spool.

    avec execute immediate et into ça me parait tiré par les cheveux, car tu feras into quoi?

    par contre je vois bien


    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
     
    SQL> var r refcursor
    SQL> declare
      2    str varchar2(4000);
      3    first boolean;
      4  begin
      5    str := 'select ';
      6    first := true;
      7    for f in (
      8      select column_name
      9      from user_tab_columns
     10      where table_name='EMP'
     11      and column_name!='EMPNO'
     12      order by column_id)
     13    loop
     14      if first then
     15        first:=false;
     16      else
     17        str:=str||',';
     18      end if;
     19      str:=str||f.column_name;
     20    end loop;
     21    str := str||' from emp';
     22    open :r for str;
     23  end;
     24  /
     
    PL/SQL procedure successfully completed.
     
    ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
    ---------- --------- ---------- --------- ---------- ---------- ----------
    SMITH      CLERK           7902 17-DEC-80        800                    20
    ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
    WARD       SALESMAN        7698 22-FEB-81       1250        500         30
    JONES      MANAGER         7839 02-APR-81       2975                    20
    MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
    BLAKE      MANAGER         7839 01-MAY-81       2850                    30
    CLARK      MANAGER         7839 09-JUN-81       2450                    10
    SCOTT      ANALYST         7566 19-APR-87       3000                    20
    KING       PRESIDENT            17-NOV-81       5000                    10
    TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
    ADAMS      CLERK           7788 23-MAY-87       1100                    20
    JAMES      CLERK           7698 03-DEC-81        950                    30
    FORD       ANALYST         7566 03-DEC-81       3000                    20
    MILLER     CLERK           7782 23-JAN-82       1300                    10
     
    14 rows selected.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Par défaut
    Merci Laurent,

    Et autres d'ailleurs aussi...

    Mais l'instruction
    n'écrit pas dans le spool comme un select classique.

    Dois-je faire une boucle pour écrire dans le spool ?

    En même temps le refcursor déclaré avant la partie declare, est-ce une variable globale ?

    Merci.

  7. #7
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Par défaut Avantages de EXECUTE IMMEDIATE
    En PL/SQL, le recours à EXECUTE IMMEDIATE mysql est nécessaire pour

    1) les instructions SQL de DDL (DATA DEFINITION LANGUAGE) comme DROP ou CREATE TABLE.

    2) les instructions SQL de DML (DATA MANIPULATION LANGUAGE) comme SELECT ou INSERT lorsque l'on veut construire dynamiquement le SQL en transmettant des valeurs de variables à la clause WHERE.

    mysql = 'SELECT * FROM clients WHERE ville = :a;'
    EXECUTE IMMEDIATE mysql USING variable_ville;

    Dans ton cas, le simple select ... ne justfie effectivement pas son emploi mais je suppose que ton besoin en SQL dynamque concerne l'étape suivante :
    Intégrer la liste de colonnes obtenue dans le SQL de l'étape suivante.

    Au passage, je préfère
    and column_name != 'ETATOBJET'
    au
    and column_name <> 'ETATOBJET'

    Bonne journée
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Par défaut
    Dans ton cas, le simple select ... ne justfie effectivement pas son emploi mais je suppose que ton besoin en SQL dynamque concerne l'étape suivante :
    Intégrer la liste de colonnes obtenue dans le SQL de l'étape suivante.
    C'est exactement ça !

  9. #9
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862

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

Discussions similaires

  1. comment sélectionner tous les champ sauf quelques uns
    Par r0d dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2006, 09h34
  2. Récupérer tous les champs avec un DISTINCT
    Par Le Mérovingien dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/11/2005, 23h58
  3. Tous les champs SAUF dans une table.
    Par Yepazix dans le forum Bases de données
    Réponses: 1
    Dernier message: 28/08/2005, 16h01
  4. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 13h26
  5. selectionner tous les champs sauf un ?
    Par HULK dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/01/2005, 15h51

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