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) кажется довольно грубой, есть ли какая-нибудь альтернатива?
Решение
вы получаете сообщение об ошибке не потому, что число слишком велико, а потому, что результат вашего 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
Другие советы
Вы могли бы определить максимальную длину вашего преобразованного varchar2, преобразовав отрицательное значение в целые и дробные цифры:
set serveroutput on
declare
n number;
begin
n := -4/3;
dbms_output.put_line(length(to_char(n)));
end;
/
Результат для меня равен 41.