我在尝试合并到包含 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/