SYS.DBMS_JOB вызывает ошибку «ORA-01461 может привязать ДЛИННОЕ значение только для вставки в ДЛИННЫЙ столбец»

#oracle #plsql

#Oracle #plsql

Вопрос:

Я использую Oracle PL / SQL в Oracle Database 10g

Я использую SYS.DBS_JOB, чтобы задать задание для отправки электронной почты. [Я не могу просто отправить электронное письмо напрямую, потому что я отправляю довольно много электронных писем, и их слишком быстрая отправка перегружает почтовый сервер. Поэтому я запускаю цикл для отправки одного электронного письма каждую минуту]

 DBMS_JOB.submit
                    (l_job,
                        'begin HTML_EMAIL (''noreply@mywebsite.com'','''
                     || myrecord.email
                     || ''','''
                     || mytitle
                     || ''','''
                     || ' '
                     || ''','''
                     || mymessage
                     || ''');end;',
                     schedule_date
                    );
 

Текст задания довольно длинный (2886 символов), и задание завершается ошибкой с сообщением «ORA-01461 может привязать ДЛИННОЕ значение только для вставки в ДЛИННЫЙ столбец»

Теперь я почти уверен, что причина сбоя задания заключается в том, что текст слишком длинный. Однако я бы подумал, что сообщение об ошибке было бы «Строка не может поместиться в столбец»

Предполагая, что я прав, что моя строка слишком длинная, какова максимальная длина, а также как я могу обойти эту проблему…

Спасибо

Ответ №1:

PL / SQL ограничен в том, что вы можете делать непосредственно с ДЛИННЫМИ полями, и похоже, что ваше поле mymessage длинное. В 10g вам лучше использовать поля CLOB для чего-то подобного, которыми можно управлять напрямую гораздо проще.

Для начала попробуйте обернуть любые ДЛИННЫЕ поля в этом вызове функцией TO_LOB() и посмотреть, работает ли это. С другой стороны, может случиться так, что ваше сообщение переполняет varchar2, который ожидает DBMS_JOB.SUBMIT; Тогда Oracle может рассматривать вашу строку как LONG . В этом случае вам придется переписать вашу функцию HTML_EMAIL, чтобы она извлекала содержимое сообщения из временной таблицы, а не из параметра.

Здесь есть хорошая информация о работе с ДЛИННЫМИ полями:

http://www.oracle-developer.net/display.php?id=430

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

1. Большое вам спасибо. Я работаю с вашим вторым ответом (получение содержимого сообщения из временной таблицы)

Ответ №2:

Поле VARCHAR2 может принимать не более 4000 символов. Но это становится очевидным, когда вы создаете таблицу с полем VARCHAR2.

Я решил это, когда понял, что пытаюсь ввести строку из 4000 символов в поле Varchar2.

Я уменьшил длину записи, и ошибка исчезла.

В таблице были другие ЧИСЛОВЫЕ поля, которые изначально сбили меня с толку.

Ответ №3:

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

    FOR i IN 1..9 LOOP
      v_sql := replace(v_sql,'  ',' ');
   END LOOP;