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

issue looping over clob data in pl/sql. invalid type when setting variable to current iteration

我目前正在使用 pl/sql 尝试从 table 循环遍历 clob 列中的一些数据。当我只使用 select 查询并对 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 in 语法正确循环 clob 集合?或者有更好的方法吗?

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

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

所以你在作业中想要的是

l_xml := xData.XML_DATA;