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 :

Mélange static et dynamic SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Mélange static et dynamic SQL
    Bonjour,
    j'ai créé une procédure dans laquelle je voudrais créer et modifier une table, j'utilise donc du "dynamic sql" par
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     execute immediate 'CREATE TABLE table_test (MOT VARCHAR(16))';

    puis je voudrais la modifier par
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    INSERT INTO table_test VALUES ('Vol');

    qu'apparemment il n'aime pas alors que si j'utilise 'execute immediate' cela passe, il n'est donc pas possible de mélanger static et dynamic sql dans une procédure stockée ?

  2. #2
    Membre expérimenté
    peux tu poster le message d'erreur qui s'affiche?
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  3. #3
    Membre à l'essai
    Error report:
    ORA-06550: line 1, column 7:
    PLS-00905: object AIRVISION.TESTT is invalid
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:

  4. #4
    Expert confirmé
    Si la table est créée dynamiquement, il faut aussi insérer dynamiquement.
    Mais la vrai question est pourquoi vouloir créer la table dynamiquement ? C'est très probablement une mauvaise idée.

  5. #5
    Membre à l'essai
    Citation Envoyé par skuatamad Voir le message
    Si la table est créée dynamiquement, il faut aussi insérer dynamiquement.
    Mais la vrai question est pourquoi vouloir créer la table dynamiquement ? C'est très probablement une mauvaise idée.
    C'est parce qu'apparemment un simple 'CREATE TABLE' ne marche pas dans une procédure stockée. IL y a un autre moyen de créer une table dans une procédure stockée ?

  6. #6
    Expert confirmé
    Dans une procédure stockée, il faut passer par EXECUTE IMMEDIATE, ma remarque concernait plutôt l'idée de créer une table dans une procédure stockée...
    C'est très souvent à la fois inutile et une mauvaise idée.

  7. #7
    Expert éminent sénior
    Je vais nuancer un peu la question posé par skuatamad :"Pourquoi voulez-vous créer une table dans une procédure stockée ?". Cela vaut également dire: "pourquoi vous ne créez pas tout simplement vos tables via un script sql ou autre procédure d'installation voir une procédure PL/SQL dédié" avant de créer les procédures stockées de manipulation de ces tables ?

  8. #8
    Membre à l'essai
    Citation Envoyé par skuatamad Voir le message
    Dans une procédure stockée, il faut passer par EXECUTE IMMEDIATE, ma remarque concernait plutôt l'idée de créer une table dans une procédure stockée...
    C'est très souvent à la fois inutile et une mauvaise idée.
    En fait je dois créer une procédure automatisée, qui crée une table, à partir de tables dont je dispose et en passant par pas mal de tables intermédiaires, il vaut alors mieux que je passe par le lancement d'un batch ? Ou y a t-il encore une autre solution ? POurquoi est-ce que la création de tables dans une procédure stockée est-elle une mauvaise chose ?

  9. #9
    Membre à l'essai
    Citation Envoyé par mnitu Voir le message
    Je vais nuancer un peu la question posé par skuatamad :"Pourquoi voulez-vous créer une table dans une procédure stockée ?". Cela vaut également dire: "pourquoi vous ne créez pas tout simplement vos tables via un script sql ou autre procédure d'installation voir une procédure PL/SQL dédié" avant de créer les procédures stockées de manipulation de ces tables ?
    Bonjour Mnitu,
    comme je le disais à Skuatamad j'ai besoin de pouvoir automatiser, c'est pour cela que je voulais passer par une procédure et pas simplement un script.
    Par "procédure PL/SQL" dédiée vous entendez la création d'un fichier .sql que je lancerais avec un fichier batch ?
    PArce que c'est la solution que j'ai adoptée jusque là, je ne pensais pas que l'utilisation d'une procédure stockée pour créer des tables n'était pas recommandée.

  10. #10
    Membre expérimenté
    tout simplement, tu essaie le code



    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begi n
    execute immediate 'create table la_table (a number)';
    execute immediate 'INSERT INTO la_table VALUES (6)';
    commit;
    end;
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  11. #11
    Expert éminent sénior
    Citation Envoyé par Romainvdl Voir le message
    En fait je dois créer une procédure automatisée, qui crée une table, à partir de tables dont je dispose et en passant par pas mal de tables intermédiaires, il vaut alors mieux que je passe par le lancement d'un batch ? Ou y a t-il encore une autre solution ? POurquoi est-ce que la création de tables dans une procédure stockée est-elle une mauvaise chose ?
    Créez vos tables de travail intermédiaires comme tous les autres tables de votre application.

    Maintenant il vous reste juste de créer la procédure/package PL/SQL qui effectue le traitement en utilisant que du SQL statique.

    En réalité il est fort probable que vous pouvez vous en passer de tous les table intermédiaires si vous maitrisez assez le SQL et le PL/SQL

  12. #12
    Expert éminent sénior
    Citation Envoyé par islamov2000 Voir le message
    tout simplement, tu essaie le code
    ...
    Le problème avec ce code est que l'exemple suivant fonctionne toute à fait bien
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    begin
    execute immediate 'Anne a deux poires';
    execute immediate 'qu''elle donne a quelque un';
    commit;
    Exception
      When Others Then null;
    end;

  13. #13
    Membre à l'essai
    Citation Envoyé par mnitu Voir le message
    Créez vos tables de travail intermédiaires comme tous les autres tables de votre application.

    Maintenant il vous reste juste de créer la procédure/package PL/SQL qui effectue le traitement en utilisant que du SQL statique.

    En réalité il est fort probable que vous pouvez vous en passer de tous les table intermédiaires si vous maitrisez assez le SQL et le PL/SQL
    A vrai dire c'est un projet que je reprends de quelqu'un, donc je ne me suis pas penché sur toutes les étapes intermédiaires, et n'aurai probablement pas le temps de le faire, mais une "bonne pratique " serait-elle celle-ci ?
    - créer les tables par script par exemple dans un premier temps, quite à avoir des tables vides, y compris la table où je mets mes résultats
    - et après dans la procédure de ne faire que manipuler ces tables ? MAis si je refais tourner mon algo une seconde fois par exemple il va falloir que je vide les précédentes, non ?

  14. #14
    Expert éminent sénior
    La bonne pratique sera de ne pas du tout utiliser des tables des travail, en réalité elle sont rarement nécessaires.
    Pour simplifier la gestion de ces tables Oracle à ajouté la possibilité de créer des tables temporaires qui peuvent se vider automatiquement soit à la commit soit à la fermeture de la session.

  15. #15
    Membre à l'essai
    Je vais regarder ça plus attentivement, merci en tout cas !

###raw>template_hook.ano_emploi###