再见西城 发表于 2015-1-16 22:41:30

MYSQL编程:Oracle Form Builder中利用树的心得

你会发现实际上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:用户双击节点或在节点选中时按键时触发。

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仍然不同于内部数据库,解决方案提供商必须认识到这一点;否则,他们不仅仅是丢失几个客户,而是要失去的更多。

变相怪杰 发表于 2015-1-18 09:57:55

也可谈一下你是怎么优化存储过程的?

小女巫 发表于 2015-1-21 18:13:44

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

第二个灵魂 发表于 2015-1-30 21:42:24

我个人认为就是孜孜不懈的学习

灵魂腐蚀 发表于 2015-2-6 16:09:05

varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。

小妖女 发表于 2015-2-17 01:55:24

相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐

飘飘悠悠 发表于 2015-3-5 14:47:09

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

分手快乐 发表于 2015-3-19 19:16:32

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
页: [1]
查看完整版本: MYSQL编程:Oracle Form Builder中利用树的心得