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;
我目前正在使用 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;