假设我有一个接受 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;