我在尝试合并到包含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
答案 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
);