Oracle — число в varchar

У меня есть таблица, содержащая столбец типа Number

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

и в сценарии PL SQL я хочу преобразовать это поле в varchar. Однако я не знаю его длины, поэтому получаю исключение

Сообщение об исключении: ORA-06502: PL/SQL: ошибка числа или значения: буфер символьной строки слишком мал

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

Как мне объявить буфер v_some_field? Установка его на varchar(32767) кажется довольно грубой, есть ли альтернатива?


person Tom    schedule 19.10.2009    source источник


Ответы (2)


вы получаете сообщение об ошибке не потому, что число слишком велико, а потому, что результат вашего to_char имеет длину 22 символа (21x"9"+один символ для знака):

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
person Vincent Malgrat    schedule 19.10.2009

Вы можете определить максимальную длину вашего преобразованного varchar2, преобразовав отрицательное значение с целыми и дробными цифрами:

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

Результат у меня 41.

person Juergen Hartelt    schedule 20.10.2009