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 :

Mélange static et dynamic SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2017
    Messages : 27
    Points : 22
    Points
    22
    Par défaut 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é
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    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
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2017
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    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é
    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
    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
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2017
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    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é
    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
    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 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
    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
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2017
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    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
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2017
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    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é
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    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 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
    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 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
    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
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2017
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    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 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
    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
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2017
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Je vais regarder ça plus attentivement, merci en tout cas !

Discussions similaires

  1. [PRO*C] ANSI Dynamic SQL - type objet
    Par maxtin dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 11/04/2008, 16h19
  2. requete dynamic sql
    Par sunwind dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 15/08/2007, 17h03
  3. [Firebird 1.5] Dynamic SQL error (-303)
    Par crade dans le forum SQL
    Réponses: 1
    Dernier message: 15/06/2007, 21h32
  4. [visual studio 6] De Static Library à Dynamic Library
    Par mambo dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/05/2007, 15h33
  5. [FireBird] Dynamic SQL Error
    Par aityahia dans le forum SQL
    Réponses: 1
    Dernier message: 28/05/2007, 10h12

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