﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-　　　　　　　　　　　　　礼物 ^_^ -文章分类-DataBase</title><link>http://www.blogjava.net/libin2722/category/25650.html</link><description>虚其心，可解天下之问；专其心，可治天下之学；静其心，可悟天下之理；恒其心，可成天下之业。</description><language>zh-cn</language><lastBuildDate>Wed, 10 Mar 2010 12:32:42 GMT</lastBuildDate><pubDate>Wed, 10 Mar 2010 12:32:42 GMT</pubDate><ttl>60</ttl><item><title>从PowerDesigner概念设计模型（CDM）中的3种实体关系说起</title><link>http://www.blogjava.net/libin2722/articles/314679.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Sat, 06 Mar 2010 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/314679.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/314679.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/314679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/314679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/314679.html</trackback:ping><description><![CDATA[CDM是大多数开发者使用PD时最先创建的模型，也是整个数据库设计最高层的抽象。CDM是建立在传统的ER图模型理论之上的，ER图中有三大主要元素：实体型，属性和联系。其中实体型对应到CDM中的Entity，属性对应到CDM中每个Entity的Attribute，在概念上基本上是一一对应的。但在联系上，CDM有了比较大的扩展，除了保留ER图原有的RelationShip概念之外，还增加了Association，Inheritance两种实体关系，下面就让我们分别看看这些关系的用法和之间的区别（下图中被标红的工具栏按钮就是用来向实体中添加这些关系的）。<br /><img height="34" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingyukun/pd_rl.gif" width="499" border="0" /><br />  另外，在介绍所有这些CDM中的元素之前，笔者先给出一个很简单的CDM图，是对我们最最熟悉的学校场景的一个建模，下文中提到的所有概念在图中都有体现，大家在看下文的时候可以对照着来看：<br /><img height="492" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingyukun/cdm.gif" width="635" border="0" /><br /><br />一. RelationShip(联系)<br />  先给出PD手册里对联系的定义：“A relationship is a link between entities. For example, in a CDM that manages human resources, the relationship Member links the entities Employee and Team, because employees can be members of teams. This relationship expresses that each employee works in a team and that each team has employees.” 可见，也许联系的概念真的太简单了吧，所以反而不那么好表述，所以PD的文档里也是用一个例子来说明出现了什么样的情况我们就认为两个实体间是有联系的。<br />  当我们提起实体间联系的时候，最先想到的恐怕是one to one，one to many 和many to many这三种联系类型，这些联系类型也是大家最熟悉的。笔者对ER图原本的概念并不精通，但在CDM中，联系还有另外三个可以设置的属性：mandatory（强制性联系）, dependent（依赖性联系/标定关联） 和dominant（统制联系）。这些属性对后面PDM的生成都有比较大的影响，需要我们一一有所了解。它们都是在联系的属性控制面板中设定的，见下图：<br /><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingyukun/rel-pro.gif" border="0" /><br />1.mandatory<br />  联系是否具有强制性，指的是实体间是不是一定会出现这种联系；或者换句话说，当我们在谈及一个联系的应用场景的时候，联系对应的那两个实体型的实体实例的个数可不可能为零。也许这样的解释还是有点抽象，让我们举两个联系的例子，一个是对两边的实体都有强制性的，另一个则不然。<br /><span style="COLOR: #0000ff">（1）教师--学生 联系<br />  这个联系首先是一个多对多联系，因为每个老师可以教多个学生，每个学生也都有多个老师来负责他们的学业。同时，这个联系对教师和学生都是强制性的，也就是说，不存在任何一个老师，他不负责任何一个学生的教学；也不存在任何一个学生，他没有任何一个任课老师。<br />（2）学生--俱乐部 联系<br />  这个联系也是一个多对多关系，但它对学生这个实体型而言就不是强制的（Optional,可选的）。每个俱乐部都有至少一个学生参加，但并不是每个学生都要去参加俱乐部的活动。完全可以有一些学生，他们什么俱乐部都没参加。</span><br />上面的例子主要是从概念的角度来区分了mandatory和optional的区别。实际上如果把这个模型对应到我们最后生成的表，如果A-B间的联系对A是mandatory的话，那么如果在A里面如果包含B的外键，这个外键不能为空值，反之可以为空值。后面我们谈到PDM和实际数据库的时候，大家会看到这一点。<br />2.dependent<br />  每一个Entity型都有自己的Identifier，如果两个Entity型之间发生关联时，其中一个Entity型的Identifier进入另一个Entity型并与该 Entity型中的Identifier共同组成其Identifier时，这种关联称为标定关联,也叫依赖性关联(dependent relationship)。一个Entity型的Identifier进入另一个Entity型后充当其非Identifier时，这种关联称为非标定关联,也叫非依赖关联。<br />  概念的定义说起来还是有些拗口，说白了其实就是主-从表关系，从表要依赖于主表<span style="COLOR: #0000ff">。比如在我们系统里要记录教师休假的情况，有一个实体型Holiday，其属性包括休假的开始时间和天数，每次有教师休假的时候，都要在这个表留下记录。从我们的场景描述中可以看到，实体型假期必须依附于实体型教师，即对于每一个假期实例，必须指向某一个教师实例。</span><br />  对于依赖型联系，必须注意它不可能是一个多对多联系，在这个联系中，必须有一个作为主体的实体型。一个dependent联系的从实体可以没有自己的identifier.<br />3.dominant<br />  这个联系属性是最为简单的，它仅作用于一对一联系，并指明这种联系中的主从表关系。在A,B两个实体型的联系中，如果A--&gt;B被指定为dominant，那么A为这个一对一联系的主表，B为从表，并且在以后生成的PDM中会产生一个引用（如果不指定dominant属性的话会产生两个引用）。<span style="COLOR: #0000ff">比如老师和班级之间的联系，因为每个班级都有一个老师做班主任，每个老师也最多只能做一个班级的班主任，所以是一个一对一关系。同时，我们可以将老师作为主表，用老师的工号来唯一确定一个班主任联系。</span><br /><br />二.Association（关联）<br />  先来看一下PD给association的定义：“An association is a connection between entities. In the Merise modeling methodology an association is used to connect several entities that each represents clearly defined objects, but are linked by an event, which may not be so clearly represented by another entity.”。<br />  在上一小段提到的那些RelationShip，在很多情况下（特别是多对多关系中），我们会把联系专门提出来，作为一个实体型放在两个需要被关联的实体型中间（在PD中，选中任何一个联系，在右键的弹出菜单中选择“Change to Entity”命令即可完成联系转实体的操作）。但有的时候，把若干个实体型之间的联系抽象为一个实体型可能不太合适，这个时候你可以选择为这些实体型建立一个association，那么在生成PDM的时候，所有这些相关实体型的identifier都会被加入到association对应生成的表模型中。所以，说白了，其实association就是实体型的一种特例，用来在建模的时候更确切的表达实体间的关联信息。在PD的文档中举了一个录音带、顾客、商店三个实体型在租借录音带这个场景上发生关联，然后把租借定义为上述三个实体型之间的association的例子，非常确切。在我们的学校模型里，我定义了家访做为老师和学生实体型中间的一个association，在接下来产生的PDM中大家就可能看到这种定义所产生的效果。<br /><br />三.Inheritance（继承）<br />  这种关系在概念层面是最容易理解的了，本文就不赘述了。<br /><br />前面已经介绍了CDM中关于实体间关系的主要内容，接下来我们就来看看根据这个CDM所生成的PDM是一个什么样子：<br /><img height="479" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingyukun/pdm.gif" width="660" border="0" /><br />上图中所有标红的部分是我们最应该关注的内容，因为他们都是由于我们对实体型间的关系的定义而产生的，下面给出一些简单的说明。<br />1. “师生关系”和“学生俱乐部”这两个表是由于我们的多对多关系而产生的。<br />2. “假期”表的“工号”字段是由于我们将教师-假期关系指定为dependent而产生的。<br />3. “班级”表的“工号”字段是由于我们将教师-班级关系制定为dominant而产生的。<br />4. “家访”表中的“工号”和“学号”字段是由于家访是教师和学生实体型的association而产生的。<br />另外，记得我们在提到dominant属性的时候说过，一个没指定dominant方向的一对一联系将产生两个引用，下面我们就把原本的CDM中的教师-班级关系进行一个小小的修改，去掉这个relationship的dominant定义，那么最终产生的PDM中教师表和班级表将互相包含对方的主键(由于我们的班级表没有自己的主键，所以只能在班级表中看到多出来的列)，截图如下：<br /><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingyukun/pdm-part.gif" /><br />对照这个PDM截图和上一个PDM截图之间的区别，大家可以很容易得看出dominant属性对一个一对一关系的作用。<br /><br />  好了，说到这里，本文就暂时告一段落了。文中提到的，都是经常使用PD的同志和笔者一样每天都会碰到的一些概念。只有我们把这些概念弄得很清楚，对PD的使用才能事半功倍。笔者也在网上找过关于PD的资料，发现有价值的资源很少。如果哪位老兄有比较好的资源或者书，还请推荐一二。<br />应一位朋友的要求，将本文中用到的CDM文件放在这里：<a href="http://www.cnblogs.com/Files/xingyukun/school.rar">school.rar</a><br /><img src ="http://www.blogjava.net/libin2722/aggbug/314679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2010-03-06 12:45 <a href="http://www.blogjava.net/libin2722/articles/314679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小知识</title><link>http://www.blogjava.net/libin2722/articles/160952.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Fri, 16 Nov 2007 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/160952.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/160952.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/160952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/160952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/160952.html</trackback:ping><description><![CDATA[<p>1.sqlserver中的系统表<br />
&nbsp;&nbsp;&nbsp;&nbsp; sysobjects<br />
&nbsp;&nbsp;&nbsp; 这个表可以查出来所以有的数据库里面的表的名称<br />
&nbsp;&nbsp;&nbsp; 如<br />
&nbsp;&nbsp;&nbsp; select name from sysobjects where xtype=?<br />
&nbsp;&nbsp;&nbsp;&nbsp; 这里的?表示不同的数据库的类型<br />
&nbsp;&nbsp; 其类型有：<br />
&nbsp;&nbsp; &nbsp;C：检查约束。 <br />
&nbsp;D：默认的约束 <br />
&nbsp;F：外键约束 <br />
&nbsp;L：日志 <br />
&nbsp;P：存储过程 <br />
&nbsp;PK：主键约束 <br />
&nbsp;RF：复制过滤存储过程 <br />
&nbsp;S：系统表格 <br />
&nbsp;TR：触发器 <br />
&nbsp;U：用于表格。 <br />
&nbsp;UQ：独特的约束。 <br />
&nbsp;V：视图 <br />
&nbsp;X：被扩展的存储过程 </p>
<p>2.mysql中的对所有的这个database里面的表查询的sql:<br />
&nbsp;&nbsp; show tables from your_database<br />
江淮汽车<br />
600418<br />
10 送 2 <br />
7.5日</p>
<p>标准股份<br />
<br />
<br />
String.prototype.trim = function() { <br />
&nbsp;return this.replace(/(^\s*)|(\s*$)/g, "");<br />
}<br />
[di:n]<br />
n.<br />
&nbsp;迪安（男子名）<br />
</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/160952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-16 11:25 <a href="http://www.blogjava.net/libin2722/articles/160952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于oracle的一些知识</title><link>http://www.blogjava.net/libin2722/articles/160951.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Fri, 16 Nov 2007 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/160951.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/160951.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/160951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/160951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/160951.html</trackback:ping><description><![CDATA[<p>1、用户：&nbsp; <br />
　　　select username from dba_users;&nbsp; <br />
　　改口令&nbsp; <br />
　　　alter user spgroup identified by spgtest;&nbsp; <br />
　　2、表空间：&nbsp; <br />
　　　select * from dba_data_files;&nbsp; <br />
　　　select * from dba_tablespaces;//表空间&nbsp; </p>
<p>　　　select tablespace_name,sum(bytes), sum(blocks)&nbsp; <br />
　　　　from dba_free_space group by tablespace_name;//空闲表空间&nbsp; </p>
<p>　　　select * from dba_data_files&nbsp; <br />
　　　　where tablespace_name='RBS';//表空间对应的数据文件&nbsp; </p>
<p>　　　select * from dba_segments&nbsp; <br />
　　　　where tablespace_name='INDEXS';&nbsp; <br />
　　3、数据库对象：&nbsp; <br />
　　　select * from dba_objects;&nbsp; //得到所有的空间的里面的所有表，包括系统本身的表<br />
　　　CLUSTER、DATABASE LINK、FUNCTION、INDEX、LIBRARY、PACKAGE、PACKAGE BODY、&nbsp; <br />
　　　PROCEDURE、SEQUENCE、SYNONYM、TABLE、TRIGGER、TYPE、UNDEFINED、VIEW。&nbsp; <br />
　　4、表：&nbsp; <br />
　　　select * from dba_tables;&nbsp; //得到所有空间的里面的MYOBJECT<br />
　　　analyze my_table compute statistics;-&gt;dba_tables后6列&nbsp; <br />
　　　select extent_id,bytes from dba_extents&nbsp; <br />
　　　where segment_name='CUSTOMERS' and segment_type='TABLE'&nbsp; <br />
　　　order by extent_id;//表使用的extent的信息。segment_type='ROLLBACK'查看回滚段的空间分配信息&nbsp; <br />
　　　列信息：&nbsp; <br />
　　　　select distinct table_name&nbsp; <br />
　　　　from user_tab_columns&nbsp; <br />
　　　　where column_name='SO_TYPE_ID';&nbsp; <br />
　　5、索引：　&nbsp; <br />
　　　select * from dba_indexes;//索引，包括主键索引&nbsp; <br />
　　　select * from dba_ind_columns;//索引列&nbsp; <br />
　　　select i.index_name,i.uniqueness,c.column_name&nbsp; <br />
　　　　from user_indexes i,user_ind_columns c&nbsp; <br />
　　　　　where i.index_name=c.index_name&nbsp; <br />
　　　　　and i.table_name ='ACC_NBR';//联接使用&nbsp; <br />
　　6、序列：&nbsp; <br />
　　　select * from dba_sequences;&nbsp; <br />
　　7、视图：&nbsp; <br />
　　　select * from dba_views;&nbsp; <br />
　　　select * from all_views;&nbsp; <br />
　　text 可用于查询视图生成的脚本&nbsp; <br />
　　8、聚簇：&nbsp; <br />
　　　select * from dba_clusters;&nbsp; <br />
　　9、快照：&nbsp; <br />
　　　select * from dba_snapshots;&nbsp; <br />
　　快照、分区应存在相应的表空间。&nbsp; <br />
　　10、同义词：&nbsp; <br />
　　　select * from dba_synonyms&nbsp; <br />
　　　　where table_owner='SPGROUP';&nbsp; <br />
　　　　//if owner is PUBLIC,then the synonyms is a public synonym.&nbsp; <br />
　　　　　if owner is one of users,then the synonyms is a private synonym.&nbsp; <br />
　　11、数据库链：&nbsp; <br />
　　　select * from dba_db_links;&nbsp; <br />
　　在spbase下建数据库链&nbsp; <br />
　　　create database link dbl_spnew&nbsp; <br />
　　　connect to spnew identified by spnew using 'jhhx';&nbsp; <br />
　　　insert into acc_nbr@dbl_spnew&nbsp; <br />
　　　select * from acc_nbr where nxx_nbr='237' and line_nbr='8888';&nbsp; <br />
　　12、触发器：&nbsp; <br />
　　　select * from dba_trigers;&nbsp; <br />
　　存储过程，函数从dba_objects查找。&nbsp; <br />
　　其文本：select text from user_source where name='BOOK_SP_EXAMPLE';&nbsp; <br />
　　建立出错：select * from user_errors;&nbsp; <br />
　　oracle总是将存储过程，函数等软件放在SYSTEM表空间。&nbsp; <br />
　　13、约束：&nbsp; <br />
　　（1）约束是和表关联的，可在create table或alter table table_name add/drop/modify来建立、修改、删除约束。&nbsp; <br />
　　可以临时禁止约束，如：&nbsp; <br />
　　　alter table book_example&nbsp; <br />
　　　disable constraint book_example_1;&nbsp; <br />
　　　alter table book_example&nbsp; <br />
　　　enable constraint book_example_1;&nbsp; <br />
　　（2）主键和外键被称为表约束，而not null和unique之类的约束被称为列约束。通常将主键和外键作为单独的命名约束放在字段列表下面，而列约束可放在列定义的同一行，这样更具有可读性。&nbsp; <br />
　　（3）列约束可从表定义看出，即describe;表约束即主键和外键，可从dba_constraints和dba_cons_columns 查。&nbsp; <br />
　　　select * from user_constraints&nbsp; <br />
　　　where table_name='BOOK_EXAMPLE';&nbsp; <br />
　　　select owner,CONSTRAINT_NAME,TABLE_NAME&nbsp; <br />
　　　　from user_constraints&nbsp; <br />
　　　　where constraint_type='R'&nbsp; <br />
　　　　order by table_name;&nbsp; <br />
　　（4）定义约束可以无名（系统自动生成约束名）和自己定义约束名（特别是主键、外键）&nbsp; <br />
　　如：create table book_example&nbsp; <br />
　　　　(identifier number not null);&nbsp; <br />
　　　　create table book_example&nbsp; <br />
　　　　(identifier number constranit book_example_1 not null);&nbsp; <br />
　　14、回滚段：&nbsp; <br />
　　在所有的修改结果存入磁盘前，回滚段中保持恢复该事务所需的全部信息，必须以数据库发生的事务来相应确定其大小（DML语句才可回滚，create,drop,truncate等DDL不能回滚）。&nbsp; <br />
　　回滚段数量=并发事务/4，但不能超过50；使每个回滚段大小足够处理一个完整的事务；&nbsp; <br />
　　　create rollback segment r05&nbsp; <br />
　　　tablespace rbs;&nbsp; <br />
　　　create rollback segment rbs_cvt&nbsp; <br />
　　　tablespace rbs&nbsp; <br />
　　　storage(initial 1M next 500k);&nbsp; <br />
　　使回滚段在线&nbsp; <br />
　　　alter rollback segment r04 online;&nbsp; <br />
　　用dba_extents,v$rollback_segs监测回滚段的大小和动态增长。&nbsp; <br />
　　回滚段的区间信息&nbsp; <br />
　　　select * from dba_extents&nbsp; <br />
　　　where segment_type='ROLLBACK' and segment_name='RB1';&nbsp; <br />
　　回滚段的段信息,其中bytes显示目前回滚段的字节数&nbsp; <br />
　　　select * from dba_segments&nbsp; <br />
　　　　where segment_type='ROLLBACK' and segment_name='RB1';&nbsp; <br />
　　为事物指定回归段&nbsp; <br />
　　　set transaction use rollback segment rbs_cvt&nbsp; <br />
　　针对bytes可以使用回滚段回缩。&nbsp; <br />
　　　alter rollback segment rbs_cvt shrink;&nbsp; <br />
　　　select bytes,extents,max_extents from dba_segments&nbsp; <br />
　　　　where segment_type='ROLLBACK' and segment_name='RBS_CVT';&nbsp; <br />
　　回滚段的当前状态信息：&nbsp; <br />
　　　select * from dba_rollback_segs&nbsp; <br />
　　　　where segment_name='RB1';&nbsp; <br />
　　比多回滚段状态status，回滚段所属实例instance_num&nbsp; <br />
　　查优化值optimal&nbsp; <br />
　　　select n.name,s.optsize&nbsp; <br />
　　　　from v$rollname n,v$rollstat s&nbsp; <br />
　　　　　where n.usn=s.usn;&nbsp; <br />
　　回滚段中的数据&nbsp; <br />
　　　set transaction use rollback segment rb1;/*回滚段名*/&nbsp; <br />
　　　select n.name,s.writes&nbsp; <br />
　　　　from v$rollname n,v$rollstat s&nbsp; <br />
　　　　　where n.usn=s.usn;&nbsp; <br />
　　当事务处理完毕，再次查询$rollstat，比较writes(回滚段条目字节数)差值，可确定事务的大小。&nbsp; <br />
　　查询回滚段中的事务&nbsp; <br />
　　　column rr heading 'RB Segment' format a18&nbsp; <br />
　　　column us heading 'Username' format a15&nbsp; <br />
　　　column os heading 'Os User' format a10&nbsp; <br />
　　　column te heading 'Terminal' format a10&nbsp; <br />
　　　select r.name rr,nvl(s.username,'no transaction') us,s.osuser os,s.terminal te&nbsp; <br />
　　　　from v$lock l,v$session s,v$rollname r&nbsp; <br />
　　　　　where l.sid=s.sid(+)&nbsp; <br />
　　　　　and trunc(l.id1/65536)=R.USN&nbsp; <br />
　　　　　and l.type='TX'&nbsp; <br />
　　　　　and l.lmode=6&nbsp; <br />
　　　order by r.name;&nbsp; <br />
　　15、作业&nbsp; <br />
　　查询作业信息&nbsp; <br />
　　　select job,broken,next_date,interval,what from user_jobs;&nbsp; <br />
　　　select job,broken,next_date,interval,what from dba_jobs;&nbsp; <br />
　　查询正在运行的作业&nbsp; <br />
　　　select * from dba_jobs_running;&nbsp; <br />
　　使用包exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (10/(24*60*60))')加入作业。间隔10秒钟&nbsp; <br />
exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (11/(24*60))')加入作业。间隔11分钟使用包exec dbms_job.remove<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</p>
<p>/**oracle的表创建*/<br />
create table USERINFO(<br />
&nbsp; USERID NUMBER(8) NOT NULL,<br />
&nbsp; USERNAME VARCHAR2(20),<br />
&nbsp; PASSWR VARCHAR2(20),<br />
&nbsp; EMAIL VARCHAR2(20),<br />
&nbsp; STATE NUMBER(1) DEFAULT 0,<br />
&nbsp; EMPID NUMBER(8),<br />
&nbsp; CONSTRAINT PK_USER PRIMARY KEY(USERID)<br />
)<br />
&nbsp;/***增加关联条件****/<br />
&nbsp;ALTER TABLE USERINFO <br />
&nbsp;ADD CONSTRAINT FK_USER FOREIGN KEY(EMPID) REFERENCES EMP (EMPID)<br />
select * from user_tables;--得到用户下的表名及表空间&gt;<br />
select&nbsp; * from user_tab_cols;--得到用户下所有表，表字段，类型及长度----&gt;<br />
select * from user_tab_columns; --得到用户下所有表，表字段，类型及长度----&gt;<br />
select * from user_col_comments;--得到用户下表字段的注释&gt;<br />
select * from user_tab_comments;--得到表类型，注释&gt;<br />
select * from user_cons_columns;---得到用户表下的约束关系,表名,字段名&gt;<br />
select * from user_constraints;--得到用户表下的约束关系,表名,约束类型&gt;<br />
comment on table USERINFO is '用户信息';--注释表名&gt;<br />
comment on column USERINFO.USERID is '用户编号';--字段注释&gt;<br />
/*---列出某个用户下所有表的信息--*/<br />
select * from user_tab_comments A,user_tables B where A.table_name=B.table_name and A.table_type='TABLE';<br />
/*----列出某个表的主键信息------*/<br />
select A.table_name,A.constraint_name,A.column_name from user_cons_columns A,user_constraints B <br />
where A.constraint_name=B.constraint_name and B.constraint_type='P' and B.table_name='EMPLOVE';<br />
/*----列出某个表的外键信息------*/<br />
select A.table_name,A.constraint_name,B.column_name from user_constraints A,user_cons_columns B<br />
where A.constraint_name=B.constraint_name and B.table_name='EMPLOVE' and A.constraint_type='R';<br />
/*----需要得到字段的信息和备注----*/&nbsp; <br />
select distinct A.column_name,A.data_type||'('||A.data_length||')',B.comments from user_tab_cols A,user_col_comments B <br />
where&nbsp; A.table_name=B.table_name and A.column_name=B.column_name and A.table_name='EMP';<br />
/*----日期格式的增加---*/<br />
insert into employee values(to_date('2006-06-10','yyyy-mm-dd'));<br />
/*----日期间的相减---*/<br />
select to_number(to_char(curdate,'dd'))-to_number(to_char(olddate,'dd')) from datetable;<br />
/*----oracle分页----*/<br />
select * from (select t.*,rownum r_id from tablename t) where r_id between 1 and 10;<br />
select * from (select t.*,rownum r_id from tablename t) where r_id &gt;=1 and r_id&lt;=10;--不可排序〉<br />
select t.*,rowid from tablename t where rownum&lt;=20 minus select t.*,rowid from tablename t where rownum&lt;=10<br />
select cc.* from (select bb.*,rownum r_id from (select * from tablename) bb where rownum&lt;=20 ) cc where cc.r_id&gt;=10<br />
select * from (select * from deptinfo where rownum &lt;=20 minus select * from deptinfo where rownum&lt;=10) order by deptid;---可排序〉<br />
/*-----备注表的查询----*/<br />
select decode(emptype,0,(select xlname from xueli B where B.xlid=A.posttype),1,(select zcname from zhicheng C where C.Zcid=A.posttype)) from emp A;</p>
<p>/*********************----oracle高级应用-----**********************/<br />
/*--创建游标在某包--*/<br />
create or replace package packagename<br />
&nbsp; as<br />
&nbsp;&nbsp;&nbsp; type ref_cursor is ref cursor;<br />
end;<br />
/*---存储过程的分页---*/<br />
---**********1&gt;<br />
create or replace procedure getOnePage(curpage in number,page_record in number,rc in out packagename.ref_cursor)<br />
&nbsp;as<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for select * from (select t.*,rownum id from deptinfo t order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between (curpage-1)*page_record and curpage*page_record;<br />
&nbsp;&nbsp; end;<br />
---**********2&gt;<br />
create or replace procedure getOnePage2(curpage in number,page_record in number,cond in varchar2,rc in out packagename.ref_cursor)<br />
&nbsp;as<br />
&nbsp;&nbsp; str_sql varchar2(500);<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_sql:='select * from (select t.*,rownum id from deptinfo t where 1=1 '||cond||' order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between '||(curpage-1)*page_record || ' and '|| curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for str_sql;<br />
&nbsp;&nbsp; end;<br />
/*---新增的存储过程---*/<br />
create or replace procedure newDept<br />
(deptid deptinfo.deptid%type,<br />
&nbsp;deptname deptinfo.deptname%type,<br />
&nbsp;deptnum deptinfo.deptnum%type,<br />
&nbsp;deptdesc deptinfo.deptdesc%type)<br />
as<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into deptinfo(deptid,deptname,deptnum,deptdesc)values(deptid,deptname,deptnum,deptdesc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commit;<br />
&nbsp;&nbsp;&nbsp; end;<br />
/*---修改的存储过程---*/<br />
&nbsp; create or replace procedure updateDept(did in number,num in number)<br />
&nbsp;&nbsp;&nbsp; as<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update deptinfo set deptnum=num where deptid=did;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br />
/******************************-----oracle函数---*********************************/<br />
/*-----得到总纪录---*/<br />
create or replace function getTableCount(v_sql in char) return number<br />
&nbsp;as <br />
&nbsp;&nbsp; counts number;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; execute immediate 'select count(1) from ('||v_sql||')' into counts;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return counts;<br />
&nbsp;&nbsp; exception<br />
&nbsp;&nbsp; when others then<br />
&nbsp;&nbsp; raise;<br />
&nbsp;&nbsp; end;<br />
/*****---------------oracle函数分页---------------------*******/<br />
&lt;------通用-------&gt;<br />
create or replace function getTableResult(result_sql in varchar2,curpage in number default null,page_record in number default null,sortfield in varchar2 default null,sorttype in number default null,countrecord out number)<br />
&nbsp;return itfuture.ref_cursor<br />
&nbsp; as<br />
&nbsp;&nbsp; vsql varchar2(1000);<br />
&nbsp;&nbsp; startpos number;<br />
&nbsp;&nbsp; endpos number;<br />
&nbsp;&nbsp; resultcursor itfuture.ref_cursor;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp; countrecord:=getTableCount(result_sql);------------------调用总计录方法&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; vsql:=result_sql;<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(sortfield is not null) then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:=vsql||' order by '||sortfield;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sorttype='1')then <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:=vsql||' asc ';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:=vsql||' desc ';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp;&nbsp; end if;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; if((curpage is not null)and(page_record is not null)) then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startpos:=((curpage-1)*page_record+1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endpos:=curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:='select cc.* from (select bb.*,rownum r_id from('||vsql||') bb where rownum&lt;'||endpos||' ) cc where cc.r_id&gt;'||startpos;<br />
&nbsp;&nbsp;&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp;&nbsp; open resultcursor for vsql;<br />
&nbsp;&nbsp;&nbsp;&nbsp; return resultcursor;<br />
&nbsp;&nbsp;&nbsp;&nbsp; exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; when others then<br />
&nbsp;&nbsp;&nbsp;&nbsp; raise;<br />
&nbsp;&nbsp; end; <br />
&lt;----------2---------&gt;<br />
create or replace function f_getOnePage(curpage number,page_record number,cond varchar2) return itfuture.ref_cursor<br />
&nbsp;as<br />
&nbsp;&nbsp; rc itfuture.ref_cursor;<br />
&nbsp;&nbsp; str_sql varchar2(2000);<br />
&nbsp;&nbsp; a NUMBER;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a:=6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_sql:='select * from (select t.*,rownum id from deptinfo t where 1=1 '||cond||' order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between '||(curpage-1)*page_record || ' and '|| curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for str_sql;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rc;<br />
&nbsp;&nbsp; end;<br />
/*-----------------在包下创建函数--------------------*/<br />
&lt;----包下函数定义----&gt;<br />
create or replace package itfuture<br />
&nbsp;as<br />
&nbsp; type ref_cursor is ref cursor;<br />
&nbsp; function f_getOnePage(curpage number,page_record number,cond varchar2) return itfuture.ref_cursor;<br />
&nbsp;end;<br />
&lt;----包下函数实现----&gt;<br />
create or replace package body itfuture<br />
&nbsp;is<br />
&nbsp;function f_getOnePage(curpage number,page_record number,cond varchar2) return itfuture.ref_cursor<br />
&nbsp;as<br />
&nbsp;&nbsp; rc itfuture.ref_cursor;<br />
&nbsp;&nbsp; str_sql varchar2(2000);<br />
&nbsp;&nbsp; a NUMBER;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a:=6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_sql:='select * from (select t.*,rownum id from deptinfo t where 1=1 '||cond||' order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between '||(curpage-1)*page_record || ' and '|| curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for str_sql;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rc;<br />
&nbsp;&nbsp; end;<br />
&nbsp; end;</p>
<p><br />
/***************************************java中存储过程的调用***************************/</p>
<p>String query="{call getOnePage(?,?,?)}";<br />
CallableStatement cs=open.conn.prepareCall(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(1,1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(2,10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.execute();<br />
ResultSet rs=(ResultSet)cs.getObject(3);</p>
<p>/***************************************java中函数的调用***************************/<br />
String query="begin :1 :=itfuture.f_getOnePage(:2,:3,:4);end;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement cs=open.conn.prepareCall(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(2,1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(3,5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setString(4,null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.execute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs=(ResultSet)cs.getObject(1);<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</p>
<p>/**oracle的表创建*/<br />
create table USERINFO(<br />
&nbsp; USERID NUMBER(8) NOT NULL,<br />
&nbsp; USERNAME VARCHAR2(20),<br />
&nbsp; PASSWR VARCHAR2(20),<br />
&nbsp; EMAIL VARCHAR2(20),<br />
&nbsp; STATE NUMBER(1) DEFAULT 0,<br />
&nbsp; EMPID NUMBER(8),<br />
&nbsp; CONSTRAINT PK_USER PRIMARY KEY(USERID)<br />
)<br />
&nbsp;/***增加关联条件****/<br />
&nbsp;ALTER TABLE USERINFO <br />
&nbsp;ADD CONSTRAINT FK_USER FOREIGN KEY(EMPID) REFERENCES EMP (EMPID)<br />
select * from user_tables;--得到用户下的表名及表空间&gt;<br />
select&nbsp; * from user_tab_cols;--得到用户下所有表，表字段，类型及长度----&gt;<br />
select * from user_tab_columns; --得到用户下所有表，表字段，类型及长度----&gt;<br />
select * from user_col_comments;--得到用户下表字段的注释&gt;<br />
select * from user_tab_comments;--得到表类型，注释&gt;<br />
select * from user_cons_columns;---得到用户表下的约束关系,表名,字段名&gt;<br />
select * from user_constraints;--得到用户表下的约束关系,表名,约束类型&gt;<br />
comment on table USERINFO is '用户信息';--注释表名&gt;<br />
comment on column USERINFO.USERID is '用户编号';--字段注释&gt;<br />
/*---列出某个用户下所有表的信息--*/<br />
select * from user_tab_comments A,user_tables B where A.table_name=B.table_name and A.table_type='TABLE';<br />
/*----列出某个表的主键信息------*/<br />
select A.table_name,A.constraint_name,A.column_name from user_cons_columns A,user_constraints B <br />
where A.constraint_name=B.constraint_name and B.constraint_type='P' and B.table_name='EMPLOVE';<br />
/*----列出某个表的外键信息------*/<br />
select A.table_name,A.constraint_name,B.column_name from user_constraints A,user_cons_columns B<br />
where A.constraint_name=B.constraint_name and B.table_name='EMPLOVE' and A.constraint_type='R';<br />
/*----需要得到字段的信息和备注----*/&nbsp; <br />
select distinct A.column_name,A.data_type||'('||A.data_length||')',B.comments from user_tab_cols A,user_col_comments B <br />
where&nbsp; A.table_name=B.table_name and A.column_name=B.column_name and A.table_name='EMP';<br />
/*----日期格式的增加---*/<br />
insert into employee values(to_date('2006-06-10','yyyy-mm-dd'));<br />
/*----日期间的相减---*/<br />
select to_number(to_char(curdate,'dd'))-to_number(to_char(olddate,'dd')) from datetable;<br />
/*----oracle分页----*/<br />
select * from (select t.*,rownum r_id from tablename t) where r_id between 1 and 10;<br />
select * from (select t.*,rownum r_id from tablename t) where r_id &gt;=1 and r_id&lt;=10;--不可排序〉<br />
select t.*,rowid from tablename t where rownum&lt;=20 minus select t.*,rowid from tablename t where rownum&lt;=10<br />
select cc.* from (select bb.*,rownum r_id from (select * from tablename) bb where rownum&lt;=20 ) cc where cc.r_id&gt;=10<br />
select * from (select * from deptinfo where rownum &lt;=20 minus select * from deptinfo where rownum&lt;=10) order by deptid;---可排序〉<br />
/*-----备注表的查询----*/<br />
select decode(emptype,0,(select xlname from xueli B where B.xlid=A.posttype),1,(select zcname from zhicheng C where C.Zcid=A.posttype)) from emp A;</p>
<p>/*********************----oracle高级应用-----**********************/<br />
/*--创建游标在某包--*/<br />
create or replace package packagename<br />
&nbsp; as<br />
&nbsp;&nbsp;&nbsp; type ref_cursor is ref cursor;<br />
end;<br />
/*---存储过程的分页---*/<br />
---**********1&gt;<br />
create or replace procedure getOnePage(curpage in number,page_record in number,rc in out packagename.ref_cursor)<br />
&nbsp;as<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for select * from (select t.*,rownum id from deptinfo t order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between (curpage-1)*page_record and curpage*page_record;<br />
&nbsp;&nbsp; end;<br />
---**********2&gt;<br />
create or replace procedure getOnePage2(curpage in number,page_record in number,cond in varchar2,rc in out packagename.ref_cursor)<br />
&nbsp;as<br />
&nbsp;&nbsp; str_sql varchar2(500);<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_sql:='select * from (select t.*,rownum id from deptinfo t where 1=1 '||cond||' order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between '||(curpage-1)*page_record || ' and '|| curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for str_sql;<br />
&nbsp;&nbsp; end;<br />
/*---新增的存储过程---*/<br />
create or replace procedure newDept<br />
(deptid deptinfo.deptid%type,<br />
&nbsp;deptname deptinfo.deptname%type,<br />
&nbsp;deptnum deptinfo.deptnum%type,<br />
&nbsp;deptdesc deptinfo.deptdesc%type)<br />
as<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into deptinfo(deptid,deptname,deptnum,deptdesc)values(deptid,deptname,deptnum,deptdesc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commit;<br />
&nbsp;&nbsp;&nbsp; end;<br />
/*---修改的存储过程---*/<br />
&nbsp; create or replace procedure updateDept(did in number,num in number)<br />
&nbsp;&nbsp;&nbsp; as<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update deptinfo set deptnum=num where deptid=did;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br />
/******************************-----oracle函数---*********************************/<br />
/*-----得到总纪录---*/<br />
create or replace function getTableCount(v_sql in char) return number<br />
&nbsp;as <br />
&nbsp;&nbsp; counts number;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; execute immediate 'select count(1) from ('||v_sql||')' into counts;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return counts;<br />
&nbsp;&nbsp; exception<br />
&nbsp;&nbsp; when others then<br />
&nbsp;&nbsp; raise;<br />
&nbsp;&nbsp; end;<br />
/*****---------------oracle函数分页---------------------*******/<br />
&lt;------通用-------&gt;<br />
create or replace function getTableResult(result_sql in varchar2,curpage in number default null,page_record in number default null,sortfield in varchar2 default null,sorttype in number default null,countrecord out number)<br />
&nbsp;return itfuture.ref_cursor<br />
&nbsp; as<br />
&nbsp;&nbsp; vsql varchar2(1000);<br />
&nbsp;&nbsp; startpos number;<br />
&nbsp;&nbsp; endpos number;<br />
&nbsp;&nbsp; resultcursor itfuture.ref_cursor;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp; countrecord:=getTableCount(result_sql);------------------调用总计录方法&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; vsql:=result_sql;<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(sortfield is not null) then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:=vsql||' order by '||sortfield;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sorttype='1')then <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:=vsql||' asc ';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:=vsql||' desc ';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp;&nbsp; end if;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; if((curpage is not null)and(page_record is not null)) then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startpos:=((curpage-1)*page_record+1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endpos:=curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsql:='select cc.* from (select bb.*,rownum r_id from('||vsql||') bb where rownum&lt;'||endpos||' ) cc where cc.r_id&gt;'||startpos;<br />
&nbsp;&nbsp;&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp;&nbsp; open resultcursor for vsql;<br />
&nbsp;&nbsp;&nbsp;&nbsp; return resultcursor;<br />
&nbsp;&nbsp;&nbsp;&nbsp; exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; when others then<br />
&nbsp;&nbsp;&nbsp;&nbsp; raise;<br />
&nbsp;&nbsp; end; <br />
&lt;----------2---------&gt;<br />
create or replace function f_getOnePage(curpage number,page_record number,cond varchar2) return itfuture.ref_cursor<br />
&nbsp;as<br />
&nbsp;&nbsp; rc itfuture.ref_cursor;<br />
&nbsp;&nbsp; str_sql varchar2(2000);<br />
&nbsp;&nbsp; a NUMBER;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a:=6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_sql:='select * from (select t.*,rownum id from deptinfo t where 1=1 '||cond||' order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between '||(curpage-1)*page_record || ' and '|| curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for str_sql;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rc;<br />
&nbsp;&nbsp; end;<br />
/*-----------------在包下创建函数--------------------*/<br />
&lt;----包下函数定义----&gt;<br />
create or replace package itfuture<br />
&nbsp;as<br />
&nbsp; type ref_cursor is ref cursor;<br />
&nbsp; function f_getOnePage(curpage number,page_record number,cond varchar2) return itfuture.ref_cursor;<br />
&nbsp;end;<br />
&lt;----包下函数实现----&gt;<br />
create or replace package body itfuture<br />
&nbsp;is<br />
&nbsp;function f_getOnePage(curpage number,page_record number,cond varchar2) return itfuture.ref_cursor<br />
&nbsp;as<br />
&nbsp;&nbsp; rc itfuture.ref_cursor;<br />
&nbsp;&nbsp; str_sql varchar2(2000);<br />
&nbsp;&nbsp; a NUMBER;<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a:=6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_sql:='select * from (select t.*,rownum id from deptinfo t where 1=1 '||cond||' order by t.deptid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id between '||(curpage-1)*page_record || ' and '|| curpage*page_record;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open rc for str_sql;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rc;<br />
&nbsp;&nbsp; end;<br />
&nbsp; end;</p>
<p><br />
/***************************************java中存储过程的调用***************************/</p>
<p>String query="{call getOnePage(?,?,?)}";<br />
CallableStatement cs=open.conn.prepareCall(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(1,1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(2,10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.execute();<br />
ResultSet rs=(ResultSet)cs.getObject(3);</p>
<p>/***************************************java中函数的调用***************************/<br />
String query="begin :1 :=itfuture.f_getOnePage(:2,:3,:4);end;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement cs=open.conn.prepareCall(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(2,1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setInt(3,5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.setString(4,null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs.execute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs=(ResultSet)cs.getObject(1);</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/160951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-16 11:24 <a href="http://www.blogjava.net/libin2722/articles/160951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp 70 问答</title><link>http://www.blogjava.net/libin2722/articles/158058.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Sun, 04 Nov 2007 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/158058.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/158058.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/158058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/158058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/158058.html</trackback:ping><description><![CDATA[jsp问答７０问：<br />
1. 问：在JAVA与JSP中要调用一个LINUX上的脚本程序,或WINDOWS上的脚本程序,该怎么写？<br />
答：System.getRuntime().exec("bash &lt; aaa.sh");<br />
<br />
2. 问：java中用什么表示双引号<br />
答："""<br />
<br />
3. 问：如何在JSP程序里另起一个线程？<br />
答：<br />
JSP本身就是独立线程运行而不象CGI都是独立进程.<br />
一般:<br />
Thread t = new Thread("你的对象");<br />
t.start();就可以了.<br />
要求你这个对象要实现runnable接口或继承thread.<br />
<br />
4. 问：jsp如何获得客户端的IP地址？<br />
答：<br />
request.getRemoteAddr()<br />
看看各个webserver的API文档说明，一般都有自带的，resin和tomcat都有<br />
<br />
5. 问：程序终止与输出终止<br />
答：<br />
程序中止:return;<br />
输出中止out.close();这一句相当于ASP的response.end<br />
<br />
6. 问：jsp中如何得到上页的URL？<br />
答：request.getHeader("referer");<br />
<br />
7. 问：提交网页的网页过期功能是怎么做的？<br />
答：response.setHader("Expires","0");<br />
<br />
8. 问：在JSP网页中如何知道自已打开的页面的名称<br />
答：<br />
request.getRequestURI() ;//文件名<br />
request.getRequestURL() ;//全部ＵＲＬ<br />
<br />
9. 问：提交表单后验证没有通过，返回提交页面，如何使原提交页面中的数据保留？<br />
答：javascript的go(-1)可以把上页的表单内容重新显示出来,但password域没有<br />
<br />
10. 问：如何取得http的头信息？<br />
答：request.getHader(headerName);<br />
<br />
11. 问：&amp;&amp;和&amp;的区别？<br />
答：<br />
&amp;&amp;是短路的与操作，也就是当地一个条件是false的时候，第二个条件不用执行<br />
&amp;相反，两个条件总是执行。<br />
<br />
12. 问：将*以正弦曲线的一个周期显示出来<br />
答：<br />
public void paint(Graphics g)<br />
{<br />
for(int i=0;i&lt;200;i++)<br />
g.drawString("*",i,(int)(Math.sin(i)*20)+50);<br />
}<br />
}<br />
<br />
13. 问：浮点数相乘后结果不精确如100.0 * 0.6 结果等于 60.0004<br />
答：<br />
这不叫错误,float和double是这样实现的.如果要精确计算，java提供了一个strictfp,它的计算遵循IEEE 754标准.而普通的float和double是<br />
<br />
由地平台浮点格式或硬件提供的额外精度或表示范围。<br />
<br />
14. 问：如何获得当前用的cursors的位置？<br />
答：<br />
int row = rs.getRow()就是当前指针行数,还有isFrist();isBeforeFist();isLast();isAfterLast();可以测试是不是在方法名所说的位置<br />
<br />
15. 问：表单成功提交了，点后退显示网页过期<br />
答：<br />
在&lt;head&gt;&lt;/head&gt;里面加以下代码<br />
&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />
&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />
&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt; <br />
或者在表单页中加上<br />
&lt;% <br />
response.setHeader("Pragma","no-cache"); <br />
response.setHeader("Cache-Control","no-cache"); <br />
response.setDateHeader("Expires",0); <br />
%&gt;<br />
<br />
16. 问：接口的简单理解<br />
答：接口为了规范,比如我在接口中定义了一个方法:<br />
getData()<br />
这是用来从不同的数据库中取数据的,就是JDBC的实现对于用户,我不要知道每种数据库是如何做的,但我知道如何它们要实现这个接口就一定有<br />
<br />
这个方法可以供我调用.这样SUN就把这个接口给各个数据库开发商,让他们自己实现. 但为什么不用继承而用接口哩,因为继承只能从一个你类<br />
<br />
继承,而接口可以实现多个,就是说我实现的子类有多个规定好的接口中的功能. 这只是简单的理解,等你深入理解抽象的时候就知道抽象到抽象<br />
<br />
类时为什么还要再抽象到接口.<br />
<br />
17. 问：怎样编写一个取消按钮（怎样返回上一个页面，象工具栏的后退按钮）？<br />
答：<br />
javascript把每次浏览过的location都压到了一个栈中,这个栈就是history,然后你如果要回到第几个页面它就做几次POP操作,把最后POP出来<br />
<br />
的那个LOCATION给你. 这就是JAVASCRIPT在实现history.go(-x)的原理.<br />
<br />
18. 问：什么是回调？<br />
答：<br />
简单说,回调用不是让你去监听谁做完了什么事,而是谁做完了什么事就报告给你. 这就是回调用的思想.例子太多了,AWT的事件,SWING事件模型<br />
<br />
都是这样有. 还有多线程中,如果要控制线程数,不能总是查询每个线程是否结束,要在每个线程结束时让线程自己告诉主线程我结束了,你可以<br />
<br />
开新的线程了.<br />
<br />
19. 问：简要介绍一下compareTo方法<br />
答：<br />
compareTo方法是Comparable 接口必需实现的方法,只要实现Comparable <br />
<br />
就可以用Arrays.srot()排序就象实现Runnable接口的run就能Thread()一样.<br />
<br />
20. 问：如何可以从别的Web服务器检索页, 然后把检索到的网页的HTML代码储存在一个变量中返回过来<br />
答：这是一个简单的WEB ROBOT实现,用URL类实现从网页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去就行了.<br />
<br />
21. 问：applet中如何获得键盘的输入<br />
答：application的System.in是当前系统的标准输入,applet因为安全的原因不可能读取当前系统(客户端)的标准输入,只能从它的ROOT组件的<br />
<br />
事件中,比如键盘事件中取得键值.<br />
<br />
22. 问：怎样计算代码执行所花费的时间？<br />
答：<br />
代码开始取时间，结束后取时间，相减<br />
long t1 = System.currentTimeMillis();<br />
///////////////// your code<br />
long t2 = System.currentTimeMillis() ;<br />
long time = t2-t1;<br />
<br />
23. 问：如何获在程序中获得一个文件的ContentType？<br />
答：<br />
URL u = new URL("file:///aaa.txt");<br />
URLConnection uc = u.openConnection();<br />
String s = uc.getContentType();<br />
<br />
24. 问：连接池的使用是建立很多连接池，还是一个连接池里用多个连接？<br />
答：<br />
只有在对象源不同的情况下才会发生多个池化,如果你只连一结一个数据源,永远不要用多个连结池. 所以连结池的初始化一定要做成静态的,而<br />
<br />
且应该在构造对象之前,也就是只有在类LOAD的时候,别的时候不应该有任何生成新的连结池的时候。<br />
<br />
25. 问：JavaMail要怎么安装？<br />
答：下载两个包，一个是javamail包，另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH。<br />
<br />
26. 问：怎样把地址栏里的地址锁定？<br />
答：把你的服务器的可访问目录索引选项关闭就行了,任何服务器都有一个conf文件,里面都有这个选项。<br />
<br />
27. 问：在JAVA中怎么取得环境变量啊。比如： TEMP = C：TEMP ？<br />
答：String sss = System.getProperty(key)<br />
<br />
28. 问：怎样实现四舍五入，保留小数点后两位小数？<br />
答：<br />
import java.text.*;<br />
...<br />
NumberFormat nf=NumberFormat.getNumberInstance();<br />
nf.setMaximumFractionDigits(2);<br />
nf.setMinimumFractionDigits(2);<br />
nf.format(numb);<br />
<br />
29. 问：Applet和form如何通信？<br />
答：<br />
取得的参数传到param里面<br />
&lt;% <br />
String xxx = request.getParameter("xxx"); <br />
%&gt; <br />
&lt;applet&gt; <br />
&lt;param value="&lt;%=xxx%&gt;"&gt; <br />
&lt;/applet&gt;<br />
<br />
<br />
30. 问：java-plug-in是什么？<br />
答：Java Runtime Environment的插件。用来运行java程序。不需要什么特别的设置。等于你的机器里面有了jvm。<br />
<br />
31. 问：WEB上面怎么样连接上一个EXCEL表格？<br />
答：<br />
定义页面得contentType="application/vnd.ms-excel"，让页面以excel得形式打开。同样也可以以word得形式打开：application/msword。<br />
<br />
32. 问：怎样才能避免textarea字数限制？<br />
答：是使用了FORM的默认方法的缘故,如果什么也不写默认是GET改用Post即可，在Form中定义mothod="post"。<br />
<br />
33. 问：为什么加了&lt;%@page contentType="text/html;charset=gb2312" %&gt;插入数据库的中文，依然是乱码？<br />
答：<br />
这要从环境看,能显示说明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中文,同一公司不同版本的JDBC都有支持中文和不支持中<br />
<br />
文的情况,RESIN自带的MYSQL JDBC就不支持,MM的就支持,还有你的数据库类型是否支持中文?CHAR的一般支持,但是否用binary存储双字节码<br />
<br />
34. 问：对于JFrame，hide()，show()与setVisibel()有什么区别吗？<br />
答：<br />
setVisible()从Component继承过来，而hide(),show()从Window里面继承过来。<br />
Makes the Window visible. If the Window and/or its owner are not yet displa yable, both are made displayable. The Window will <br />
<br />
be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别在<br />
<br />
这。<br />
36. 问：sendRedirect为什么不可以转到mms协议的地址的？response.sendRedirect("mms://missiah.adsldns.org:9394");<br />
答：java平台目前实现的protocol中并没有mms,你可以取系统属性java.protocol.handler.pkgs看看它的值中有没有mms,所以如果要想重定向<br />
<br />
到mms://host这样和URL,只有生成客户端的JAVASCRIPT让它来重定向<br />
<br />
37. 问：JTable中怎样定义各个Columns和Width和怎样设置表格的内容靠做靠右或居中？<br />
答：<br />
TableColumn tc = table.getColumn("Name");//取得列名为"Name"的列Handle<br />
int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽度<br />
tc.setPreferredWidth(200); //设置当前列宽<br />
tc.setMaxWidth(200); //设置该列最大宽度<br />
tc.setMinWidth(50); //设置该列最小宽度<br />
<br />
38. 问：批操作是否可用于select语句？<br />
答：批操作其实是指成批理更新的操作,绝对不可能用于select操作。<br />
<br />
39. 问：为什么jsp路径太深文件名太长就无法读取文件？<br />
答：path不能超过255长度,不然就找不到了.这是作业系统的事。<br />
<br />
40. 问：如何让页面不保留缓存？<br />
答：<br />
&lt;% <br />
response.setHeader("Pragma","No-cache"); <br />
response.setHeader("Cache-Control","no-cache"); <br />
response.setDateHeader("Expires", 0); <br />
%&gt;<br />
<br />
41. 问：我的applet code 中用到jbutton 时就出错是否由于ie不支持swing package 请问应怎么办？<br />
答：JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar放在classpath就行了.不要加载任何别的库。<br />
<br />
42. 问：不知道java是否支持midi格式，如果支持，应该怎么把wave格式转换成midi格式？<br />
答：目前还不行,可以看一下JMF三个版中对MIDI的格式支持是read only,而WAVE是read/write,MIDI只能播放,不能生成。<br />
<br />
43. 问：在jsp里面防止用户直接输入url进去页面，应该怎么做呢？<br />
答：<br />
一是从web服务器控制,对某一目录的所有访问要通过验证.<br />
二是在要访问的页面中加入控制.这个一般用session,也可以用请求状态码实现<br />
<br />
44. 问：<br />
例如后台有一计算应用程序（此程序运算起来很慢，可持续几分钟到几小时，这不管，主要是能激活它），客户机讲任务提交后，服务器对任<br />
<br />
务进行检测无误后将向服务器后台程序发送信息，并将其激活。要求如下：<br />
1）首先将后台程序激活，让它执行此任务（比如，前台将计算的C代码提交上后，后台程序程序能马上调用，并将其运行）<br />
2）要在前台JSP页面中显示运行过程信息（由于运行时间长，希望让客户看到运行过程中产生的信息）如何完成？<br />
<br />
答：<br />
活是可以的,运行一个shell让它去运行后台就行,但不可能取出运行信息,因为HTTP的超时限制不可能永远等你后台运行的,而且信息如果要动态<br />
<br />
实时推出来就得用SERVER PUSH技术。<br />
<br />
45. 问：数据库是datetime 型 ，插入当前时间到数据库？<br />
答：<br />
java.sql.Date sqlDate = new java.sql.Date();<br />
PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");<br />
pstmt.setDate(1,sqlDate);<br />
pstmt.executeUpdate();<br />
<br />
46. 问：怎样去掉字符串前后的空格。<br />
答：String.trim()<br />
<br />
47. 问：session怎样存取int类型的变量？<br />
答：<br />
session.setAttribute("int", i+"");<br />
int i = Integer.parseInt(session.getAttribute("int"));<br />
<br />
48. 问：在javascript中如何使输出的float类型的数据保留两位小数。<br />
答：Math.round(aaaaa*100)/100。<br />
<br />
49. 问：在bean种如何调用session<br />
答：<br />
你可把session对象作为一个参数传给bean<br />
在BEAN中定义HttpServletRequest request;HttpSession session;<br />
然后<br />
session = request.getSession(false);<br />
false为如果session为空,不建立新的session<br />
将session作为参数传入.其实只要将request传入就可以<br />
<br />
50. 问：如何把txt或word文件按原格式显示在jsp页面或servlet上？<br />
答：<br />
其实一个非常简单的解决方法就是在服务器的MIME中指点定TEXT和WORD的解释方式,然后用JSP或SERVLET生成它就行了,客户端就会自动调用相<br />
<br />
应程序打开你的文档。<br />
如果是希望按原格式的显示在页面上，而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮点.它是在WEB方式下打开<br />
<br />
文档,和共享一样.完全符合的要求。<br />
<br />
51. 问：object的clone方法为什么不能直接调用？<br />
答：<br />
这个方法在object中是protected<br />
为什么要把这个方法定义为protected,这是一个折中,它的目的是想知道你这个方法在Object里只是一个标记,而不是一个实现,比如<br />
<br />
public class Object<br />
{<br />
.............<br />
protected Object clone()<br />
{}<br />
}<br />
<br />
所以直接继承的clone()方法并不能做任何时,你要使用这个方法就要重载这个方法并放宽访问权限为public,或实现cloneable接口. 但它没法<br />
<br />
这样告诉你它没有真的实现,只好用protected 方法加以警示<br />
<br />
52. 问：一个页面中如何刷新另外一个页面？<br />
答：<br />
要求是这些面页必须有关联,一是它们都有一个共同的顶层帧,也就是说是一个帧内的分级页面,当然可以是任意级,帧内再分帧也可以,另一个可<br />
<br />
能是当前窗口弹出的窗口,如果没有联系,那就不可能用一个页面刷新另一个页面. 帧内只要一级一级引用就行了. <br />
<br />
比如在左帧中一个页面中写top.right.location.reload();那么名为right的右帧中的页面就会刷新. 弹出的一样,用open时的名称刷新子窗口,<br />
<br />
子窗口用opener刷新主窗口<br />
<br />
53. 问：如何在jsp中怎么样向客户端写cookies？<br />
答：<br />
Cookie coo = new Cookie(name, value);<br />
HttpServletResponse.addCookie(name);<br />
<br />
54. 问：为什么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一样？<br />
答：就是说如果不是指定为等宽字体,每个字体的宽度都是不一样的.因此JAVA中用FontMetrics 类来取字符宽度。<br />
<br />
55. 问：String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exe？<br />
答：<br />
这应该是解析上传时候的二进制流得到的这一行里面格式是固定的，取到name="后面的字符串，然后把";去掉。然后取最后一个/后面的所有字<br />
<br />
符组成一个新字符串就行了。<br />
<br />
56. 问：如何传值并不刷新页面？<br />
答：<br />
弹出一个页面进行值的选择或者输入，ok后使用将值传给原窗口，使用javascript关闭打开的窗口即可：<br />
window.close();opener.focus();<br />
<br />
57. 问：有一个字符串："EF0C114EA4"，如何变为a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4？<br />
答：<br />
String str="EF0C114EA4F";<br />
out.print(str+"&lt;br&gt;");<br />
int l=str.length()/2+str.length()%2,j=0,k=0;<br />
String[] a=new String[l];<br />
for(int i=0;i&lt;l;i++){<br />
if(str.length()-j==1)<br />
k=str.length();<br />
else<br />
k=j+2;<br />
a="0x"+str.substring(j,k);<br />
out.print("a["+Integer.toString(i)+"]="+a+"&lt;br&gt;");<br />
j+=2;<br />
}<br />
<br />
58. 问：怎样将一个int转换成一个四字节的byte数组？<br />
答：<br />
int x = 1234567;<br />
byte[] b = new byte[4];<br />
for(int i=0;i&lt;b.length;i++)<br />
{<br />
b = (x &gt;&gt;( i*8)) &amp; 0xFF;<br />
}<br />
<br />
59. 问：indexOf()的使用需要注意什么？<br />
答：参数是指从第几位（1，2，3，...）开始搜索，而返回值是指搜索到的位置（0，1，2，3.......）注意是从零算起的。<br />
<br />
60. 问：在Java应用程序中如何动态的添加一个按钮？<br />
答：<br />
这里涉及一个组件重绘的问题,组件要先于panel被显示之处存在,如果一panel已经显示了,那么加在上面你能看到吗?但如果在同一个panel上, <br />
<br />
先有button A,假如按下它加了butt on B,这时你如果使整个panel重给,那么A本身要重绘,它的事件监听就没有了,当然也就加不成B了,所以如<br />
<br />
果要先有另一个panel,当按A时把B加在这个panel上并重绘这个paenl,其实更好的方法是先把B加在panel中,同一个也行.把它setVisiable(flas<br />
<br />
e),按A时设为 true。<br />
<br />
61. 问：book mybook=new book(bookid);book是servlet,出错。<br />
答：<br />
book是servlet,能book mybook=new book(bookid);<br />
说明自己实现了servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJB连1%的区别都没有,它们都是自己继承或实现一些接<br />
<br />
口,在这些父类或接口中实现了如果和容器"打交道"的方法,然后容器调用这些方法来管理它,让它生成实例,池化,钝化,销毁,再生等.所以这样<br />
<br />
写是错误的。<br />
<br />
62. 问：给定一个字符串5*(5+9)/7怎样计算出结果？<br />
答：<br />
可有两种方法<br />
1。用堆栈完成<br />
2。最简单的方法，不用编程，如果有任何一个数据库的化，用select (5*(5+9)/7) from oneTable<br />
<br />
63. 问：如何实现递交表单内容的加密解密？<br />
答：<br />
如果你用IE目前只能用SSL协议,这一层不要你考虑,否则只你用你自己的工具加密传输,接收后再解密友,至于如何加解,如果要和公认的系统结<br />
<br />
合,就用通用的MD5,RAS等公开算法,如果你只是自己传自己解,你随便按你的想法把数据加上一些东西,取回来按规则减掉这些东西,我敢保证除<br />
<br />
你自己没有任何人能知道解密方法.<br />
<br />
64. 问：为什么Integer.parseInt("+1");会抛出NumberFormatException的异常？<br />
答：因为"+"运行算在JAVA中被重载.系统无法确定你用的是算术加还是字符+。<br />
这一点可以在JAVASCRIPT中更好地理解:<br />
&lt;form name="t"&gt;&lt;input name=s value=1234&gt;&lt;/form&gt;<br />
var a = document.t.s.value+1;<br />
这时a = 12345,因为document.t.s.value作为字符串.但var a = document.t.s.value-1;<br />
a 就是1233,因为系统知道-运算肯定是算术运行.所以把document.t.s.value转换成数字.<br />
<br />
<br />
65. 问：hashCode() 有什么用为什么有时候需要覆盖Object里的hashcode()方法？<br />
答：这就是这个对象的身份证啊,要不如何区分哪个对象。<br />
<br />
66. 问：怎样在tomcat中实现一个定时执行的东东？<br />
答：<br />
在应用程序启动时自动运行。servlet2.3中定义了ServletListener,监听Servlet Con text的启动或则关闭（可在配置文件中配置），启动时<br />
<br />
触发一个守护程序的运行(可以实现java.util.Timer或则 javax.swing.Timer).<br />
<br />
67. 问：程序可以输出自己吗？<br />
答：孔德悖论这个非常有名的法则.就是说任何程序都不可能输出自己.<br />
<br />
68. 问：能够把字符转化成ASCII码？比如将 A 转化成 65？<br />
答：<br />
int a='A';<br />
out.println(a);<br />
<br />
69. 问：如何区分输入的文字中的全角与半角？<br />
答：由于不能分辨出全角和半角字符的值有什么规律,只好把全角符号牧举出来了.<br />
<br />
70. 问：用户注册后的自动发信程序该怎么做？<br />
答：<br />
这种发信程序不考虑性能,因为不可能1秒就有一个人注册,我们说的考虑性能的发信程序是指上百万封信在队列里要不停发送的那种,象你这个<br />
<br />
随便怎么写一个程序都行,没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocket连它的25口就行了.自己用SOCKET连SMTP的25口发一封<br />
<br />
信就好象两个邻居之间送一样东西,直接递过去得了,用JAVAMAIL,消息机制就是你把这个东西从邮局寄给你的邻居了.&nbsp;&nbsp;<br />
<img src ="http://www.blogjava.net/libin2722/aggbug/158058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-04 12:59 <a href="http://www.blogjava.net/libin2722/articles/158058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计标准</title><link>http://www.blogjava.net/libin2722/articles/143253.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 06 Sep 2007 10:18:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/143253.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/143253.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/143253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/143253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/143253.html</trackback:ping><description><![CDATA[<p>数据库设计标准 <br />
1． 数据表字段说明<br />
（1） 每个表都必须有一个关键字，如果表中没有可以设置成关键字的字段，可以添加一个ID字段作为关键字。需要特别注意的是，一些数据库系统如果没有关键字，那么允许所有字段有相同的值，此时如果对其进行操作时，数据库系统将整条记录作为一个关键字来操作，从而出现多个关键字的问题，导致操作出错。对于数字类型的关键字，如果不需要程序或者人为来维护的，就将其设置成为标示种子为1，标示递增量为1的标示字段。尽量不要使用由手工输入的数据作为关键字，这是由于手工输入的不可靠性容易导致不可预见的后果。设置关键字时尽量避免设置多个字段的联合关键字。<br />
（2） 对于非关键字、不允许空值以下数据类型的字段：日期型、布尔型、数字型等字段，无论是否有程序自动维护，必须在数据库设计的时候设定其默认值。<br />
（3） 在设定字段长度时，对于系统固定长度的字段，不需要更改，对于需要设计者指定长度的字段，设计者可以根据实际情况指定，如果对已经有数据的数据表的字段长度缩小的时候，必须注意超过新数据长度的数据截断问题。对现有数据类型的转换也需要注意是否可以转换，数据长度的问题。<br />
2． 表字段定义说明<br />
语言--一般来说定义数据库时不要使用中文或其他类型文字的字段名，尽量使用英文或者英文加数字来作为字段名，尽管使用中文或其他类型文字作为字段名在直接操作数据库时很容易，但是在数据库以及依赖于数据库的前台程序的不同语言操作系统的兼容性完全丧失，当然中文或其他类型文字可以放在字段的描述或者说明里面起辅助作用。<br />
明确--原则上字段名的定义只要符合数据库系统的字段定义要求就可以，如：1、2、&#8230;&#8230;；A、B、C、&#8230;&#8230;，ABC、A12BC、&#8230;&#8230;，等都是合法字段，但是一定的数据库往往是和一定的前台程序联系起来的，如果字段名定义不明确，造成程序在编写过程中的混乱，程序的可读性、可维护性极差。 <br />
准确--字段名尽量使用准确的英文名字，如果相同名字的字段有几个，可以用字母或者数字后缀区别。不要使用系统的保留字作为字段名，尽量避免使用开发语言的保留字作为字段名。字段名可以按照大小写敏感的方式来命名。<br />
简洁--避免使用不必要的前缀，如有一个Contact的'联系人'表，其中有一个联系人名字的字段，不要使用ContactName作为其字段名，使用Name就可以了。<br />
顺序--按照描述事物或者常规思维模式来安排顺序，不要随意安排顺序，虽然任意顺序的字段都可以，但是对于数据库的维护来说却非常麻烦，特别是字段多的表。<br />
3． 数据类型的选择 <br />
（1）ID字段不要作为表的主键与其它表关联，这将会影响到该表的数据迁移。<br />
（2）Text 和Image字段属指针型数据，主要用来存放二进制大型对象（BLOB）。这类数据的操作相比其它数据类型较慢，因此要避开使用。<br />
（3）各种类型字段的均有众多的相关函数支持，例如日期型函数，在日期的大小比较、加减操作上非常简单。但是，在按照日期作为相等条件的查询操作也要用函数，而使用函数作为查询的条件时，服务器无法用先进的性能策略来优化查询而只能进行表扫描遍历每行,因此，在选择大数据表的关键字段数据类型时应根据在选择查询策略尽可能避开使用函数的原则加以考虑。 <br />
（4）注意数值型数据的取值范围问题，文本型的数据要保留一定的冗余长度。<br />
4． 数据库命名规范<br />
不同的数据库产品对对象的命名有不同的要求，因此，数据库中的各种对象的命名、后台程序的代码编写应采用大小写敏感的形式，各种对象命名长度不要超过30个字符，这样便于应用系统适应不同的数据库平台。<br />
5． 索引的建立<br />
为加快访问的速度，对表建立索引是加快速度的一个理想做法，但是索引应该避免用大数据的字段来建立，如Text，Image以及长数据的字符串型等。<br />
6．视图的建立<br />
对于需要访问相关联的表，如果在应用程序中去处理，可能会使应用程序的代码编写出现不必要的繁复，而且也会忽视数据库的潜力开发，这种情况的解决方法是利用数据库的视图。<br />
7．导入/导出操作注意事项<br />
不同的数据库系统或者相同的数据库系统之间允许以导入/导出的方法来在另一个不同的数据库中形成新的数据库或者数据库中的表，这是一个十分简洁的方法，但是需要注意的是，这样的操作会将源表中的一些信息丢失，如关键字、默认值等，所以在执行完导入/导出的操作之后，一定要在目的数据库中重新检查设置相关属性。<br />
8．合法性检验<br />
尽量在数据进入数据库之前对数据进行合法性检验，避免不合法数据进入数据库，否则数据库的维护将非常困难。 注意：以下附件仅供参考，附件中如有规范与我们的规范矛盾则以我们的规范为准。 <br />
摘录附件：<br />
数据库设计方法、规范与技巧<br />
一、数据库设计过程<br />
数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境，构造最优的数据库模式，建立数据库及其应用系统，有效存储数据，满足用户信息要求和处理要求。<br />
数据库设计中需求分析阶段综合各个用户的应用需求（现实世界的需求），在概念设计阶段形成独立于机器特点、独立于各个DBMS产品的概念模式（信息世界模型），用E-R图来描述。在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型，形成数据库逻辑模式。然后根据用户处理的要求，安全性的考虑，在基本表的基础上再建立必要的视图（VIEW）形成数据的外模式。在物理设计阶段根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。<br />
1. 需求分析阶段 <br />
需求收集和分析，结果得到数据字典描述的数据需求（和数据流图描述的处理需求）。 <br />
需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。<br />
需求分析的方法：调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。 <br />
常用的调查方法有： 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。<br />
分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法（Structured Analysis，简称SA方法）从最上层的系统组织机构入手，采用逐层分解的方式分析系统，并把每一层用数据流图和数据字典描述。<br />
数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典（Data Dictionary，简称DD）来描述。<br />
数据字典是各类数据描述的集合，它是关于数据库中数据的描述，即元数据，而不是数据本身。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分(至少应该包含每个字段的数据类型和在每个表内的主外键)。<br />
数据项描述 ＝｛数据项名，数据项含义说明，别名，数据类型，长度， <br />
　　　　　　　　　取值范围，取值含义，与其他数据项的逻辑关系｝ <br />
数据结构描述 ＝｛数据结构名，含义说明，组成:｛数据项或数据结构｝｝ <br />
数据流描述 ＝｛数据流名，说明，数据流来源，数据流去向， <br />
　　　　　　　　　组成:｛数据结构｝，平均流量，高峰期流量｝ <br />
数据存储描述 ＝｛数据存储名，说明，编号，流入的数据流，流出的数据流， <br />
　　　　　　　　组成:｛数据结构｝，数据量，存取方式｝ <br />
处理过程描述 ＝｛处理过程名，说明，输入:｛数据流｝，输出:｛数据流｝, <br />
　　　　　　　　　　处理:｛简要说明｝｝ </p>
<p>2. 概念结构设计阶段 <br />
通过对用户需求进行综合、归纳与抽象，形成一个独立于具体DBMS的概念模型，可以用E-R图表示。 <br />
概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。 <br />
概念模型特点：<br />
(1) 具有较强的语义表达能力，能够方便、直接地表达应用中的各种语义知识。 <br />
(2) 应该简单、清晰、易于用户理解，是用户与数据库设计人员之间进行交流的语言。<br />
概念模型设计的一种常用方法为IDEF1X方法，它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术，用于建立系统信息模型。<br />
使用IDEF1X方法创建E-R模型的步骤如下所示:</p>
<p>2.1 第零步--初始化工程<br />
这个阶段的任务是从目的描述和范围描述开始，确定建模目标，开发建模计划，组织建模队伍，收集源材料，制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果，业务流程，原有系统的输入输出，各种报表，收集原始数据，形成了基本数据资料表。<br />
2.2 第一步--定义实体<br />
实体集成员都有一个共同的特征和属性集，可以从收集的源材料--基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有"代码"结尾的术语，如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来，从而初步找出潜在的实体，形成初步实体表。<br />
2.3 第二步--定义联系<br />
IDEF1X模型中只允许二元联系，n元联系必须定义为n个二元联系。根据实际的业务需求和规则，使用实体联系矩阵来标识实体间的二元关系，然后根据实际情况确定出连接关系的势、关系名和说明，确定关系类型，是标识关系、非标识关系（强制的或可选的）还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识，则为标识关系，否则为非标识关系。非标识关系中，如果每个子实体的实例都与而且只与一个父实体关联，则为强制的，否则为非强制的。如果父实体与子实体代表的是同一现实对象，那么它们为分类关系。<br />
2.4 第三步--定义码<br />
通过引入交叉实体除去上一阶段产生的非确定关系，然后从非交叉实体和独立实体开始标识侯选码属性，以便唯一识别每个实体的实例，再从侯选码中确定主码。为了确定主码和关系的有效性，通过非空规则和非多值规则来保证，即一个实体实例的一个属性不能是空值，也不能在同一个时刻有一个以上的值。找出误认的确定关系，将实体进一步分解，最后构造出IDEF1X模型的键基视图（KB图）。<br />
2.5 第四步--定义属性<br />
从源数据表中抽取说明性的名词开发出属性表，确定属性的所有者。定义非主码属性，检查属性的非空及非多值规则。此外，还要检查完全依赖函数规则和非传递依赖规则，保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。<br />
2.6 第五步--定义其他对象和规则<br />
定义属性的数据类型、主键、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。</p>
<p>3. 逻辑结构设计阶段 <br />
将概念结构转换为某个DBMS所支持的数据模型（例如关系模型），并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型，然后选择最合适的DBMS。<br />
将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则： <br />
1）一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。 <br />
2）一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 <br />
3）一个1:n联系可以转换为一个独立的关系模式，也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式，则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性，而关系的码为n端实体的码。 <br />
4）一个1:1联系可以转换为一个独立的关系模式，也可以与任意一端对应的关系模式合并。<br />
5）三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 <br />
6）同一实体集的实体间的联系，即自联系，也可按上述1:1、1:n和m:n三种情况分别处理。 <br />
7）具有相同码的关系模式可合并。 <br />
为了进一步提高数据库应用系统的性能，通常以规范化理论为指导，还应该适当地修改、调整数据模型的结构，这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准，即：<br />
表内的每一个值都只能被表达一次。<br />
表内的每一行都应该被唯一的标识（有唯一键）。<br />
表内不应该存储依赖于其他键的非键信息。 </p>
<p>4. 数据库物理设计阶段 <br />
为逻辑数据模型选取一个最适合应用环境的物理结构（包括存储结构和存取方法）。根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。</p>
<p>5. 数据库实施阶段 <br />
运用DBMS提供的数据语言（例如SQL）及其宿主语言（例如C），根据逻辑设计和物理设计的结果建立数据库，编制与调试应用程序，组织数据入库，并进行试运行。 数据库实施主要包括以下工作：用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行 </p>
<p>6. 数据库运行和维护阶段 <br />
数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。包括：数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。</p>
<p>建模工具的使用<br />
为加快数据库设计速度，目前有很多数据库辅助工具（CASE工具），如Rational公司的Rational Rose，CA公司的Erwin和Bpwin，Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。<br />
ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式，描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型，不仅能得到优秀的业务功能和数据需求模型，而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中，IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中，ERwin可以定义对应的表、列，并可针对各种数据库管理系统自动转换为适当的类型。<br />
设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后，设计人员可以使用Erwin画ER图，将ER图转换为关系数据模型，生成数据库结构；画数据流图，生成应用程序。</p>
<p>二、数据库设计技巧<br />
1. 设计数据库之前（需求分析阶段）<br />
1) 理解客户需求，询问用户如何看待未来需求变化。让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。<br />
2) 了解企业业务可以在以后的开发阶段节约大量的时间。<br />
3) 重视输入输出。<br />
在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。<br />
举例：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。 <br />
4) 创建数据字典和ER 图表<br />
ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。<br />
5) 定义标准的对象命名规范<br />
数据库各种对象的命名必须规范。</p>
<p>2. 表和字段的设计（数据库逻辑设计）<br />
表设计原则<br />
1) 标准化和规范化<br />
数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式，但Third Normal Form（3NF）通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说，遵守3NF 标准的数据库的表设计原则是："One Fact in One Place"即某个表只包括其本身基本的属性，当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点：有一组表专门存放通过键连接起来的关联数据。<br />
举例：某个存放客户及其有关定单的3NF 数据库就可能有两个表：Customer 和Order。Order 表不包含定单关联客户的任何信息，但表内会存放一个键值，该键指向Customer 表里包含该客户信息的那一行。<br />
事实上，为了效率的缘故，对表不进行标准化有时也是必要的。<br />
2) 数据驱动<br />
采用数据驱动而非硬编码的方式，许多策略变更和维护都会方便得多，大大增强系统的灵活性和扩展性。<br />
举例，假如用户界面要访问外部数据源（文件、XML 文档、其他数据库等），不妨把相应的连接和路径信息存储在用户界面支持表里。还有，如果用户界面执行工作流之类的任务（发送邮件、打印信笺、修改记录状态等），那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上，如果过程是数据驱动的，你就可以把相当大的责任推给用户，由用户来维护自己的工作流过程。<br />
3) 考虑各种变化<br />
在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。<br />
举例，姓氏就是如此（注意是西方人的姓氏，比如女性结婚后从夫姓等）。所以，在建立系统存储客户信息时，在单独的一个数据表里存储姓氏字段，而且还附加起始日和终止日等字段，这样就可以跟踪这一数据条目的变化。 字段设计原则<br />
1) 每个表中都应该添加的3 个有用的字段<br />
o?dRecordCreationDate，在VB 下默认是Now()，而在SQL Server 下默认为GETDATE()<br />
o?sRecordCreator，在SQL Server 下默认为NOT NULL DEFAULT USER<br />
o?nRecordVersion，记录的版本标记；有助于准确说明记录中出现null 数据或者丢失数据的原因<br />
2) 对地址和电话采用多个字段<br />
描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有，电话号码和邮件地址最好拥有自己的数据表，其间具有自身的类型和标记类别。<br />
3) 使用角色实体定义属于某类别的列<br />
在需要对属于特定类别或者具有特定角色的事物做定义时，可以用角色实体来创建特定的时间关联关系，从而可以实现自我文档化。<br />
举例：用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说，当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位，而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值，同时增加一个日期/时间字段来知道变化是何时发生的。这样，你的PERSON_TYPE 表就包含了所有PERSON 的可能类型，比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化，不过这样一来在时间上无法跟踪个人所处位置的具体时间。<br />
4) 选择数字类型和文本类型尽量充足<br />
在SQL 中使用smallint 和tinyint 类型要特别小心。比如，假如想看看月销售总额，总额字段类型是smallint，那么，如果总额超过了$32,767 就不能进行计算操作了。<br />
而ID 类型的文本字段，比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。<br />
5) 增加删除标记字段<br />
在表中包含一个"删除标记"字段，这样就可以把行标记为删除。在关系数据库里不要单独删除某一行；最好采用清除数据程序而且要仔细维护索引整体性。 </p>
<p>3. 选择键和索引（数据库逻辑设计）<br />
键选择原则：<br />
1) 键设计4 原则<br />
o?为关联字段创建外键。<br />
o?所有的键都必须唯一。<br />
o?避免使用复合键。<br />
o?外键总是关联唯一的键字段。<br />
2) 使用系统生成的主键<br />
设计数据库的时候采用系统生成的键作为主键，那么实际控制了数据库的索引完整性。这样，数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点：当拥有一致的键结构时，找到逻辑缺陷很容易。<br />
3) 不要用用户的键(不让主键具有可更新性)<br />
在确定采用什么字段作为表的键的时候，可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。<br />
4) 可选键有时可做主键<br />
把可选键进一步用做主键，可以拥有建立强大索引的能力。</p>
<p>索引使用原则：<br />
索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。<br />
1) 逻辑主键使用唯一的成组索引，对系统键（作为存储过程）采用唯一的非成组索引，对任何外键列采用非成组索引。考虑数据库的空间有多大，表如何进行访问，还有这些访问是否主要用作读写。<br />
2) 大多数数据库都索引自动创建的主键字段，但是可别忘了索引外键，它们也是经常使用的键，比如运行查询显示主表和所有关联表的某条记录就用得上。<br />
3) 不要索引memo/note 字段，不要索引大型字段（有很多字符），这样作会让索引占用太多的存储空间。<br />
4) 不要索引常用的小型表<br />
不要为小型数据表设置任何键，假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。 4. 数据完整性设计（数据库逻辑设计）<br />
1) 完整性实现机制：<br />
实体完整性：主键<br />
参照完整性：<br />
父表中删除数据：级联删除；受限删除；置空值<br />
父表中插入数据：受限插入；递归插入<br />
父表中更新数据：级联更新；受限更新；置空值<br />
DBMS对参照完整性可以有两种方法实现：外键实现机制（约束规则）和触发器实现机制<br />
用户定义完整性：<br />
NOT NULL；CHECK；触发器<br />
2) 用约束而非商务规则强制数据完整性<br />
采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性；它不能保证表之间（外键）的完整性所以不能强加于其他完整性规则之上。<br />
3) 强制指示完整性<br />
在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。<br />
4) 使用查找控制数据完整性<br />
控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找：国家代码、状态代码等。<br />
5) 采用视图<br />
为了在数据库和应用程序代码之间提供另一层抽象，可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。</p>
<p>5． 导入/导出声称数据库或数据表操作注意事项<br />
不同的数据库系统或者相同的数据库系统之间允许以导入/导出的方法来在另一个不同的数据库中形成新的数据库或者数据库中的表，这是一个十分简洁的方法，但是需要注意的是，这样的操作会将源表中的一些信息丢失，如关键字、默认值等，所以在执行完导入/导出的操作之后，一定要在目的数据库中重新检查设置相关属性。</p>
<p>6. 其他设计技巧<br />
1) 避免使用触发器<br />
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器，你最好集中对它文档化。<br />
2) 使用常用英语（或者其他任何语言）而不要使用编码<br />
在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码，可以在编码旁附上用户知道的英语。<br />
3) 保存常用信息<br />
让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复（对Access）、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库，当客户抱怨他们的数据库没有达到希望的要求而与你联系时，这样做对非客户机/服务器环境特别有用。<br />
4) 包含版本机制<br />
在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长，用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。 <br />
5) 编制文档<br />
对所有的快捷方式、命名规范、限制和函数都要编制文档。<br />
采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。<br />
对数据库文档化，或者在数据库自身的内部或者单独建立文档。这样，当过了一年多时间后再回过头来做第2 个版本，犯错的机会将大大减少。<br />
6) 测试、测试、反复测试<br />
建立或者修订数据库之后，必须用用户新输入的数据测试数据字段。最重要的是，让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。<br />
7) 检查设计<br />
在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说，针对每一种最终表达数据的原型应用，保证你检查了数据模型并且查看如何取出数据。</p>
<p>三、数据库命名规范<br />
语言--一般来说定义数据库时不要使用中文或其他类型文字的字段名，尽量使用英文或者英文或英文加数字来作为字段名，尽管使用中文或其他类型文字作为字段名在直接操作数据库时很容易，但是在数据库以及依赖于数据库的前台程序的不同语言操作系统的兼容性完全丧失，当然中文或其他类型文字可以放在字段的描述或者说明里面起辅助作用。 <br />
明确--原则上字段名的定义只要符合数据库系统的字段定义要求就可以，如：1、2、&#8230;&#8230;；A、B、C、&#8230;&#8230;，ABC、A12BC、&#8230;&#8230;，等都是合法字段，但是一定的数据库往往是和一定的前台程序联系起来的，如果字段名定义不明确，造成程序在编写过程中的混乱，程序的可读性、可维护性差。<br />
准确--字段名尽量使用准确的英文名字，如果相同名字的字段有几个，可以用字母或者数字后缀区别。不要使用系统的保留字作为字段名。字段名可以按照大小写敏感的方式来命名。<br />
简洁--避免使用不必要的前缀，如有一个Contact的'联系人'表，其中有一个联系人名字的字段，不要使用ContactName作为其字段名，使用Name就可以了。<br />
顺序--按照描述事物或者常规思维模式来安排顺序，不要随意安排顺序，虽然任意顺序的字段都可以，但是对于数据库的维护来说却非常麻烦，特别是字段多的表。</p>
<p>1. 实体（表）的命名 <br />
1) 表以名词或名词短语命名，确定表名是采用复数还是单数形式，此外一些数据库系统允许给标定义别名，给表的别名定义简单规则（比方说，如果表名是一个单词，别名就取单词的前4个字母；如果表名是两个单词，就各取两个单词的前两个字母组成4个字母长的别名；如果表的名字由3个单词组成，从头两个单词中各取一个然后从最后一个单词中再取出两个字母，结果还是组成4 字母长的别名，其余依次类推）对于不同功能的表来说，表名可以加上适当的前缀后面附上采用该表的名字。在命名过程当中，以明确的名字命名会给应用程序的编写带来极大的方便。<br />
举例： <br />
定义的缩写 Sales: Sal 销售；<br />
Order: Ord 订单；<br />
Detail: Dtl 明细；<br />
则销售订单明细表命名为：Sal_Ord_Dtl;<br />
2) 无论表或者是字段的名称仅有一个单词或者没有，建议尽量不要使用缩写，而是用完整的单词或者单词加数字组合。<br />
举例：<br />
定义的缩写 Material 物品；<br />
物品表名为：Material;<br />
但是字段物品编码则用：Code; 名称用：Name;<br />
3) 关联类通过用下划线连接两个基本类之后，再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。<br />
关联表用于保存多对多关系。<br />
如果被关联的表名大于10个字母，必须将原来的表名的进行缩写。如果没有其他原因，建议都使用缩写。<br />
举例：表Object与自身存在多对多的关系,则保存多对多关系的表命名为：R_Object；<br />
表 Depart和Employee;存在多对多的关系；则关联表命名为R_Dept_Emp</p>
<p>2. 属性（列）的命名<br />
1) 采用有意义的列名，表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码，统一命名为：ID;如果是自定义的逻辑上的编码则用缩写加"ID"的方法命名。如果键是数字类型，你可以用_NO 作为后缀；如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。<br />
举例：销售订单的编号字段命名：Sal_Ord_ID；如果还存在一个数据库生成的自动编号，则命名为：ID。<br />
2) 所有的属性加上有关类型的后缀，注意，如果还需要其它的后缀，都放在类型后缀之前。<br />
注: 数据类型是文本的字段，类型后缀TX可以不写。有些类型比较明显的字段，可以不写类型后缀。<br />
3) 采用前缀命名<br />
给每个表的列名都采用统一的前缀，那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点，比如破坏了自动表连接工具的作用，后者把公共列名同某些数据库联系起来。</p>
<p>3. 视图的命名<br />
1) 视图以V作为前缀，其他命名规则和表的命名类似；<br />
2) 命名应尽量体现各视图的功能。</p>
<p>4. 触发器的命名<br />
触发器以TR作为前缀，触发器名为相应的表名加上后缀，Insert触发器加'_I'，Delete触发器加'_D'，Update触发器加'_U'，如：TR_Customer_I，TR_Customer_D，TR_Customer_U。</p>
<p>5. 存储过程名<br />
存储过程应以'UP_'开头，和系统的存储过程区分，后续部分主要以动宾形式构成，并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为'UP_Ins_Agent_Account'。</p>
<p>6. 变量名<br />
变量名采用小写，若属于词组形式，用下划线分隔每个单词，如@my_err_no。</p>
<p>7. 命名中其他注意事项 <br />
1) 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29（不包括标识字符@）。<br />
2) 数据对象、变量的命名都采用英文字符，禁止使用中文命名。绝对不要在对象名的字符之间留空格。<br />
3) 小心保留词，要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突<br />
4) 保持字段名和类型的一致性，在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数，那在另一个表里可就别变成字符型了。</p>
<p><br />
&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/143253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-09-06 18:18 <a href="http://www.blogjava.net/libin2722/articles/143253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>