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 :

Procédure stockée partitions


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2011
    Messages : 67
    Points : 39
    Points
    39
    Par défaut Procédure stockée partitions
    Bonjour à tous et à toutes,

    J'essaie de créer un procédure qui permet le déplacement de la dernière partition d'un ensemble des tables d'un tablespace vers un autre tablespace.
    la syntaxe est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table TTTT move partition LLLL tablespace YYYY;
    La partition LLLL je l'ai remplacé par une requête qui me cherche la dernière partition de la table.

    Le problème c'est que ma procédure ne marche pas , je ne sais pas pour quelle raison, pourriez vous me dire si la syntaxe de ma procédure est correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE PROCEDURE MOVE_PARTITIONS IS 
    DECLARE
       r varchar2(15);
    BEGIN
    for r in (select TABLE_NAME from PARAMETRE_TABLESPACE where TABLESPACE_DATA_CIBLE='XXXX') loop
    alter table r move partition (Select PARTITION_NAME From (Select PARTITION_POSITION,PARTITION_NAME, Max(PARTITION_POSITION) over (partition by TABLE_NAME) As MAX_P From SYS.USER_TAB_PARTITIONS Where TABLE_NAME='r' And Nvl(NUM_ROWS,0) = 0) Where PARTITION_POSITION = MAX_P) tablespace YYYY;
    end loop;
    NULL;
    END MOVE_PARTITIONS;

    Merci ^^

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    "Alter table ..." c'est du DDL; DDL dans PL/SQL => SQL dynamique.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Commencez par écrire la requête SQL qui vous donne le nom des tables avec le nom des partitions à déplacer.
    Ensuite vérifiez la syntaxe de la boucle for, et utilisez execute immediate pour exécuter le DDL (alter table) dans une procédure.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2011
    Messages : 67
    Points : 39
    Points
    39
    Par défaut Déplacer les partitions
    Citation Envoyé par skuatamad Voir le message
    Commencez par écrire la requête SQL qui vous donne le nom des tables avec le nom des partitions à déplacer.
    Ensuite vérifiez la syntaxe de la boucle for, et utilisez execute immediate pour exécuter le DDL (alter table) dans une procédure.
    Merci infiniment pour la réponse ,

    En effet cette requête marche bien, elle affiche tous les noms des tables pour lesquelles je veux déplacer la dernière partition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TABLE_NAME FROM PARAMETRE_TABLESPACE WHERE TABLESPACE_DATA_CIBLE='XXXX'
    Ensuite celle là m'affiche la dernière partition de la table aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT PARTITION_NAME FROM (SELECT PARTITION_POSITION,PARTITION_NAME, Max(PARTITION_POSITION) over (partition BY TABLE_NAME) AS MAX_P FROM SYS.USER_TAB_PARTITIONS WHERE TABLE_NAME='r' AND Nvl(NUM_ROWS,0) = 0) WHERE PARTITION_POSITION = MAX_P
    là je suis bloquée dans la procédure , je ne vois pas pourquoi ça ne marche pas avec la boucle que j'ai mis .

    Prière de m'aider ou de me donner quelques idées pour avancer ...

    Merci

  5. #5
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    J'ai envie de te répondre "parce que"

    En fait, il faut comprendre que si ta requête pouvait s'exécuter, il faudrait qu'Oracle lance une partie (le DML) de la requête en premier pour évaluer ce que ça retourne, puis lancer la deuxième (le DDL).

    Et ça ne marche pas ainsi, sûrement pour de bonne raisons.

    Il faut donc que tu lises le lien que t'a fourni Skuat sur l'execute immediate.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2011
    Messages : 67
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut,

    J'ai envie de te répondre "parce que"

    En fait, il faut comprendre que si ta requête pouvait s'exécuter, il faudrait qu'Oracle lance une partie (le DML) de la requête en premier pour évaluer ce que ça retourne, puis lancer la deuxième (le DDL).

    Et ça ne marche pas ainsi, sûrement pour de bonne raisons.

    Il faut donc que tu lises le lien que t'a fourni Skuat sur l'execute immediate.
    en fait je n'ai pas compris cette histoire de DDL et DML pourriez vous m'expliquer à quoi ça sert svp ?

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    En gros, quand tu modifies la structure de ta base, tu le fais avec du Data Definition Language.

    Quand tu lis ou modifies des données, c'est du Data Manipulation Language.

    Mais ici surtout ce qui est important, c'est que ce sont deux types d'activités très différentes.

    Par exemple quand tu fais du DML, tu as toute la gestion des transactions (commit, rollback, lecture consistante)... ce que tu n'as pas quand tu tapes dans la structure.

    Ce n'est donc pas vraiment naturel de demander au SGBD, en une seule instruction, de mélanger ces deux types d'exécution.

    C'est donc pour cela qu'il faut faire de l'exéction dynamique : le DDL (alter...), tu le construits sous forme de chaîne de caractères, puis tu demande une exécution dynamique de la chose à Oracle par l'intermédiaire de EXECUTE IMMEDIATE.

    (Mais ça ne te dispense toujours pas de lire le lien de Skuat !)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2011
    Messages : 67
    Points : 39
    Points
    39
    Par défaut
    Bonjour Pacmann , Bonjour tout le monde,

    Merci pour l'explication , d'après skuatamad et les réponses fournies en haut , j'ai fait un petit bout de code , mais ça ne fonctionne toujours pas , est ce que vous pouvez me dire ce qui ne va pas et me donner un petit coup de main s'il vous plaît ?

    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
    CREATE OR REPLACE PACKAGE MOVE_PAR IS
     
    FUNCTION last_partition return varchar2;
    PROCEDURE move_partition;
     
     
    FUNCTION last_partition
      (
            PC$Table IN VARCHAR2,
      )RETURN VARCHAR2
    IS
      LC$Requete      VARCHAR2(512) ;
      LN$Last_partition        VARCHAR2 ;
    BEGIN
      LC$Requete := ‘(Select PARTITION_POSITION,PARTITION_NAME, Max(PARTITION_POSITION)
    over (partition by TABLE_NAME) As MAX_P From SYS.USER_TAB_PARTITIONS Where ‘ || PC$Table || And Nvl(NUM_ROWS,0) = 0) Where PARTITION_POSITION = MAX_P ;
      EXECUTE IMMEDIATE LC$Requete INTO LN$Last_partition ;
      return LN$Last_partition ;
    END ;
     
    CREATE OR REPLACE PROCEDURE move_partition IS 
    DECLARE
    LN$Partition VARCHAR2;
    LC$Requete  VARCHAR2(512);
    CURSOR nom_table IS select TABLE_NAME from PARAMETRE_TABLESPACE where TABLESPACE_DATA_CIBLE='XXXX' ;
    t nom_table%rowtype;
    BEGIN
    OPEN nom_table ;
    for t in nom_table loop
    LN$Partition := last_partition(t);
    LC$Requete := alter table r move partition LN$Partition tablespace YYYY;
    EXECUTE IMMEDIATE LC$Requete ;
    end loop;
    NULL;
    END MOVE_PARTITIONS;
    END MOVE_PAR;
    Merci d'avance

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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