假设我有一个接受siteId和empId的过程 这使得主键(siteId emp.site_id%TYPE,empId emp.emp_id%TYPE) 我正在尝试创建一个xml clob,我有一个名为createParent()的方法,它创建一个父节点,另一个方法叫做put_child_node,它接受一个parentNode,子元素名称和子元素值,但是名称和属性取自两个表的连接。见代码:
DECLARE
cursor has_emp_attribute
select 1
from emp_attribute
where site_id = siteId
and emp_id = empId; <-- quick select
cursor get_emp_attributes
select an.name, ea.attribute_value
from attribute_name an, emp_attribute ea
where an.attribute_id = ea.attribute_id
and ea.site_id = siteId
and ea.emp_id = empId;
hasAttribute boolean;
parentNode xmldom.domnode;
BEGIN
hasAttribute := false
for has_emp_attribute_rec in has_emp_attribute
loop
hasAttribute := true;
parentNode = createParentNode();
exit;
end loop;
if (hasAttribute) then
for get_emp_rec in get_emp_attributes
loop
put_child_node(parentNode, get_emp_rec.name, get_emp_rec.attribute_value);
end loop;
end if;
END;
如果我使用if语句检查我们是否在第二个游标中有记录,并在那里创建parentNode这将是一个更好的解决方案:
cursor get_emp_attributes
select an.name, ea.attribute_value
from attribute_name an, emp_attribute ea
where an.attribute_id = ea.attribute_id
and ea.site_id = siteId
and ea.emp_id = empId;
hasAttribute boolean;
parentNode xmldom.domnode
BEGIN
hasAttribute := false
for get_emp_rec in get_emp_attributes
loop
if(hasAttribute = false) then
parentNode := createParentNode();
hasAttribute := true;
end if;
put_child_node(parentNode, get_emp_rec.name, get_emp_rec.attribute_value);
end loop;
END;
答案 0 :(得分:1)
如果在一次调用中只创建一个子节点,那么第二种方式是有效的,因为光标和循环次数较少。只需确保您的游标查询获取该特定父节点的子节点。