我目前正在使用pl / sql尝试遍历表中clob列中的某些数据。当我仅使用选择查询并对clob数据执行操作时,该过程就可以正常完成。这是一个例子:
DECLARE
l_xml Clob;
type fieldIds is table of number;
isIdInTable Number;
BEGIN
select XML_DATA into l_xml from layout where layout_id=801;
l_xml := XML_DATA;
FOR cur_rec IN (
SELECT xt.*
FROM XMLTABLE('*//field'
PASSING XMLTYPE(l_xml)
COLUMNS
fieldId VARCHAR2(4000) PATH '@id'
) xt)
LOOP
DBMS_OUTPUT.put_line('id=' || cur_rec.fieldId );
select count(1) into isIdInTable from tempCustomFieldDefTable where USEDID = cur_rec.fieldId;
if cur_rec.fieldId is not null then
if isIdInTable = 0 then
insert into tempCustomFieldDefTable values(cur_rec.fieldId);
end if;
end if;
END LOOP;
END;
但是,当我尝试使用以下方法遍历Clob集合时,收到此错误:PLS-00382:将变量l_xml设置为当前迭代XML_DATA时,表达式的类型错误。我试图找到“ into”语法和在pl / sql中设置变量之间的区别,但无法找到答案。此外,我还尝试将XML_DATA转换为VARCHAR2并使用to_clob。
DECLARE
l_xml CLOB;
type fieldIds is table of number;
isIdInTable Number;
BEGIN
for xData in (select XML_DATA from layout where owner=85)
Loop
l_xml := xData;
FOR cur_rec IN (
SELECT xt.*
FROM XMLTABLE('*//field'
PASSING XMLTYPE(l_xml)
COLUMNS
fieldId VARCHAR2(4000) PATH '@id'
) xt)
LOOP
DBMS_OUTPUT.put_line('id=' || cur_rec.fieldId );
select count(1) into isIdInTable from tempCustomFieldDefTable where USEDID = cur_rec.fieldId;
if cur_rec.fieldId is not null then
if isIdInTable = 0 then
insert into tempCustomFieldDefTable values(cur_rec.fieldId);
end if;
end if;
END LOOP;
End loop;
END;
如何使用for X语法正确循环遍历Clob集合?还是有更好的方法来做到这一点?
下面的语句填充一个记录变量,该记录变量包含select中的所有字段(在本例中为一个XML_DATA)。
for xData in (select XML_DATA from layout where owner=85)
所以您要分配的是
l_xml := xData.XML_DATA;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句