循环遍历pl / sql中的clob数据。将变量设置为当前迭代时类型无效

安德鲁

我目前正在使用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集合?还是有更好的方法来做到这一点?

肖恩·彼得森(Shaun Peterson)

下面的语句填充一个记录变量,该记录变量包含select中的所有字段(在本例中为一个XML_DATA)。

for xData in (select XML_DATA from layout where owner=85)

所以您要分配的是

l_xml := xData.XML_DATA;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章