0

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

1 回答 1

1

如果您在一次调用中只创建一个子节点,则第二种方式是有效的,因为游标和循环的数量较少。只需确保您的游标查询获取该特定父节点的子节点即可。

于 2013-07-25T21:51:28.497 回答