Pregunta

Tengo una tabla que contiene una columna de tipo Number

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

y en una secuencia de comandos SQL PL, quiero convertir ese campo a un varchar. Sin embargo, no sé su longitud, por lo que obtener una excepción

  

Mensaje de excepción es ORA-06502:   PL / SQL: error numérico o valor:   búfer de cadena de caracteres demasiado pequeño

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

¿Cómo debo declarar la memoria intermedia v_some_field? Si lo establece a varchar (32767) parece bastante bruta, ¿hay alguna alternativa?

¿Fue útil?

Solución

que está recibiendo un error no porque el número es demasiado grande, pero debido a que el resultado de su to_char es de 22 caracteres de longitud (21x "9" + un carácter para el signo):

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

Otros consejos

podría determinar la longitud máxima de sus varchar2 convertida mediante la conversión de un valor negativo con dígitos integrales y fraccionarios:

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

La salida es 41 para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top