游标循环内的If语句与游标select的开销

时间:2013-07-25 17:33:41

标签: if-statement plsql oracle11g cursor

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

1 个答案:

答案 0 :(得分:1)

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