|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你会发现实际上MySQL可以更少地占用资金,前者的每CPU许可费用一般从4000美元到25000美元不等,而MySQL企业版的支持和维护成本就更低了。oracle|心得1、树的简介
Developer6.0以上版本供应了hierarchytree(条理树)的观点,htree控件十分便利,只必要大批的编程便可完成显现条理布局的目标。
树的特有属性中以下几个较为主要:
l多项选择(Multi-Selection):是不是同意一次选中树的多个节点。假如不同意,那末选中第二个节点时,第一个被选中的节点会作废选择。
l纪录组(RecordGroup):指定天生树的纪录组的名字。
复杂先容一下跟树相干的触发子(Built-in):
lFUNCTIONGET_TREE_NODE_PROPERTY(item_nameVARCHAR2,nodeNODE,propertyNUMBER);
功效:获得树节点的属性
个中property有以下几种:
NODE_STATE:EXPANDED_NODE(扩大节点)
COLLAPSED_NODE(压缩节点)
LEAF_NODE(叶节点)--注:不克不及睁开或压缩
NODE_DEPTH:既节点在树中的层级。
NODE_LABEL:节点的显现文本
NODE_ICON:节点的图标
NODE_VALUE:节点的值。
例子:
DECLARE
htreeITEM;
node_valueVARCHAR2(100);
BEGIN
--失掉树
htree:=Find_Item(tree_block.htree3);
--失掉以后选中节点的值
node_value:=Ftree.Get_Tree_Node_Property(htree,:SYSTEM.TRIGGER_NODE,Ftree.NODE_VALUE);
...
END;
正文:个中:SYSTEM.TRIGGER_NODE指以后选中的树节点。
lFUNCTIONGET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER);
功效:获得树的属性
个中property有以下几种:
DATASOURCE
RECORD_GROUP
QUERY_TEXT
NODE_COUNT:前往树中节点的个数。
SELECTION_COUNT
ALLOW_EMPTY_BRANCHES
ALLOW_MULTI-SELECT
lPROCEDURESET_TREE_NODE_PROPERTY(item_nameVARCHAR2,nodeFTREE.NODE,propertyNUMBER,valueVARCHAR2);
功效:设置树节点的属性
lPROCEDURESET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER,valueVARCHAR2);
PROCEDURESET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER,valueRECORDGROUP);
功效:设置树的属性
lPROCEDUREPOPULATE_TREE(item_nameVARCHAR2);
功效:清空树中已无数据,并依据纪录组或数据查询从头天生树。
lPROCEDUREADD_TREE_DATA(item_nameVARCHAR2,nodeFTREE.NODE,offset_typeNUMBER,offsetNUMBER,data_sourceNUMBER,dataVARCHAR2);
功效:在指定节点下增加树中数据
注:利用对照贫苦。
lFUNCTIONFIND_TREE_NODE(item_nameVARCHAR2,earch_stringVARCHAR2,search_typeNUMBER,search_byNUMBER,search_rootNODE,start_pointNODE);
功效:找到显现文本或值切合search_string的节点。
参数:
search_type:FIND_NEXT
FIND_NEXT_CHILD
Search_by:NODE_LABEL
NODE_VALUE
Search_root:查询的根节点,通常为Ftree.ROOT_NODE
Start_point:查找的入手下手节点,通常为Ftree.ROOT_NODE
lFUNCTIONADD_TREE_NODE(item_nameVARCHAR2,nodeFTREE.NODE,offset_typeNUMBER,offsetNUMBER,stateNUMBER,labelVARCHAR2,iconVARCHAR2,valueVARCHAR2);
功效:增加树节点。
Offset_type:指定节点的分支范例,PARENT_OFFSET和SIBLING_OFFSET
Offset:指定新节点的地位,
PARENT_OFFSET:1..N
LAST_CHILD
SIBLING_OFFSET:NEXT_NODE
PREVIOUS_NODE
State:EXPANDED_NODE(扩大节点)
COLLAPSED_NODE(压缩节点)
LEAF_NODE(叶节点)
lPROCEDUREDELETE_TREE_NODE(item_nameVARCHAR2,nodeNODE);
功效:删除树节点
lFUNCTIONGET_TREE_NODE_PARENT(item_nameVARCHAR2,nodeNODE);
功效:失掉指定节点的父节点。
lFUNCTIONGET_TREE_SELECTION(item_nameVARCHAR2,selectionNUMBER);
功效:失掉处于选中形态的节点。
lPROCEDURESET_TREE_SELECTION(item_nameVARCHAR2,nodeNODE,selection_typeNUMBER);
功效:指订单个节点的选中形态
参数:
selection_type:SELECT_ON
SELECT_OFF
SELECT_TOGGLE
FORM运转态时有关的触发器:
lWhen-Tree-Node-Activated:用户双击节点或在节点选中时按[ENTER]键时触发。
lWhen-Tree-Node-Expanded:节点睁开或压缩时触发
lWhen-Tree-Node-Selected:当节点选中或作废选择时触发
2、天生树的体例
树控件一样平常独自放在一个把持块中(注:不克不及放在数据块中),在画布(CANVAS)上安排树很简单,而且,如无需要,树的属性也不必要设置。
天生树的体例有几种:
l运转前经由过程设置纪录组或数据查询属性来天生
l经由过程ADD_TREE_DATA触发子来完成
l运转态,经由过程ADD_TREE_NODE等触发子来完成
l运转态,经由过程增加或删除纪录组的数据元从来完成
剖析:
1、对树间接操纵
形貌:Find_Tree_Node找到指定节点,Add_Tree_Node来增加其上级节点。
弱点:编程较为庞大,操纵不天真,并且易堕落。
长处:能够对增加节点等历程举行把持,完成一些特别请求。
例子:
--dept_cur为取单元的CURSOR,emp_cur为取雇员的CURSOR
htree:=Find_Item(tree_view.tree_emp);
opendept_cur;
loop
fetchdept_curintoaa;
exitwhendept_cur%notfound;
del_node:=Ftree.Find_Tree_Node(htree,aa.kjmc,Ftree.FIND_NEXT,Ftree.NODE_LABEL,Ftree.ROOT_NODE,Ftree.ROOT_NODE);
--删除单元节点及其子节点
IFNOTFtree.ID_NULL(del_node)then
Ftree.Delete_Tree_Node(htree,del_node);
ENDIF;
endloop;
closedept_cur;
--依据用CURSOR获得的单元天生树的第一层节点
opendept_cur;
loop
fetchdept_curintoaa;
exitwhendept_cur%notfound;
new_node:=Ftree.Add_Tree_Node(htree,Ftree.ROOT_NODE,Ftree.parent_OFFSET,Ftree.LAST_CHILD,Ftree.EXPANDED_NODE,aa.dname,,aa.deptno);
endloop;
closedept_cur;
--依据雇员CURSOR天生树的上层节点
openemp_cur;
loop
fetchemp_curintobb;
exitwhenemp_cur%notfound;
find_node:=Ftree.Find_Tree_Node(htree,bb.kjbh,Ftree.FIND_NEXT,
Ftree.NODE_value,Ftree.ROOT_node,Ftree.ROOT_NODE);
new_node:=Ftree.Add_Tree_Node(htree,find_node,Ftree.parent_OFFSET,Ftree.LAST_CHILD,Ftree.EXPANDED_NODE,bb.ename,,bb.empno);
endloop;
closeemp_cur;
--失掉树的根节点
ss:=Ftree.get_tree_property(htree,FTREE.NODE_COUNT);
--轮回,直到树的一切节点都睁开
forjin1..ssLOOP
exp_node:=Ftree.Find_Tree_Node(htree,);
state:=Ftree.Get_Tree_Node_Property(htree,j,Ftree.NODE_STATE);
IFstate=Ftree.COLLAPSED_NODETHEN
Ftree.Set_Tree_Node_Property(htree,j,Ftree.NODE_STATE,Ftree.EXPANDED_NODE);
ENDIF;
ENDLOOP;
2、静态纪录组
条理树所利用纪录组的数据格局:
+—Car
|
-—Airplane
|—Boeing
|—Boeing
初始形态
层数
显现文本
图标
值
-1(压缩节点)
1
‘Car’
‘car’
0(叶节点)
2
Honda
civic
1(睁开节点)
1
Airplane
plane
0
2
Boeing
747
0
2
Boeing
757
天生纪录组的体例又分为两种。
1、从查询天生纪录组
形貌:使用树的查询语句(connectby…prior…startwith…)天生纪录组,设置树的属性来天生。
长处:编程复杂,便利。
弱点:只合用于能够机关出树状查询语句的情形下。
例子:
v_ignorenumber;
rg_empsrecordgroup;
begin
rg_emps:=find_group(EMPS);
--假如非空,则清空数据
ifnotid_null(rg_emps)then
delete_group(rg_emps);
endif;
--机关纪录组
rg_emps:=create_group_from_query(EMPS,
select1,level,ename,NULL,to_char(empno)||
fromemp||
connectbypriorempno=mgr||
startwithjob=PRESIDENT);
v_ignore:=populate_group(rg_emps);
ftree.set_tree_property(tree_view.tree_emp,ftree.record_group,rg_emps);
end;
2、用行列数据间接机关纪录组
形貌:纪录组通常是行列布局,以轮回体例间接向纪录组中增加单位数据。
长处:可间接把持纪录组的款式。
弱点:对多层布局,编程也较为庞大。
例子:
--单元CURSOR
cursorcursor_deptis
selectdname,deptnofromdeptorderbydname;
--雇员CURSOR
cursorcursor_emp(p_dnonumber)is
selectename,empnofromempwheredeptno=p_dnoorderbyename;
v_inumber;
v_ignorenumber;
rg_empsrecordgroup;
rg_deptsrecordgroup;
v_init_stategroupcolumn;
v_levelgroupcolumn;
v_labelgroupcolumn;
v_icongroupcolumn;
v_valuegroupcolumn;
begin
rg_depts:=find_group(DEPTS);
--若有数据,则清空纪录组
ifnotid_null(rg_depts)then
delete_group(rg_depts);
endif;
rg_depts:=create_group(DEPTS);
--这里自界说你必要的纪录组中列的数据范例和长度
--初始形态(指睁开、压缩仍是叶节点)
v_init_state:=add_group_column(rg_depts,init_state,number_column);
--地点层数
v_level:=add_group_column(rg_depts,level,number_column);
--显现文本
v_label:=add_group_column(rg_depts,label,char_column,40);
--图标
v_icon:=add_group_column(rg_depts,icon,char_column,20);
--值
v_value:=add_group_column(rg_depts,value,char_column,5);
v_i:=1;
fordeptrecincursor_deptloop
add_group_row(rg_depts,v_i);
set_group_number_cell(v_init_state,v_i,1);
set_group_number_cell(v_level,v_i,1);
set_group_char_cell(v_label,v_i,deptrec.dname);
set_group_char_cell(v_icon,v_i,NULL);
set_group_char_cell(v_value,v_i,to_char(deptrec.deptno));
v_i:=v_i+1;
foremprecincursor_emp(deptrec.deptno)loop
add_group_row(rg_depts,v_i);
set_group_number_cell(v_init_state,v_i,1);
set_group_number_cell(v_level,v_i,2);
set_group_char_cell(v_label,v_i,emprec.ename);
set_group_char_cell(v_icon,v_i,NULL);
set_group_char_cell(v_value,v_i,to_char(emprec.empno));
v_i:=v_i+1;
endloop;
endloop;
ftree.set_tree_property(tree_view.tree_org,ftree.record_group,rg_depts);
end;
结论:举行数据库计划时只管把父子布局放在一张表,如许,利用查询天生纪录组再天生树的体例最复杂有用。假如不克不及完成,那末间接机关纪录组也可天生树。如无特别请求,一样平常不接纳对树间接操纵的体例。
附注:作者一样平常将天生树的程序放在FormBuilder的“程序单位”中,在必要的中央挪用来及时革新树。
参考:Developer6.0自带的PL/SQL程序库:navigate.pll
3、遗留成绩
因为developer简化了树的计划,那末一些对树的转移、拷贝等操纵就不太简单完成。这个课题还必要持续研讨。
如IBM公司最近宣布让渠道合作伙伴分销其SaaS应用程序的新计划。微软认为MySQL学习教程是销售其云计算服务的重要组成部分。然而即使有这种趋势,DBaaS仍然不同于内部数据库,解决方案提供商必须认识到这一点;否则,他们不仅仅是丢失几个客户,而是要失去的更多。 |
|