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 :

Buffer insuffisant pour un paramètre de procédure


Sujet :

PL/SQL Oracle

  1. #1
    bruce-willis
    Invité(e)
    Par défaut Buffer insuffisant pour un paramètre de procédure
    Bonjour,

    J'ai l'erreur
    ORA-06502 PL/SQL: numeric or value error character string buffer too small
    sur un paramètre de type VARCHAR2 que je comprends pas du tout.

    La seule utilisation de ce paramètre dans la procédure c'est une condition if
    if (v_status <> '0')
    Pour plus de précision, la valeur saisie dans ce paramètre est entrée au sein d'un code d'application utilisant ADO/ODBC (une VARIANT booléenne TRUE(-1)/FALSE(0))

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Comment est déclarée ta variable?

  3. #3
    bruce-willis
    Invité(e)
    Par défaut
    v_status varchar2 est un argument de la procédure, je ne comprends ce qui peut-être d'insuffisant avec cela

  4. #4
    bruce-willis
    Invité(e)
    Par défaut
    Le plus bizarre c'est:
    ORA-06512: at line 1
    C'est sur que ce paramètre qui est en cause mais il n'est pas en line 1!!!

    Qui peut m'éclaircir?

    REM: le plus bizarre c'est que j'ai réussi à passer 1 fois cette procédure et qu'une autre procédure un peu identique marche sans problème donc je me demande pourquoi il y a "buffer too small"??
    Dernière modification par bruce-willis ; 16/09/2008 à 13h29.

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Tu peux poster du code un peu plus complet nous permettant de voir le contexte?

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    bruce-willis
    Invité(e)
    Par défaut
    La procédure est très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    CREATE  OR REPLACE procedure dbo.deleteEast
      (
    v_ID varchar2,
      v_Result  OUT int ,
      v_status varchar2 default '0',
      v_tool varchar2 := NULL)
     
     
    AS  
     
       vson varchar2(38):=v_ID;
    	vs varchar2(38);
    	vfather varchar2(38);
    	v_val DATE;
     
     
    BEGIN 
     
     
    		v_Result := -1;
     
     
    		while (1=1) loop
     
    		/* 1 step-forward*/
      			vs:=NULL;
     
    			select ID into vs from westtable where IDParentGroup=vson ;
     
     
     
    			if (vs is null) then
     
    				/* step-forward fails 
    				-- 2 staff on deletion*/
     
     				select IDParentGroup into vfather from westtable where ID=vson; 
     
    				delete from northtable where IDGroup = vson;
    				update quarktable SET IDGroup = NULL WHERE IDGroup = vson;
    				delete from northtable where ID = vson ; 
     
     
     
     
    				if(vson=v_ID ) then
    					v_Result := 0;
    					exit;
    				end if;	
     
     
    				vs:=NULL;
     
         			select ID into vs from  westtable where IDParentGroup=vfather and vson<>ID; 
     
     
    				 if(vs is  NULL)then
    					 vson:=vfather; /* return to parent so on next step of the loop to be deleted		*/
    				 end if	;
     
    				vson:=vs;
     
     
    			end if ;
     
    			vson:=vs;
     
     
     
     end loop;
     
    if v_Result <> 0 then 
    	ROLLBACK ;
    	return;
    else 
    	commit;
    	IF (v_status <> '0')then
    		 ChangeTool(v_tool,v_val);
    		Return;      
    	end if;
    	return	;
    end if;
    Pour le code C++ utilisant ADO, voici la variable en paramètre de la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _variant_t varTemp_bStat = a_bStatus;
    Puis on affecte juste ce _variant_t au Value d'un FieldPtr et c'est tout!!!
    Et pourtant ça marche pas!

  7. #7
    bruce-willis
    Invité(e)
    Par défaut
    Actuellement, j'ai réussi à reproduire plus précisement quand l'exception se déclenche.
    J'ai essayé cette version simplifiée de la procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create or replace procedure TestVTBOOL
    (
      v_ID varchar2,
      v_Res  OUT int ,
      v_status varchar2 default '0',
      v_text varchar2 := NULL
    )
    as
    begin
      v_Res := -1;
      dbms_output.put_line(v_status);
    end;
    Quand on entre sur v_status la valeur '0', ORA-06502 se déclenche.
    bIsStatus = false;
    varTemp_bStat = bIsStatus;

    Mais quand c'est '-1', 'abcd' la procédure passe très bien

    Citation Envoyé par bruce-willis
    et qu'une autre procédure un peu identique marche sans problème donc je me demande pourquoi il y a "buffer too small"??
    En effet, l'exception n'apparaît que sur cette procédure de 4 param dont le 2è est un OUT. L'autre procédure est de 5 paramètres et ça passe

    Le plus bizarre aussi c'est que j'obtiens comme v_Res (OUT param) dans mon application la valeur de v_status. Il est évident qu'il y a problème de mémoire là: Oracle ou ADO ou ODBC je ne sais plus

    Je pense que c'est un bug ADO/ODBC!!!
    Dernière modification par bruce-willis ; 19/09/2008 à 16h29.

  8. #8
    bruce-willis
    Invité(e)
    Par défaut
    Citation Envoyé par bruce-willis Voir le message
    Le plus bizarre aussi c'est que j'obtiens comme v_Res (OUT param) dans mon application la valeur de v_status. Il est évident qu'il y a problème de mémoire là: Oracle ou ADO ou ODBC je ne sais plus
    De plus, j'ajoute aussi cette autre remarque au cas où certains d'entre eux identifieraient le problème avec
    1) Le problème se produit en fait lorsque v_status est vide ou de 1 caractère, il faut donc au moins 2 caractères
    2) Même si c'est 2 kar et plus, on a encore l'erreur si v_Res (le retour OUT) est avec plusieurs chiffres comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE procedure TestVTBOOL
    (
      v_ID varchar2,
      v_Res  OUT int ,
      v_status varchar2 DEFAULT '0',
      v_text varchar2 := NULL
    )
    AS
    begin
      v_Res := 555555;
      dbms_output.put_line(v_status);
    end;
    Que déduis-je de cela ???

    L'exécution sous SQL*PLUS du code suivant est 100% OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set serveroutput on
    declare
    n int;
    begin
    testvtbool('aaa',n,'FALSE','sfqsdfqsfqs');
    dbms_output.put_line(n);
    end;
    C'est sous ADO/ODBC que le problème apparaît
    Dernière modification par bruce-willis ; 23/09/2008 à 12h54.

  9. #9
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    Mes petites expériences avec OleDb (ADO) et Oracle m'ont prouvé des bizarreries de ce genre! (le OUT prend toujours la valeur de v_status alors que v_Res est toujours affecté, pourquoi un changement de v_Res de type int peut planter la procédure)
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  10. #10
    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 bruce-willis Voir le message
    ...
    Que déduis-je de cela ???

    L'exécution sous SQL*PLUS du code suivant est 100% OK
    ...
    C'est sous ADO/ODBC que le problème apparaît
    Qu’il y a un problème de binding entre les variables du langage que tu utilise (VB, C#, etc) et les paramètres passées à la procédure ! Donc en plus du code de la procédure tu devrait poster la déclaration des variables et l’appel à la procédure pour pouvoir juger correctement de la situation. Cella n’exclut pas des bugs dans Ado/Odbc, etc.

  11. #11
    bruce-willis
    Invité(e)
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Qu’il y a un problème de binding entre les variables du langage que tu utilise (VB, C#, etc) et les paramètres passées à la procédure ! Donc en plus du code de la procédure tu devrait poster la déclaration des variables et l’appel à la procédure pour pouvoir juger correctement de la situation. Cella n’exclut pas des bugs dans Ado/Odbc, etc.
    J'ai vérifié, c'est pas un problème de binding!!!
    Le problème c'est en fait le placement du paramètre OUT: souvent je met les out en derniers mais cette fois, c'est en 2è place. Donc, bizarrement, il reçoit comme valeur après exécution de la procédure la valeur du 3è paramètre, le 3è reçoit celle de 4è et ainsi de suite (le dernier paramètre est NULL)

  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 bruce-willis Voir le message
    J'ai vérifié, c'est pas un problème de binding!!!
    Le problème c'est en fait le placement du paramètre OUT: souvent je met les out en derniers mais cette fois, c'est en 2è place. Donc, bizarrement, il reçoit comme valeur après exécution de la procédure la valeur du 3è paramètre, le 3è reçoit celle de 4è et ainsi de suite (le dernier paramètre est NULL)
    Et comment tu t'expliques qu'en sqlplus il n'y a pas de problème ? Le problème du binding peut exister au niveau des couches ADO/ODBC. Mais comment juger sans les déclarations des variables et le code d'appel de la procédure ?
    Sinon en PL/SQL il n'y pas de restrictions sur le positionnement des paramètres OUT.

  13. #13
    bruce-willis
    Invité(e)
    Par défaut
    Et comment tu t'expliques qu'en sqlplus il n'y a pas de problème?
    .......................
    Sinon en PL/SQL il n'y pas de restrictions sur le positionnement des paramètres OUT.
    En fait, tout est de ma faute, normal s'il y a "string buffer too small" car le paramètre VARCHAR2 est copié par erreur dans le paramètre OUT qui n'est que de type INT!!!! Fausse manipulation d'exécution de procédure sous ADO (CommandPtr)

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/10/2010, 20h11
  2. Réponses: 1
    Dernier message: 06/04/2010, 12h47
  3. Paramètres sur Procédure stockée
    Par StarMusic dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/03/2006, 14h58
  4. passer un nom de champs en paramètre de procédure stockée
    Par dor_boucle dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/02/2006, 19h10
  5. Réponses: 4
    Dernier message: 08/06/2005, 23h28

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