|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Nouveau Membre du Club
![]() Inscription : décembre 2010 Messages : 36 ![]() |
Bonjour à tous
Tout d'abord, je vous souhaite un très joyeux noël ainsi que de bonnes fêtes Noël c'est le temps des chocolats, du foie gras, des bûches... et du travail pour beaucoup d'étudiants ! :p Si j'en viens à poster ici c'est que je n'arrive vraiment pas à trouver mes erreurs. Au bout de deux jours de recherches je dois accélérer les choses en raison des nombreux projets et des révisions qui s'annoncent pour ces partiels de début d'année. J'aimerais donc solliciter votre aide. Dans le cadre d'un projet j'utilise une base oracle (Express edition 10g) en localhost. Je travaille donc sur la plateforme d'administration classique. Lors de la création d'une fonction, j'ai très régulièrement ce message d'erreur: Citation:
J'ai pensé que c'était du à une mauvaise utilisation d'un tableau, à l'appel d'une fonction (Que j'ai du coup temporairement supprimé), ou encore à la syntaxe de mes structures conditionnelles mais à chaque fois, je pense toucher le but sans toutefois l'atteindre. J'ai tant bien que mal essayé de déboguer mon code mais je n'ai rien trouvé. Lorsque je n'ai pas ce fameux message, il m'arrive d'avoir "SQL Statement running", sans que cela ne s'arrête. C'est étrange. J'aurais pensé à une boucle infinie, mais je n'ai rien trouvé dans ce sens, d'ailleurs cela m'étonnerait qu'à la compilation, la fonction soit exécutée d'autant plus qu'elle pourrait nécessiter des paramètres. Ma fonction permet de savoir si un étudiant a terminé tous les devoirs de la semaine ou non (Il s'agit de la modélisation d'un cartable électronique Voici le code: Code :
ps : déclaration de type_tab: Code :
CREATE OR REPLACE TYPE "TYPE_TAB" IS VARRAY(12) OF VARCHAR2(2); |
|||
|
|
00
|
|
|
#2 | ||||||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Attention à tes déclarations et tes calculs sur les varchar2
exemple Code :
Code :
Code :
Concatener des chaines de caractères avec des sommes de varchar... Enfin, je n'ai pas compris l'algo, à quoi sert le tableau ? Tu ne peux pas passer par la fonction Next_Day et tout gérer en date réelle ?
__________________
More Code : More Bugs. Less Code : Less Bugs |
||||||
|
|
00
|
|
|
#3 | ||||||
|
Nouveau Membre du Club
![]() Inscription : décembre 2010 Messages : 36 ![]() |
En effet, j'ai laissé passer une grosse erreur sur les types !
En fait, j'avais tout testé avec des DBMS_OUTPUT et j'avais les résultats escomptés donc je ne me suis pas plus inquiété que cela. Concernant jourParcouru, il s'agit d'obtenir une chaîne du type "JJMMAAAA". numDuJour + (cpt+1) => le pl/sql semble permissif sur les opérateurs, il semblerait que cela fonctionne et on obtient donc un numéro à deux chiffres. Par contre, une erreur bête dans la déclaration de jourParcouru; il lui faut 8 caractères donc varchar2(8). En fait le tableau sert lorsque l'on change de jour. Exemple, on est le 31 décembre, on passe au jour suivant mais avant de faire un "+1" on vérifie que l'on n'est pas déjà au dernier jours du mois ce qui est le cas ici. Cela permet de passer au 1 et non au 32. J'ai corrigé d'autres erreurs. Je n'avais pas connaissance de cette fonction Next_Day. Pour moi, c'est plus facile de gérer des dates avec le format "JJMMAAAA" dans ma base de données, surtout pour le côté java. Mais malgré ces corrections, cela ne marche toujours pas. J'ai "SQL statement running" sans arrêt. Le nouveau code : Code :
Code :
J'ai commencé à réécrire la fonction en changant d'algo comme tu le proposes; mais c'est à ne rien comprendre, pour le même code j'ai réussi à le compiler une fois, une autre fois je vais avoir un "SQL Statement running", et une autre fois un "Apex/..... not found". Je fais des drop function pour éviter le replace mais cela ne change pas grand chose.. Code, pas très avancé mais dès ce stade cela compile mal: Code :
|
||||||
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Ta fonction statutDevoirs ne fonctionne pas vraiment et est perfectible.
1 - Pas de return quand ça marche ! 2 - Evite les Open cursor, c'est chiant, faut gérer les close, les affectations, etc... préfère les FOR LOOP beaucoup plus pratique. 3 - Opti : imaginons que tu aies 5 Millions de devoir le même jour.. tu vas boucler 5 M de fois, même si la première ligne ramenée a un statut 0 ? Mieux vaut privilégier les traitements sur la base qu'en PL Il te suffit de noter les cas : Ta fonction renvoie 1 par défaut Ta fonction renvoie 0 si au moins un devoir a un statut 0 Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||
|
|
00
|
|
|
#5 | ||
|
Nouveau Membre du Club
![]() Inscription : décembre 2010 Messages : 36 ![]() |
Merci pour ton implication,
Je ne savais pas que l'on ne sortait pas du bloc d'exception ! ![]() Pour la boucle, oui c'est exactement ce que je voulais faire (à l'image de la boucle dans la fonction pour la semaine) j'ai juste oublié la condition ultime... Un Code :
EXIT WHEN devoirsLendemain%NOTFOUND OR valretour = 0; Concernant les curseurs, j'aime bien cette méthode :p Ceci dit, les deux fonctionnent je ne pense pas avoir fait d'erreur de ce côté là. Code :
|
||
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Pour la procédure normale, voici un exemple basé sur ton fonctionnement de compteur de nb de jours à vérifier (ça je n'ai pas fait de vérif de boucle infinie ou autre), à toi de tracer.
Il suffit simplement de passer par les dates, au moins pas de calcul à faire. Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||
|
|
10
|
|
|
#7 | |||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Citation:
Garde ce que tu as fait pour ton projet, mais retiens le select avec l'exception, c'est la meilleure méthode qui existe. Méthode avec for loop, pour le exit Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
|||
|
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2010 Messages : 36 ![]() |
En effet c'est beaucoup moins prise de tête que de gérer soi même les incrémentations de jours, même si je reste persuadé que c'est réalisable je dois juste faire des erreurs
![]() J'ai réussi à compiler, mais alors c'est à n'y rien comprendre ! La première fois, j'ai le fameux message d'erreur. J'enlève la ligne correspondant à l'appel de la fonction unitaire, je compile. Je la remet, sans le commentaire et sans indentation, cela compile. J'indente la ligne, j'ai de nouveau le message d'erreur. Je met le point virgule du END à une nouvelle ligne, je compile. J'ajoute le commentaire, je compile. Je remet le point virgule derrière le END, je compile toujours. Bon.. on va dire que l'essentiel est là (Maintenant je vais voir si la fonction est correcte et répond bien aux attentes) mais je dois dire que je ne comprend vraiment pas ! Pourquoi cela ne compile pas puis soudainement cela compile ? ... Si je sélectionne toute ma fonction, que je fais "run" j'ai de nouveau le message d'erreur, mais en me plaçant à la fin du bloc, derrière le point virgule cela fonctionne. En tout cas je te remercie pour ton aide précieuse, tu as passé pas mal de temps à me répondre c'est sympa Si jamais j'ai un autre problème je posterais dans la continuité de ce topic, mais j'essayerais bien avant de le résoudre seul Edit: Ok pour le select, ça me paraît aussi moins demandeur en ressources. Je vais voir si ma méthode est réactive, si elle ne l'est pas je changerais ! Tu m'incites vraiment à oublier mon Open Cursor Le EXIT WHEN moncurseur%NOTFOUND OR valRetour = 0 fonctionne quand même non ? |
|
|
00
|
|
|
#9 | |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Citation:
Sinon, pour tes erreurs de compilation, fais un SHOW ERROR pour connaitre le problème.
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
|
00
|
|
|
#10 | ||
|
Nouveau Membre du Club
![]() Inscription : décembre 2010 Messages : 36 ![]() |
Citation:
Citation:
J'avais regardé hier, elles sont toutes vides. |
||
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Si, tu cliques sur "Editer", puis dans l'encadré Suppression, tu sélectionnes "Suppression logique".
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#12 | |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Citation:
http://www.developpez.net/forums/d21...ge-show-error/
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2010 Messages : 36 ![]() |
Je compile sous l'interface d'oracle.
Je n'aime pas trop SqlDevelopper, je le trouve trop gourmand en ressources et il ne m'apporte rien de plus.. Sinon en recours je peux utiliser sql+ dans mon terminal, mais je ne le maîtrise pas. |
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Ce que tu appelles l'interface d'oracle c'est une interface web développé en apex pour construire des applis web.
Par contre pour créer tes procédures stokées ce n'est pas le mieux, d'ailleurs ton erreur de base Citation:
Utilises sql+, pour plus de facilité, place ton code dans un fichier texte, tonfichier.sql, puis depuis l'invite de commande déplace toi jusqu'au dossier dans lequel tu as créé le fichier. Ensuite tu te connectes à sql+ puis pour appeler le fichier tu fais : Après l'IHM apex est bien pour voir tes tables, tes procédures, faire quelques requêtes voir si le code a bien fonctionné, mais pas trop pour debugger du PL/SQL. Sqldeveloper est plus lourd c'est vrai, mais lui c'est un vrai environnement de développement PL/SQL. |
|
|
|
00
|
|
|
#15 | ||
|
Nouveau Membre du Club
![]() Inscription : décembre 2010 Messages : 36 ![]() |
Bonjour,
Sous sqlplus le même code qui me fait une erreur apex ne me donne aucune erreur.. Je lance sql plus depuis mon dossier, je m'identifie avec le même compte. Code :
Autrement ok pour l'interface Apex, en gros c'est le concurrent propriétaire de phpmyadmin sous mysql. Mais bon c'est dommage que ce ne soit pas optimisé pour le pl/sql, j'aime bien les interfaces simples et légères... |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com