【问题标题】:SYS.DBMS_JOB causes error "ORA-01461 can bind a LONG value only for insert into a LONG column"SYS.DBMS_JOB 导致错误“ORA-01461 只能绑定 LONG 值以插入 LONG 列”
【发布时间】:2011-10-30 13:08:11
【问题描述】:

我在 Oracle 数据库 10g 上使用 Oracle PL/SQL

我使用 SYS.DBS_JOB 设置发送电子邮件的作业。 [我不能简单地直接发送电子邮件,因为我要发送很多电子邮件并且发送速度太快会使邮件服务器过载。因此,我运行一个循环以每分钟发送一封电子邮件]

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

作业的文本很长(2886 个字符),作业失败并显示消息“ORA-01461 只能绑定 LONG 值以插入 LONG 列”

现在我很确定作业失败的原因是因为文本太长。但是我原以为错误消息是“字符串无法放入列”

假设我的字符串太长是对的,最大长度是多少,以及如何解决这个问题...

谢谢

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    PL/SQL 限制了您可以直接使用 LONG 字段执行的操作,而且听起来您的 mymessage 字段很长。在 10g 中,最好使用 CLOB 字段来处理类似的事情,这样可以更容易地直接操作。

    首先,尝试使用 TO_LOB() 函数包装此调用中的任何 LONG 字段,看看是否有效。或者,可能是您的消息溢出了 DBMS_JOB.SUBMIT 期望的 varchar2;然后,Oracle 可能会将您的字符串视为 LONG。在这种情况下,您必须重写 HTML_EMAIL 函数,以便它从临时表而不是参数中检索消息内容。

    这里有一些关于使用 LONG 字段的好信息:

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

    【讨论】:

    • 非常感谢。我正在处理您的第二个答案(从临时表中检索消息内容)
    【解决方案2】:

    VARCHAR2 字段最多只能接受 4000 个字符。但是,当您创建带有 VARCHAR2 字段的表时,这一点变得很明显。

    当我发现我试图在 Varchar2 字段中输入一个超过 4000 个字符的字符串时,我解决了这个问题。

    我减少了条目的长度并且错误消失了。

    表中还有其他 NUMBER 个字段,这让我一开始就不知所措。

    【讨论】:

      【解决方案3】:

      有时我的工作内容采用带有大量空白的 PLSQL 格式。所以我在提交作业之前这样做以减少额外的空白并(希望)将长度减少到 4000 以下。

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

      【讨论】:

        猜你喜欢
        • 2012-07-08
        • 2013-06-01
        • 2014-09-20
        • 2017-08-29
        • 2020-06-22
        • 2013-10-24
        • 1970-01-01
        • 2016-05-07
        相关资源
        最近更新 更多