.net - 甲骨文11g : ORA-22284 on insertion into table with CLOB field > ~1350 chars

标签 .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 不支持重复的长绑定(bind)”。

我很困惑。谁能解释一下为什么会发生这种情况?

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

谢谢

直流

最佳答案

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

在您的代码中,您有 2 个 :xml_data 参数实例:一个用于更新,一个用于插入。因此,1 个形式参数值必须绑定(bind)到查询中的 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
  );

关于.net - 甲骨文11g : ORA-22284 on insertion into table with CLOB field > ~1350 chars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23915140/

相关文章:

.net - 连接到 Oracle 数据源时,OdbcDataReader 会去除小数点

javascript - 如何设置级联select2值onClick

java - .NET 和 Java 产生不同的签名

c# - 获取方法还是私有(private)属性(property)?

c# - 这是内存泄漏还是垃圾收集会修复它

sql - 在 Oracle 中计算条件累积总和

.net - 组合框选定值返回 DataRowView

oracle - 获取重定向 URL 的 PL/SQL 代码

sql - 如何优化 SELECT 语句中的 XQUERY?

sql - 寻求在较大表上调优 Oracle SQL 的技巧和教程