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 :

Procedure oracle 10


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Procedure oracle 10
    bonjour tout le monde,

    Aujourd'hui je viens avec un problème qui me fatigue énormément, voilà je veut faire une base de données en oracle 10g, après que je finis de créer les tables, je me suis dis de faire des procédures qui vont me permettre de renseigner les tables, mais voilà ce qu'on me dit si je fais une procédure:
    "Procédure crée avec erreur de compilation"
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create procedure(parametres) IS
    BEGIN
    INSERT INTO table(champs) values(parametres);
    end;
    /
    Merci de me venir en aide

  2. #2
    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 plus simple dans ce cas, c'est de consulter la vue USER_ERRORS pour avoir le détail des erreurs.
    En revanche, fournir une espèce de pseudo-code comme vous l'avez fait ne sert à rien. Etant donné que les erreurs de compilation sont dues soit à une syntaxe incorrecte, soit à des objets inexistants, seul le code réel permet de mettre le doigt sur les problèmes.
    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

  3. #3
    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
    Pour faire tel instruction dans une procédure, utilise comme suite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create procedure test IS
    BEGIN
    execute immediate 'INSERT INTO table(champs) values(parametres)';
    commit;
    end;

    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    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
    Pour faire tel instructiondansune procédure, utilise...
    Dans la compétition "comment écrire le pire du code en PL" votre exemple attire l'attention.

  5. #5
    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
    @mnitu. je ne comprend pas pourquoi ton commentaire. si tu as voulu parler de create procedure(parametre) je n'ai pas fait attention, et si tu veux parlé du principe, où est le problème.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  6. #6
    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
    Votre exemple de deux lignes de code (si on ignorer les lignes inévitables à la définition de la procédure) montre deux mauvaises habitudes de programmation :
    1. employer le sql dynamique inutilement
    2. faire commit dans une procédure

    Donc deux sur deux ce n’est pas si mal !

  7. #7
    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 problème avec votre code, c'est qu'il n'y a aucun besoin d'utiliser du SQL dynamique (EXECUTE IMMEDIATE) pour faire un simple INSERT.

    Le SQL dynamique s'impose quand :
    • la requête est construite durant l'exécution (par exemple, on ne sait pas à l'avance sur quelles tables elle va porter)
    • on veut effectuer une commande du LDD (CREATE, ALTER, DROP...)


    Il faut préciser que si l'inconnue porte seulement sur la valeur de comparaison dans un prédicat, il n'y a pas besoin de SQL dynamique, car une simple variable suffit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    WHERE matricule = v_mat
    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

  8. #8
    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
    Le faite de poster tel exemple est de montrer la faisabilité de mettre avec SQL dynamique. rien d'autre que ça
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  9. #9
    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
    Citation Envoyé par islamov2000 Voir le message
    Le faite de poster tel exemple est de montrer la faisabilité de mettre avec SQL dynamique. rien d'autre que ça
    Votre solution était précédée par "Pour faire tel instruction dans une procédure, utilise", ce qui signifie que selon vous, le SQL dynamique est nécessaire pour répondre au besoin.

    Maintenant, si vous préférez quitter le terrain de la technique pour entrer dans celui de la mauvaise foi, je me retire de cette discussion.
    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

  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
    Mon intension de
    "Pour faire tel instruction dans une procédure, utilise"
    est juste pour répondre à la préoccupation de barry mouctar qui a voulu faire un sous le code de PL/SQL, Pomalaix.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  11. #11
    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
    Citation Envoyé par islamov2000 Voir le message
    Mon intension de est juste pour répondre à la préoccupation de barry mouctar qui a voulu faire un INSERT INTO.. sous le code de PL/SQL
    Donc vous pensez qu'il est nécessaire d'utiliser le sql dynamique pour faire un insert dans du PL/SQL.

    Lisez peut être Procédures, Fonctions et paquetages du guide du forum pour vous rendre compte que c'est inutile.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 37
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    vous avez largement expliqué pourquoi le sql dynamique était ici contre productif.

    Par contre, personne n'a réagi à :

    Citation Envoyé par mnitu Voir le message
    faire commit dans une procédure
    Pouvez vous expliquer en quoi faire des commit dans une procédure est une mauvaise habitude de programmation (ou donner un lien)
    Pour les messages utiles, mettre un pouce vert fait plaisir à celui qui donne de son temps pour aider. (en tout cas, ça me fait plaisir)

  13. #13
    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
    Citation Envoyé par A.Herobic Voir le message
    ...Pouvez vous expliquer en quoi faire des commit dans une procédure est une mauvaise habitude de programmation (ou donner un lien)
    Une procédure constitue souvent une étape parmi d'autres au sein d'une transaction. Si la procédure comporte une fin de transaction sans que l'appelant en ait conscience, alors on vient de créer une bogue, car le découpage transactionnel n'est plus celui qu'on pensait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert
    update
    procedure_avec_commit
    delete
    rollback
    Il est préférable de ne pas introduire de COMMIT/ROLLBACK dans une procédure, et de laisser à l'appelant, au niveau supérieur, la responsabilité de finaliser la transaction.
    La procédure est alors vue comme une boîte noire, qui effectue le traitement demandé, mais sans interférer sur le découpage transactionnel.

    On peut tout à fait imaginer une norme de développement dans l'entreprise qui interdise toute commande provoquant une fin de transaction dans les procédures.
    Je serais pour ma part moins extrémiste, en me contentant d'une norme de nommage qui indique clairement si la procédure fait un COMMIT.
    Par exemple, j'appellerais ma procédure p_cloture_mens_CMT, le suffixe CMT signifiant qu'elle provoque un COMMIT.
    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

  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
    Commit implique la fin d’une transaction mais la fin d’une procédure ne vaut pas forcement la fin de la transaction. Autrement dit une procédure ne sait rien des frontières de la transaction à laquelle elle participe donc en conséquence elle n’a aucun raison de terminer une transaction. C’est au programme appelant de la procédure de décider de terminer la transaction.

    Comme d’habitude il existe (au moins) une exception notable qui est celle d’une procédure en transaction autonome.

  15. #15
    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 Pomalaix Voir le message
    ...
    Je serais pour ma part moins extrémiste, en me contentant d'une norme de nommage qui indique clairement si la procédure fait un COMMIT.
    Par exemple, j'appellerais ma procédure p_cloture_mens_CMT, le suffixe CMT signifiant qu'elle provoque un COMMIT.
    Ça n’a rien à voir avec quelconque extrémisme mais c’est plutôt la suite logique de la réutilisation du code induite par des besoins parfois difficile à anticiper.

    Bref, juste une petite histoire sur la dernière fois quand j’ai ajouté une instruction COMMIT (il y a quelques années) dans une procédure non-autonome. J'ai remplacé un traitement batch écrit dans un vieux langage d’Oracle, RPT, par un package PL/SQL. Comme ce traitement batch était unitaire et se terminait par un commit j’ai trouvé raisonnable de finir la procédure qui pilote le traitement par commit. Trois mois plus tard un nouveau besoin est arrivé pour intégrer ce même traitement dans un autre dans le cadre d’une demande spécifique ! Et maintenant ce commit si logique avant a commencé à poser un problème !

    A la limite si quelqu’un ne peut pas vivre sans faire commit dans une procédure, la meilleure pratique d’après moi, sera de créer :
    • Une procédure qui fait le boulot sans commit
    • Une deuxième procédure qui ne fait qu’appeler la première pour y ajouter un commit.

    Mais je doute sérieusement que j'ai pourrais trouver un vrai besoin à ceci.

  16. #16
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Et pourquoi pas spécifier le type de ton paramètre ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Procedures Oracle interrogation variable
    Par ecureuilmasque dans le forum SQL
    Réponses: 0
    Dernier message: 08/04/2008, 17h37
  2. syntaxe procedure oracle
    Par BO_STEPHANE dans le forum SQL
    Réponses: 2
    Dernier message: 21/02/2008, 19h09
  3. Réponses: 2
    Dernier message: 28/08/2006, 11h00
  4. Réponses: 4
    Dernier message: 21/06/2005, 16h45
  5. [C#] Problème de récupération d'une procédure Oracle
    Par minnieBis dans le forum ASP.NET
    Réponses: 11
    Dernier message: 20/04/2004, 13h48

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