Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/02/2008, 07h28   #1
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut Procédure d'insertion qui ne s'exécute pas très bien

Bonjour,

Voici une procédure stockée qui consiste clairement à insérer un enregistrement dans la table TableCategories !!
Je lance en fait cette procédure à partir de mon programme (en VB) sous ADO avec l'instruction Execute().
Et ben, la fonction vb s'exécute sans exception/erreur mais rien est fait du côté de la base, pas de nouvel enregistrement dans la table TableCategories alors que je pense que cette procédure est OK non ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CREATE  OR REPLACE procedure NewFieldInCateg
   (v_LastUser varchar2 ,
  v_LastWorkstation varchar2 ,
  v_DS int,
  v_IDCategory varchar2,
  v_Name varchar2 ,
  v_Class varchar2 ,
  v_Type int,
  v_ID varchar2,
  v_IDClass out varchar2,
  v_Result out int )
 
AS
 
 
BEGIN
  v_Result := -1;
 
  SELECT ID INTO v_IDClass FROM TableClasses WHERE Name = v_Class;
 
  INSERT INTO TableCategories (ID, system, Name, IDParentCategory, IDClass, Type, DocumentStatus, DateCreation, DateModification, LastUser, LastWorkstation, CreatorUser, CREATORWORKSTATION)
      VALUES (v_ID, 1, v_Name, v_IDCategory, v_IDClass, v_Type,v_DS,localtimestamp,localtimestamp, v_LastUser, v_LastWorkstation, v_LastUser, v_LastWorkstation);
 
      UPDATE TableCategories SET "SYSTEM" = 0
	  WHERE id = v_ID;
 
 
 IF (v_ID IS NOT NULL) then
		COMMIT ;
		RETURN;
 END IF;
 
ROLLBACK ;
 
EXCEPTION
   when others then
     dbms_output.put_line(SQLCODE);
 
 
end NewFieldInCateg;
Comment tester cette procédure sous SQL+ par exemple ou d'une autre manière que dans mon application vb
  Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 08h40   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Vous pouvez tester un appel de procédure avec les commandes SQL*Plus suivantes:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
variable n number;
variable s varchar2(10);
 
 
begin
:n := 1;
:s := 'test';
end;
/
exec maprocedure(:n, s:);

Attention dans cette partie de code en cas de levée d'exception, vous perdez l'exception:

Code :
1
2
3
EXCEPTION
   when others then
     dbms_output.put_line(SQLCODE);

Il vaut mieux écrire:

Code :
1
2
3
4
EXCEPTION
   when others then
     dbms_output.put_line(SQLCODE);
     raise;
Et pour avoir l'affichage de DBMS_OUTPUT dans SQL*Plus, il faut ajouter:
Voir aussi le tutoriel Deplphi Oracle pour la partie gestion des exceptions:
http://laurent-dardenne.developpez.c...s-applicative/
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 09h40   #3
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
J'ai fait ce que tu as indiqué : raise;et SET serveroutput ON
et alors j'ai exécuté comme suit sous sql plus le test
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SET serveroutput ON
 
variable n number;
variable s varchar2(10);
 
 
begin
:n := 1;
:s := 'test';
end;
/
exec newfieldincateg('lucaspan\','pc04\',1,0,'CategPN04','','','{B4352A87-4B48-4B05-9250-6F0C03CAFFA1}',:s, :n);
Voici les erreurs, est-ce normal et pourquoi après "Procédure PL/SQL terminée avec succès.", il y a encore une erreur:
Citation:
Procédure PL/SQL terminée avec succès.

100
BEGIN newfieldincateg('lucaspan\','pc04\',1,0,'CategPN04','','','{B4352A87-4B48-4B05-9250-6F0C03CAFFA1}',:s, :n); END;

*
ERREUR à la ligne 1 :
ORA-01403: Aucune donnée trouvée
ORA-06512: à "MYSCHEMA.NEWFIELDINCATEG", ligne 38
ORA-06512: à ligne 1
  Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 09h50   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Code :
1
2
3
4
5
begin
:n := 1;
:s := 'test';
end;
/
se termine avec succés (1° message) mais tu as un SELECT qui ne retourne aucun résultat dans ta procédure.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 12h49   #5
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
L'erreur c'est en fait
Code :
1
2
3
4
5
Procédure PL/SQL terminée avec succès.
 
100
 
Procédure PL/SQL terminée avec succès.
Comment interpréter ce "100" qui devient "-6503" quand on change certains paramètres de la procédure à exécuter.
Même si le select ne retourne rien, ça retourne au moins une chaine vide qui n'affecte en rien l'INSERT alors pourquoi y a pas d'insertion ?

Curiosité :Existe-t-il un outil Oracle pour déboguer un script pl/sql pas à pas comme dans les EDI puissants (Visual Basic, Visual C++, etc.) c-à-d un SQL PLUS plus évolué

Dernière modification par Lucas Panny ; 20/02/2008 à 13h14.
  Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 13h27   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par Lucas Panny Voir le message
Même si le select ne retourne rien, ça retourne au moins une chaine vide qui n'affecte en rien l'INSERT alors pourquoi y a pas d'insertion ?
non, si le SELECT ne retourne rien tu pars en NO_DATA_FOUND qui là n'est pas géré donc dans le OTHERS.

D'ailleurs, on se demande bien pourquoi tu fait pas tout simplement un INSERT... SELECT... ton UPDATE n'est sensé mettre à jour que la nouvelle ligne insérée ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 15h22   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
Citation:
Envoyé par Lucas Panny Voir le message
...
Curiosité :Existe-t-il un outil Oracle pour déboguer un script pl/sql pas à pas comme dans les EDI puissants (Visual Basic, Visual C++, etc.) c-à-d un SQL PLUS plus évolué
SQL Developer fourni gratuitement par Oracle.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 07h33   #8
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par orafrance
non, si le SELECT ne retourne rien tu pars en NO_DATA_FOUND qui là n'est pas géré donc dans le OTHERS.
Et oui, c'est ça l'erreur "Aucune donnée trouvée". Est-ce une spécificité d'Oracle car en Access, c'est une chaine vide ? En fait, une chaîne vide c'est '' ou ' ' (il y a un espace) ??
Pour détourner ce retour de NO_DATA_FOUND
Code :
1
2
3
4
5
6
7
IF  v_Class =' ' then
         v_IDClass := NULL;
    else
 
    SELECT ID INTO v_IDClass FROM TableClasses WHERE Name = v_Class; 
 
    end IF ;
______________________________
Citation:
Envoyé par mnitu
SQL Developer fourni gratuitement par Oracle.
Merci !
  Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 08h34   #9
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Je réponds à moi même : pour un varchar, une chaine vide '' est égale à NULL aussi donc au lieu de IF v_Class =' ' then, je fais IF v_Class IS NULL then !!
En fait, le principe de cette procédure c'est que v_Class soit vide ou choisi parmi une liste de champs existants d'où ce test
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h16.


 
 
 
 
Partenaires

Hébergement Web