Question

J'ai une table contenant une colonne de type Number

create table tmp (
    /*other fields*/
    some_field Number
)

et dans un script PL SQL, je veux convertir ce champ à un varchar. Cependant, je ne sais pas sa longueur, donc je reçois une exception

  

Message d'exception est ORA-06502:   PL / SQL: erreur numérique ou de la valeur:   tampon de chaîne de caractères trop petit

v_some_field varchar(21);
/*...*/
v_some_field := TO_CHAR(some_field,'999999999999999999999');

Comment dois-je déclarer le tampon de v_some_field? Réglage à varchar (32767) semble tout à fait brute, est-il une alternative?

Était-ce utile?

La solution

vous obtenez une erreur non pas parce que le nombre est trop grand, mais parce que le résultat de votre to_char est de 22 caractères (21x « 9 » + un caractère pour le signe):

SQL> DECLARE
  2     some_field   NUMBER := 123;
  3     v_some_field VARCHAR(21);
  4  BEGIN
  5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
  6  END;
  7  /

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 6

SQL> DECLARE
  2     some_field   NUMBER := 123;
  3     v_some_field VARCHAR(22);
  4  BEGIN
  5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
  6  END;
  7  /

PL/SQL procedure successfully completed

Autres conseils

Vous pouvez déterminer la longueur maximale de votre varchar2 convertie en convertissant une valeur négative avec des chiffres et des fractions intégrales:

set serveroutput on
declare
   n number;
begin
   n := -4/3;
   dbms_output.put_line(length(to_char(n)));
end;
/

La sortie est 41 pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top