2/9/10

ORA-06502

ORA-06502: PL/SQL: error numérico o de valor (PL/SQL: numeric or value error string).
La causa suele ser un cálculo numérico, cadena, conversión o limitación se ha producido un error. Por ejemplo, este error se produce si se hace un intento de asignar el valor NULL a una variable declarada NOT NULL, o si se hace un intento de asignar un número entero mayor que 99 a una variable declarada NÚMERO (2).

Ejemplos de código erróneo
A continuación veremos varios ejemplo de cómo puede darnos este error.
Tamaño de la cadena: en este caso la cadena no tiene suficiente tamaño para albergar el valor bananas
SQL> DECLARE
2 v_test VARCHAR2(1);
3 BEGIN
4 v_test := 'bananas';
5 END;
6 /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
Buffer de salida: este error es menos común ya que sólo se reproduce cuando intentamos imprimir por el buffer una cadena de más de 4000 caracteres.
DECLARE
cadena VARCHAR2(32000);
num NUMBER := 0;
BEGIN
DBMS_OUTPUT.ENABLE(7000);
WHILE num < 4001 LOOP cadena := cadena || '-'; num := num + 1; END LOOP; DBMS_OUTPUT.PUT_LINE(cadena); END;


Observamos que tanto la variable cadena como el buffer soportan más de 4000 caracteres. El problema viene dado porque no se puede imprimir una cadena de más de 4000 caracteres, ya que antiguamente las variables de cadena tenían un tamaño tope de 4000. Una posible solución sería imprimir la variable cadena por fases:
DECLARE
cadena VARCHAR2(32000);
num NUMBER := 0;
cad VARCHAR2(4000);
BEGIN
DBMS_OUTPUT.ENABLE(7000);
WHILE num < 4001 LOOP cadena := cadena || '-'; num := num + 1; END LOOP; cad := SUBSTR(sql_, 0 , 4000); DBMS_OUTPUT.PUT_LINE(cad); num := 1; WHILE (4000 * num) < length(sql_) LOOP cad := SUBSTR(sql_, 0 + (4000*num), 4000 * num); DBMS_OUTPUT.PUT_LINE(cad); num := num + 1; END LOOP; END;


Fuentes
Fuente original

No hay comentarios:

Publicar un comentario