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 :

ALTER plusieurs tables avec curseur et boucle


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 43
    Points
    43
    Par défaut ALTER plusieurs tables avec curseur et boucle
    Bonjour,

    Je voudrais deplacer un ensemble de table d'un tablespace sur un autre, ceci sur une base de données 9i.

    Les tables ont été créées sur le tablespace SYS, alors qu'elles devraient etre sur le tablespace TBS_TOTO.
    Par contre, bien qu'existant sur le tablespace sys, toutes les tables appartiennent au schéma TOTO.
    J'ai écrit la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
    TYPE r_curseur is REF CURSOR;
    c_tables r_curseur; 
    ligne_tableau c_tables%TYPE; 
    BEGIN
        OPEN c_tables FOR select TABLE_NAME from SYS.ALL_TABLES where owner = 'TOTO'; 
        LOOP 
     
        FETCH c_tables INTO ligne_tableau;  
        EXIT WHEN c_tables%NOTFOUND;  
            ALTER TABLE ligne_tableau.TABLE_NAME MOVE TABLESPACE TBS_TOTO;  
        END LOOP; 
        CLOSE c_tables; 
    END;
    mais je recois l'erreur suivante à l'execution:
    ORA-06550: Ligne 11, colonne 9 :
    PLS-00103: Symbole "ALTER" rencontré à la place d'un des symboles suivants :

    begin case declare end exit for goto if loop mod null pragma
    raise return select update while with <an identifier>
    <a double-quoted delimited-identifier> <a bind variable> <<
    close current delete fetch lock insert open rollback
    savepoint set sql execute commit forall merge
    <a single-quoted SQL string> pipe
    Symbole "lock inséré avant "ALTER" pour continuer.
    ORA-06550: Ligne 11, co

  2. #2
    Invité
    Invité(e)
    Par défaut
    utilise du sql dynamique pour faire ce alter (y a un très bon tuto sur ce site concernant le sujet )

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    ALTER est un DDL => EXECUTE IMMEDIATE
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Oui, c'est ce que j'ai essayé de faire juste apres avoir posté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
    TYPE r_curseur is REF CURSOR;
    c_tables r_curseur; 
    ligne_tableau c_tables%TYPE; 
    BEGIN
        OPEN c_tables FOR select TABLE_NAME from SYS.ALL_TABLES where owner = 'TOTO'; 
        LOOP 
     
        FETCH c_tables INTO ligne_tableau;  
        EXIT WHEN c_tables%NOTFOUND;  
            EXECUTE IMMEDIATE 'ALTER TABLE '||ligne_tableau||' MOVE TABLESPACE TBS_TOTO';  
        END LOOP; 
        CLOSE c_tables; 
    END;
    mais bizarrement ca donne tjs la meme erreur

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Le PL/SQL est certes une possibilité, mais la chose peut se faire simplement avec SQL*Plus.

    Vous mettez tout ça dans un fichier mon_script.sql, vous l'exécutez par @le_chemin_qui_va_bien\mon_script.sql, et vous récupérez le résultat prêt à l'emploi.
    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
    set pagesize 0
    set verify off
    set echo off
    set feedback off
     
    accept NOM_SCHEMA prompt "nom du proprietaire des tables a deplacer : "
    accept TBS_SOURCE prompt "nom du tablespace source : " default SYSTEM
    accept TBS_CIBLE prompt "nom du tablespace cible : "
     
     
    spool change_tbs.sql
     
    select 'alter table ' || table_name || ' move tablespace &TBS_CIBLE;' 
    from dba_tables
    where owner='&NOM_SCHEMA'
    and tablespace_name='&TBS_SOURCE';
     
     
    spool off
     
    ed change_tbs.sql
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Le PL/SQL est certes une possibilité, mais la chose peut se faire simplement avec SQL*Plus.

    ...


    spool off

    ed change_tbs.sql[/code]
    Merci, je pense que ca va résoudre mon problème... Mais je suis quand meme curieux de savoir ce qui clochait avec ma "solution".

    A ce propos, le message d'erreur n'est pas le meme en fait:

    ORA-06550: Ligne 11, colonne 27 :
    PLS-00306: numéro ou types d'arguments erronés dans appel à '||'
    ORA-06550: Ligne 11, colonne 9 :
    PL/SQL: Statement ignored

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Comem ça, ça marchera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN
        FOR r IN (SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE owner = 'TOTO') 
        LOOP 
            EXECUTE IMMEDIATE 'ALTER TABLE '|| r.table_name ||' MOVE TABLESPACE TBS_TOTO';  
        END LOOP; 
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par abdelhamidem Voir le message
    Bonjour,

    Je voudrais deplacer un ensemble de table d'un tablespace sur un autre, ceci sur une base de données 9i.

    Les tables ont été créées sur le tablespace SYS, alors qu'elles devraient etre sur le tablespace TBS_TOTO.
    Par contre, bien qu'existant sur le tablespace sys, toutes les tables appartiennent au schéma TOTO.
    J'ai écrit la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
    TYPE r_curseur is REF CURSOR;
    c_tables r_curseur; 
    ligne_tableau c_tables%TYPE; 
    BEGIN
        OPEN c_tables FOR select TABLE_NAME from SYS.ALL_TABLES where owner = 'TOTO'; 
        LOOP 
     
        FETCH c_tables INTO ligne_tableau;  
        EXIT WHEN c_tables%NOTFOUND;  
            ALTER TABLE ligne_tableau.TABLE_NAME MOVE TABLESPACE TBS_TOTO;  
        END LOOP; 
        CLOSE c_tables; 
    END;
    mais je recois l'erreur suivante à l'execution:


    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
       CURSOR r_curseur
       IS
          SELECT table_name
            FROM SYS.all_tables
           WHERE owner = 'TOTO';
    BEGIN
       FOR c_tables IN r_curseur
       LOOP
          EXECUTE IMMEDIATE (   'ALTER TABLE '
                             || ligne_tableau.table_name
                             || 'MOVE TABLESPACE TBS_TOTO'
                            );
       END LOOP;
    END;

Discussions similaires

  1. [MySQL] Lire plusieurs tables avec des join ou requête à chaque fois à l'intérieur d'une boucle
    Par padre.cedano dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/01/2015, 09h44
  2. mettre à jour plusieurs tables avec un formulaire
    Par kangourou_agile dans le forum Access
    Réponses: 6
    Dernier message: 07/08/2006, 15h33
  3. Réponses: 6
    Dernier message: 19/05/2006, 14h22
  4. Réponses: 2
    Dernier message: 26/04/2006, 15h14
  5. plusieurs tables avec un seul DBnavigator et DBGRID
    Par warrior dans le forum Bases de données
    Réponses: 8
    Dernier message: 07/06/2005, 08h12

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