Обновление TOAD 13: выберите в вызывает ошибку «ошибка числа или значения: буфер символьной строки слишком мал»

#oracle #toad

#Oracle #toad

Вопрос:

После обновления с TOAD v12 до v13 функция выполнения от имени сценария (F5) выдает «ORA-06502: PL / SQL: ошибка числа или значения: буфер символьной строки слишком мал» в следующем сценарии:

 VAR v_analyzed VARCHAR2(10); 

EXEC SELECT TO_CHAR(MAX( LAST_ANALYZED) ) INTO : v_analyzed FROM ALL_TAB_COLUMNS;

TTITLE ALL_TABS
SELECT *
FROM ALL_TAB_COLUMNS
WHERE TRUNC(LAST_ANALYZED) =  TO_DATE (:v_analyzed);

TTITLE ANALYZED_DATE
SELECT :v_analyzed AS ANALYZED FROM DUAL;
 

v12 дает мне хорошие вкладки ниже, используя заголовок в качестве метки вкладки.

Ответ №1:

PL/SQL: numeric or value error: character string buffer too small возникает везде, где вы объявляете строковую переменную фиксированной длины, и ваш код пытается присвоить значение, длина которого превышает объявленную длину.

Единственное место, где вы объявили строковую переменную v_analyzed , и вы объявили, что она имеет длину 10 символов. Что произойдет, если вы измените его на больший размер, скажем, на 32 символа? Я думаю, вы увидите, что проблема исчезнет.

В данном случае произошло то, что, скорее всего, обновление с Toad 12 до 13 также изменило версию клиента Oracle или настройки по умолчанию. Когда вы вызываете to_char() дату и не указываете формат, Oracle использует настройки формата даты вашего клиента по умолчанию. Не видя вашей конкретной настройки, я предполагаю, что формат Toad 13 по умолчанию для дат отличается от Toad 12 и выдает строку длиной более 10 символов.

По моему опыту, лучше всегда указывать формат даты при вызове to_char() , чтобы предотвратить любые странности, связанные с изменением настроек формата по умолчанию.

Комментарии:

1. Я тестировал с 100 и 1000 символами. Я получил тот же результат. Обе версии используют Oraclient12Home.

2. Определенно не то, что я ожидал услышать. Хотел бы я быть более полезным.

3. «Я получил тот же результат». Тем не менее, вы ВСЕГДА должны указывать маску формата при использовании to_char()

4. Аналогично, вы всегда должны указывать маску формата при использовании TO_DATE .

5. @mikeinman Я смог воссоздать ошибку, но когда я увеличил размер v_analyzed до чрезвычайно большого размера (320000), он работал нормально. Я использую Toad v14.