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 :

Etat d'un package lors de la suppression temporaire d'une table


Sujet :

PL/SQL Oracle

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut Etat d'un package lors de la suppression temporaire d'une table
    Bonjour,

    ayant dans une procédure PL/SQL un "DELETE" qui me prend énormément de temps, j'ai cherché comment y remédier et j'ai trouvé que c'était beaucoup plus rapide de faire une requête du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE tab_new
    AS SELECT * FROM tab_a_supprimer
    WHERE <conditions de sauvegarde>;
    ALTER TABLE tab_a_supprimer RENAME TO tab_sav;
    ALTER TABLE tab_new RENAME TO tab_a_supprimer;
    -- recréation des contraintes, triggers, indexes et GRANT
    DROP TABLE tab_sav; -- quand tout est OK
    Problème quand je fais ça : mon package utilise la table en question "tab_a_supprimer". Et lorsque j'appelle plusieurs procédures successivement depuis un programme extérieur (en powerbuilder), l'appel à la procédure qui contient le delete marche correctement, mais lors de l'appel suivant à une autre procédure du package, le programme plante parce que "existing state of package has been discarded". Quand je regarde depuis SQL developper, en effet le package n'est plus compilé!

    Il a en quelque sorte été "décompilé" puisqu'à un moment donné, lors de la suppression de la table, il était dans un état incohérent.

    Est-ce que quelqu'un voit comment je pourrais éviter ça, en rendant l'ensemble de mes requêtes atomique ou quelque chose comme ça?

    En attendant j'ai contourné le problème en ne faisant pas un DROP mais un TRUNCATE, et en recopiant ensuite les lignes de la table temporaire.

  2. #2
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    il ya

    Manually Recompiling Packages

    To recompile a package manually, you must have the ALTER ANY PROCEDURE system privilege or the package must be contained in your schema. Use the ALTER PACKAGE statement with the COMPILE clause to recompile either a package body or both a package specification and body. The following statement recompiles just the body of the package acct_mgmt:

    ALTER PACKAGE acct_mgmt COMPILE BODY;


    The next statement compiles both the body and specification of the package acct_mgmt:

    ALTER PACKAGE acct_mgmt COMPILE PACKAGE;



    mais sinon

    pourquoi ne pas rester en truncate

    insert /+* append */
    et rebuild index online

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Merci pour ta réponse.

    Oui je pense que je vais rester en truncate. L'autre solution serait peut-êtr un poil plus rapide, mais c'était surtout pour ma culture générale

    Intéressant la recompilation manuelle des packages, je note
    Après mon but aurait été d'externaliser ce delete dans une fonction d'un package utilitaire. Et du coup, quand je l'appelerai, je ne disposerai pas du nom du package appelant pour le recompiler...

  4. #4
    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
    Oracle a un mécanisme automatique de gestion des dépendances d'un objet: un objet devient invalide dès qu'un autre objet dépendant été modifié par une instruction DDL. Mais à la première utilisation suivant l'invalidation de l'objet Oracle va automatiquement essayer de recompiler l'objet. Une erreur peut être déclenchée si l'objet en question est un package et comporte des variables de session. Voir les scénarios dans cette discussion OTN.

    Voir aussi le Concepts Guide.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    je ne comprends pas en quoi la présence de variable globales devrait influencer la recompilation, mais soit. :-/

    Ce qui est bizarre c'est que dans mon cas, quand Oracle tente de recompiler le package, ça devrait fonctionner et non renvoyer une erreur, vu que ma table a été recréée... En fait j'ai bien un message d'erreur qui s'affiche, mais lors des appels suivants à la fonction, le package a été recompilé et tout fonctionne.

    En gros j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure toto is
    begin
    -- supprimer une table dont on se sert dans le package
    -- recréée cette table
    end;
     
    procedure titi is
    begin
    --n'importe quoi
    end
    appel de toto => OK
    appel de titi => KO
    appel de titi => OK

    Au moment du premier appel de titi, la procédure toto est terminée, donc le package est dans un état stable, donc la recompilation automatique devrait fonctionner...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Mouais, après avoir relu, en fait je crois que je suis exactement dans le deuxième cas de ton exemple. Le fait que le premier appel à titi plante serait dû à la présence de variables globales....

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/08/2008, 11h30
  2. Suppression Elément d'une table à partir sous formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 3
    Dernier message: 19/05/2006, 10h57
  3. Suppression enregistrement dans une table
    Par elkhy dans le forum Access
    Réponses: 3
    Dernier message: 25/04/2006, 14h29
  4. Erreur lors de conversion de champ d'une table
    Par vitalogy dans le forum Access
    Réponses: 3
    Dernier message: 15/09/2005, 10h36

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