Oracle 11g:使用CLOB字段插入表中的ORA-22284> ~1350个字符

时间:2014-05-28 14:58:34

标签: .net oracle plsql oracle11g

我在尝试合并到包含CLOB字段的表时遇到了麻烦。

我正在使用.Net FrameWork v4.5代码库生成SQL语句,如下所示:

MERGE INTO md_metadata.md_report_templates TARGET
USING (SELECT 1
       FROM   dual)
ON (TARGET.id=:template_id)
WHEN matched THEN
  UPDATE SET title = :title,
             description = :description,
             xml_data = :xml_data,
             technology = :technology,
             modification_date = :modification_date,
             reports_list = :reports_list
WHEN NOT matched THEN
  INSERT(id,
         title,
         description,
         xml_data,
         is_private,
         technology,
         owner,
         modification_date,
         reports_list)
  VALUES(:template_id,
         :title,
         :description,
         :xml_data,
         :is_private,
         :technology,
         :owner,
         :modification_date,
         :reports_list);  

这里xml_data是一个CLOB字段。此语句的目的是将一行插入(或更新)到包含表单模板的XML描述的表中。只要:xml_data参数长度不超过~1350个字符或~2700个字节,此语句就可以正常工作。一旦发生这种情况,Oracle数据访问客户端(4.121.1.0)就会抛出异常' ORA-22284不支持重复的长绑定'。

我感到困惑。任何人都可以解释为什么会发生这种情况吗?

如果在xml_data中使用较短的值插入行,然后在单独的语句中使用xml_data中的原始(1350+ ch)值进行更新,则可以按预期工作!

谢谢,

DC

1 个答案:

答案 0 :(得分:4)

ORA-22284:不支持重复LONG绑定
    原因:LOB访问层无法处理重复的LONG绑定     操作:提供不同的LONG或VARCHAR绑定。

在您的代码中,您有2个:xml_data参数实例:一个用于更新,一个用于插入。因此,必须将一个形式参数值绑定到查询中的2个实际位置。

可能的解决方法之一是稍微重构一下查询:

MERGE INTO md_metadata.md_report_templates TARGET
USING (
  SELECT
    :template_id       as template_id
    :title             as title,
    :description       as description,
    :xml_data          as xml_data,
    :technology        as technology,
    :modification_date as modification_date,
    :reports_list      as reports_list
  FROM  dual
) SRC_TEMPLATE
ON (
  TARGET.id = SRC_TEMPLATE.template_id
)
WHEN matched THEN
  UPDATE SET title             = SRC_TEMPLATE.title,
             description       = SRC_TEMPLATE.description,
             xml_data          = SRC_TEMPLATE.xml_data,
             technology        = SRC_TEMPLATE.technology,
             modification_date = SRC_TEMPLATE.modification_date,
             reports_list      = SRC_TEMPLATE.reports_list
WHEN NOT matched THEN
  INSERT(
    id,
    title,
    description,
    xml_data,
    is_private,
    technology,
    owner,
    modification_date,
    reports_list
  ) VALUES(
    SRC_TEMPLATE.template_id,
    SRC_TEMPLATE.title,
    SRC_TEMPLATE.description,
    SRC_TEMPLATE.xml_data,
    SRC_TEMPLATE.is_private,
    SRC_TEMPLATE.technology,
    SRC_TEMPLATE.owner,
    SRC_TEMPLATE.modification_date,
    SRC_TEMPLATE.reports_list
  );