#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, чтобы она извлекала содержимое сообщения из временной таблицы, а не из параметра.
Здесь есть хорошая информация о работе с ДЛИННЫМИ полями:
Комментарии:
1. Большое вам спасибо. Я работаю с вашим вторым ответом (получение содержимого сообщения из временной таблицы)
Ответ №2:
Поле VARCHAR2 может принимать не более 4000 символов. Но это становится очевидным, когда вы создаете таблицу с полем VARCHAR2.
Я решил это, когда понял, что пытаюсь ввести строку из 4000 символов в поле Varchar2.
Я уменьшил длину записи, и ошибка исчезла.
В таблице были другие ЧИСЛОВЫЕ поля, которые изначально сбили меня с толку.
Ответ №3:
Иногда содержимое моего задания форматируется в формате PLSQL с большим количеством пробелов. Поэтому я делаю это перед отправкой задания, чтобы уменьшить дополнительное пустое пространство и (надеюсь) уменьшить длину до 4000.
FOR i IN 1..9 LOOP
v_sql := replace(v_sql,' ',' ');
END LOOP;