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 :

Variables dans un .sql exécuté par sqlplus


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 28
    Points
    28
    Par défaut Variables dans un .sql exécuté par sqlplus
    Bonjour,

    Je voudrais savoir si on peut, dans un fichier .sql exécuté par SLQPLUS, utiliser des boucles, des variables, etc ?

    Je m'explique. Disons que j'ai ça par exemple :

    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
    set heading off
    set pagesize 0
    set verify off
    set linesize 245
     
    spool c:\base_01.txt
     
    select [blabla]
    from
    (
    SELECT [blabla]
    FROM [blabla]
    WHERE [blabla] LIKE '01%'
    GROUP BY [blabla]
    );
    spool off
    Or j'ai 99 fichiers base texte à créer (de base_01.txt à base_99.txt), et le LIKE 'XX%' doit varier lui aussi de '01' à '99'. Il me faudrait donc lancer 99 fois ce script en changeant à la main les lignes 6 et 13 mais je cherche une solution un peu moins... disons fastidieuse !

    Merci de votre aide.

  2. #2
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Je ne pense pas que tu pouisses faire une boucle dans un SQL Anonyme.

    Par contre si tu es sous unix, fait le dans un shell et envoi en paramètre à ton .sql le numéro à traiter !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par sygale
    Je ne pense pas que tu pouisses faire une boucle dans un SQL Anonyme.

    Par contre si tu es sous unix, fait le dans un shell et envoi en paramètre à ton .sql le numéro à traiter !
    Malheureusement ça se passe sous windows XP Par contre c'est quoi un "SQL Anonyme" ?

  4. #4
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par ekke
    Malheureusement ça se passe sous windows XP
    Rien ne t'empêche de faire un shell sous windows (fichier .bat par exemple) qui envoie en paramètre à ton fichier sql le numéro à traiter.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    J'ai une solution en PL/SQL qui nécessite de créer une procédure PL/SQL
    et qui donne le résultat voulu dans un seul fichier à part la première ligne qu'il faut supprimer:


    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
     
    set feedback off
    set heading off 
    set pagesize 0 
     
     
    create or replace procedure  fst (first in integer, last in integer, sqltext in out varchar2)
    is 
    vi VARCHAR2(10);
    begin
        for i in first..last
        loop
        if i < 10
        then
            vi := '''0' || to_char(i) || '%''';
        else
            vi := '''' || to_char(i) || '%''';
        end if;
        sqltext := sqltext || 'spool c:\base_' ||  TO_CHAR(i) || '.txt' ||  CHR(10);
        sqltext := sqltext || ' select [blabla] from (SELECT [blabla] FROM [blabla] WHERE [blabla] LIKE ';
        sqltext := sqltext || vi || CHR(10);
        sqltext := sqltext || '  GROUP BY [blabla] ; ' || CHR(10) || 'spool off' || CHR(10);
        end loop;
    end;
    /
    show errors
     
    spool s99.sql
    variable sqltext1 VARCHAR2(32767) := NULL;
    variable sqltext2 VARCHAR2(32767) := NULL;
    variable sqltext3 VARCHAR2(32767) := NULL;
    variable sqltext4 VARCHAR2(32767) := NULL;
    variable sqltext5 VARCHAR2(32767) := NULL;
    begin
    fst(1, 20, :sqltext1);
    fst(21, 40, :sqltext2);
    fst(41, 60,:sqltext3);
    fst(61, 80, :sqltext4);
    fst(81, 99, :sqltext5);
    end;
     
    print :sqltext1
    print :sqltext2
    print :sqltext3
    print :sqltext4
    print :sqltext5

  6. #6
    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
    Points : 4 926
    Points
    4 926
    Par défaut Re: Variables dans un .sql exécuté par sqlplus
    éventuellement

    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
     
    script1.sql
    set head off pages 0 ver off lin 245 
    spool base_&1..txt 
    select [blabla] 
    from 
    ( 
    SELECT [blabla] 
    FROM [blabla] 
    WHERE [blabla] LIKE '&1%' 
    GROUP BY [blabla] 
    ); 
    spool off
     
    script2.sql
    @script1 01
    @script1 02
    @script1 03
    ...
    @script1 99
    ou tu peux écrire un fichier .BAT sous dos

  7. #7
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    ddsfsd

  8. #8
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Ah le .bat je connais pas mais pour le .sql cela donnera un truc genre

    test.sql =
    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
     
    set heading off 
    set pagesize 0 
    set linesize 245 
     
    --trace les modification à l'écran ON/OFF'
    SET VERIFY OFF;
    --caractère de concaténation'
    SET CONCAT µ;
     
    --Définit le numéro a lancer 1er paramètre'
    DEFINE MY_NUM = &1;
     
    spool c:\base_&MY_NUM.txt 
     
    select &MY_NUM 
    from dual
    WHERE &MY_NUM LIKE '&MY_NUM%'; 
     
    spool off
    Et si tu lance sous sqlplus @test.sql 01 cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SQL>@test.sql 01
     
    aucune ligne sélectionnée
     
    Ecoulé : 00 :00 :00.00
    SQL>
    Fichier base_01.txt donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    aucune ligne sélectionnée
     
    Ecoulé : 00 :00 :00.00
    Rest plus qu'a faire un .bat qui se connect à la base et boucle 99 fois en lancant le test.sql

    PS : Une fois le .bvat créé, post le résultat STP

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 28
    Points
    28
    Par défaut Re: Variables dans un .sql exécuté par sqlplus
    Citation Envoyé par laurentschneider
    éventuellement

    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
     
    script1.sql
    set head off pages 0 ver off lin 245 
    spool base_&1..txt 
    select [blabla] 
    from 
    ( 
    SELECT [blabla] 
    FROM [blabla] 
    WHERE [blabla] LIKE '&1%' 
    GROUP BY [blabla] 
    ); 
    spool off
     
    script2.sql
    @script1 01
    @script1 02
    @script1 03
    ...
    @script1 99
    Je maîtrise très peu les batch et PL/SQL. N'ayant pas trop de temps, je trouve cette solution simple et efficace

    Merci à vous deux sygale (désolé de ne pas investiguer plus loin dans le développement que tu as proposé) et laurentschneider !

    PS si quelqu'un a le temps : dans le code cité ci-dessus, pourquoi "spool base_&1..txt" créé un fichier nommé "base_15.txt" (avec &1 = 15) et non pas "base_15..txt" ? C'est le passage de paramètre qui "mange" le point en double avant le "txt" ?

  10. #10
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut Re: Variables dans un .sql exécuté par sqlplus
    Citation Envoyé par ekke
    PS si quelqu'un a le temps : dans le code cité ci-dessus, pourquoi "spool base_&1..txt" créé un fichier nommé "base_15.txt" (avec &1 = 15) et non pas "base_15..txt" ? C'est le passage de paramètre qui "mange" le point en double avant le "txt" ?
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    spool c:\base_&MY_NUM..txt
    Euh ca met "base_15..txt" moi

    Ah oui le caractère de concaténation par défault sous SQL*PLUS est le "."

    D'ou l'utilisation de
    dans mon exemple, avec l'habitude on oubli des trucs

    C'est pas grave pense à Résolu

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    Merci

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/06/2013, 14h05
  2. variable dans requete SQL pour delphi
    Par socooooool dans le forum Bases de données
    Réponses: 9
    Dernier message: 25/01/2013, 11h27
  3. register_global à on et variables dans requêtes SQL
    Par JackBeauregard dans le forum Langage
    Réponses: 4
    Dernier message: 14/09/2006, 16h00
  4. [MySQL] Introduire une variable dans requête SQL, insérer des données à la volée
    Par Ronan.f dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 29/04/2006, 22h10
  5. une variable dans du SQL ??
    Par Black Pearl dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/06/2005, 12h55

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