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 :

Simplification d'une procédure à l'aide d'une boucle


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut Simplification d'une procédure à l'aide d'une boucle
    Bonjour,

    il s'agit sûrement d'une question assez bête mais je n'arriva pas trop à) m'en sortir.

    C'est au sujet d'un script de création de tables. Au début de ce script j'ai mis des instructions DROP TABLE ... mais pour éviter d'avoir les messages d'erreur "TABLE OR VIEW DOES NOT EXIST ..." on ma donné ce script à mettre au début :

    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
    WHENEVER SQLERROR CONTINUE;
    WHENEVER OSERROR CONTINUE;
     
     
    declare
     
    c number;
    n number;
    texte_sql varchar2(2000);
     
    exp_existe_deja EXCEPTION;
    PRAGMA EXCEPTION_INIT(exp_existe_deja, -00955);
     
    begin
     
        begin
     
            c:= dbms_sql.open_cursor;
            texte_sql := 'DROP TABLE T1';
     
            dbms_sql.parse(c,texte_sql, dbms_sql.native);
            n := dbms_sql.execute(c);
            dbms_sql.close_cursor(c);
     
        exception
            when others then
                null;
        end;
     
        begin
     
            c:= dbms_sql.open_cursor;
            texte_sql := 'DROP TABLE t2';
     
            dbms_sql.parse(c,texte_sql, dbms_sql.native);
            n := dbms_sql.execute(c);
            dbms_sql.close_cursor(c);
     
            /**** BREF autant de fois qu'il y a de tables .... ****/
     
     
    exception
        when Others then
            dbms_output.put_line(SQLERRM);
            null;
    end;
    /

    Le truc c'est que je ne le trouve pas très joli. Je voudrais si possible le simplifier en créant une liste des tables et itérer dessus pour exécuter le code .. mais je ne sais pas comment m'y prendre. De plus je ne sais pas si c'est la meilleure manière de procéder ...

    J'en appelle donc à vos connaissances ... comment m'y prendre pour avoir un truc propre et facilement maintenable et transposable à d'autres scripts de ce genre ?

    merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Par défaut
    pourquoi tu ne teste pas sur l'existance de la table que tu veux créer dans user_tables ou all_tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select table_name from user_tables where table_name = upper('nomdetable')

  3. #3
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Citation Envoyé par Oraman
    pourquoi tu ne teste pas sur l'existance de la table que tu veux créer dans user_tables ou all_tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select table_name from user_tables where table_name = upper('nomdetable')
    Ben oui mais je ne vois pas trop comment appliquer ceci à un traitement "générique"

    Citation Envoyé par plaineR
    Tes tables s'appellent t1, t2, tn ? ou elles ont des noms différents (ex: aaa, toto, titi, matable) ?
    non, des nom différents. enfin elles ont toutes le meme prefixe quand meme mais derrière ça varie beaucoup.

    En fait, vos idées me font penser à qqchose. Si je remplis un curseur avec mes tables (d'apres le prefixe) je peux itérer dessus comme expliqué précedemment ?

    Par contre seule hic, si jamais une des autres tables de la base commence pareil ...

    -> y a t'il moyen de remplir un curseur (ou autre objet itérable) à la main. Genre remplir manuellement une liste des nom de tables à dropper et la parcourir ??

  4. #4
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Par défaut
    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
    create or replace procedure chercher_table
    is
    declare 
    v varchar2(50);
    begin
    v:='error';
    select table_name into v from user_tables where table_name = upper('TEST');
    EXCEPTION WHEN NO_DATA_FOUND THEN
       v:='error';
     
       if v='error' then
       	  dbms_output.put_line('table introuvale ');
       else
       	   dbms_output.put_line('table exite déjà ');
       end if ;
    end;
    tu n'as qu'as passer le nom de ta table en paramètre et remplacer les dbms_output par tes DDL

  5. #5
    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
    Par défaut
    Voici une solution que j'avais adopté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace procedure drop_table (p_table in varchar2) is
      not_dropable exception;
      pragma exception_init (not_dropable, -942);
    begin
    execute immediate 'drop table ' || p_table;
    exception
       when not_dropable then null;
    end;
    /
    et au lieu de faire "drop table toto;" je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec drop_table ('toto')
    Après généraliser le principe avec un curseur cela me semble très risqué et peu recommandé.

  6. #6
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    c'est vrai que la solution du curseur est peut être (surement) plus dangereuse ...

    du coup, désolé mais je te pique ta solution PlaineR.

    Merci à vous deux en tous cas.

    A charge de revanche j'espère !

  7. #7
    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
    Par défaut
    Tes tables s'appellent t1, t2, tn ? ou elles ont des noms différents (ex: aaa, toto, titi, matable) ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/10/2015, 10h00
  2. Réponses: 6
    Dernier message: 22/12/2011, 16h26
  3. Réponses: 7
    Dernier message: 27/06/2011, 15h56
  4. Réponses: 0
    Dernier message: 11/09/2009, 18h25
  5. MAJ d'une table à l'aide d'une procédure stockée
    Par ghilo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/08/2009, 13h29

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