﻿<?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-清睛仪明-文章分类-Oracle</title><link>http://www.blogjava.net/msmary/category/26457.html</link><description>书山有路勤为径，学海无涯苦作舟</description><language>zh-cn</language><lastBuildDate>Fri, 11 Apr 2008 00:04:23 GMT</lastBuildDate><pubDate>Fri, 11 Apr 2008 00:04:23 GMT</pubDate><ttl>60</ttl><item><title>清空临时表空间</title><link>http://www.blogjava.net/msmary/articles/191671.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 09 Apr 2008 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/191671.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/191671.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/191671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/191671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/191671.html</trackback:ping><description><![CDATA[<p>查看临时表空间的数据文件的状态<br />
&nbsp; SELECT FILE#,STATUS FROM V$TEMPFILE<br />
查看临时表空间的大小<br />
&nbsp; SELECT TABLESPACE_NAME,FILE_NAME,<br />
&nbsp;&nbsp;&nbsp; BYTES/1024/1024,USER_BYTES/1024/1024,(BYTES-USER_BYTES)/1024/1024 FROM DBA_TEMP_FILES<br />
查看临时表空间的详细信息<br />
&nbsp; SELECT * FROM DBA_TEMP_FILES <br />
查看表空间的空余大小<br />
&nbsp; SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 MB FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME</p>
<p>清空临时表空间</p>
<p>1.startup --启动数据库</p>
<p>2.创建中转临时表空间&nbsp; <br />
&nbsp; CREATE TEMPORARY TABLESPACE TEMP2<br />
&nbsp;&nbsp;&nbsp; TEMPFILE 'D:\ORACLE\ORADATA\DB\DATAFILE\TEMP_T02.DBF' SIZE 200M</p>
<p>3.改变缺省临时表空间 为刚刚创建的新临时表空间temp2<br />
&nbsp;&nbsp; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;</p>
<p>4.删除原来临时表空间<br />
&nbsp;&nbsp;&nbsp; DROP TABLESPACE TEMP_T INCLUDING CONTENTS AND DATAFILES;</p>
<p>5.重新创建临时表空间<br />
&nbsp; CREATE TEMPORARY TABLESPACE TEMP_T<br />
&nbsp;&nbsp; TEMPFILE 'D:\ORACLE\ORADATA\DB\DATAFILE\TEMP_T011.DBF' SIZE 10M</p>
<p>6.重置缺省临时表空间为新建的temp_t表空间<br />
&nbsp;&nbsp; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP_T;</p>
<p>7.删除中转用临时表空间<br />
&nbsp;&nbsp; DROP TABLESPACE TEMP2 INCLUDING CONTENTS AND DATAFILES;</p>
<p>8.重新指定用户表空间为重建的临时表空间<br />
&nbsp;&nbsp; ALTER USER IDA TEMPORARY TABLESPACE TEMP_T;<br />
</p>
<img src ="http://www.blogjava.net/msmary/aggbug/191671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-04-09 14:53 <a href="http://www.blogjava.net/msmary/articles/191671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 函数应用</title><link>http://www.blogjava.net/msmary/articles/179141.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Sun, 03 Feb 2008 05:42:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/179141.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/179141.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/179141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/179141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/179141.html</trackback:ping><description><![CDATA[<div>
<h1><font size="3">1. nvl( ) 函数</font></h1>
<p><a href="http://jsjzx.yzu.edu.cn/jsjzx/jyn/wtm/vfphelp/lngnvllp_rpx.htm"><font color="#0000ff">示例</font></a> <a href="http://jsjzx.yzu.edu.cn/jsjzx/jyn/wtm/vfphelp/lngnvllp_rpsa.htm"><font color="#0000ff">请参阅</font></a></p>
<p>从两个表达式返回一个非 null 值。<br />
<br />
<strong>语法</strong><br />
<br />
NVL(eExpression1, eExpression2)<br />
<br />
<strong>参数</strong><br />
eExpression1, eExpression2<br />
<br />
如果 eExpression1 的计算结果为 null 值，则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值，则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值，则 NVL( ) 返回 .NULL.。<br />
<br />
<strong>返回值类型</strong><br />
<br />
字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值<br />
<br />
<strong>说明</strong><br />
<br />
在不支持 null 值或 null 值无关紧要的情况下，可以使用 NVL( ) 来移去计算或操作中的 null 值。</p>
<p>select nvl(a.name,'空得') as name from&nbsp;student a join school b on a.ID=b.ID</p>
<p>注意：两个参数得类型要匹配</p>
<p><strong>2.TO_CHAR(date,'format')</strong><br />
SQL&gt; select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;</p>
<p>TO_CHAR(SYSDATE,'YY<br />
-------------------<br />
2004/05/09 21:14:41<br />
<br />
select TO_CHAR(1,'FM09') from dual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result: 01<br />
<br />
</p>
</div>
<img src ="http://www.blogjava.net/msmary/aggbug/179141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-02-03 13:42 <a href="http://www.blogjava.net/msmary/articles/179141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PL/SQL Developer 中文乱码解决</title><link>http://www.blogjava.net/msmary/articles/176948.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 22 Jan 2008 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/176948.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/176948.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/176948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/176948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/176948.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>1。select * from v$nls_parameters<br />
查询nls的参数，获得数据库服务器端的字符编码<br />
NLS_LANGUAGE<br />
NLS_CHARACTERSET<br />
2。修改本地环境变量，设置<br />
NLS_LANG = SIMPLIFIED CHINESE.ZHS16GBK //这个是我们的数据库字符编码</p>
<p>NLS_LANG格式：<br />
NLS_LANG = language_territory.charset<br />
有三个组成部分（语言、地域和字符集），每个成分控制了NLS子集的特性。其中：language 指定服务器消息的语言。<br />
territory 指定服务器的日期和数字格式。<br />
charset 指定字符集 </p>
<p><strong><span style="font-family: 宋体">需要保证要设置客户端字符集与服务器端字符集一致</span></strong> </p>
<img src ="http://www.blogjava.net/msmary/aggbug/176948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-22 10:59 <a href="http://www.blogjava.net/msmary/articles/176948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle学习记录</title><link>http://www.blogjava.net/msmary/articles/176918.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 22 Jan 2008 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/176918.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/176918.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/176918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/176918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/176918.html</trackback:ping><description><![CDATA[<p>1.有关PL/SQL监听器的配置</p>
&nbsp;&nbsp;&nbsp; 监听器一般在下面情况下可以找到相应配置<br />
&nbsp;&nbsp; 如：C:\Oracle\Dev6i\NET80\ADMIN&nbsp;&nbsp; C:\DevSuiteHome_1\NETWORK\ADMIN<br />
&nbsp;其中有三个以ora作为后辍名的文件,分别是 sqlnet.ora、tnsnames.ora、listener.ora;它们的作用分别是:<br />
sqlnet.ora内容大致如下<br />
<p>SQLNET.AUTHENTICATION_SERVICES= (NTS)</p>
<p>NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT, ONAMES, HOSTNAME)<br />
第一行是可以用计算机的名称默认登录，如果你的文件中没有这一行，则不能用计算机名登录，像我们在SQL*PLUS中，可以用这样SQL&gt;sqlplus / as sysdba 方式进行登录，/ 就代表以本机;<br />
第二行就是用数据库的用户名和密码进行登录。<br />
<br />
listener.ora就是你要登录本机数据库时的监听配置，当你要远程登录其它计算机的数据库时这个就不用；有这个你就得开启相应的监听服务程序。<br />
<br />
tnsnames.ora 的配置就是你用像PL/SQL登录数据库时，弹出的登录界面第三行可以选择的数据库名；我们可以在里面写多个连接远程数据库的代码段，当连接远程数据库时就不用开启本机的数据库服务和监听服务<br />
给段代码好明白<br />
<br />
VERSION9 =&nbsp;&nbsp; //自己命名的，显示在登录数据库时可选的数据名<br />
&nbsp; (DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = version9)(PORT = 1521))&nbsp;&nbsp;&nbsp; //host计算机名，port端口号<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = db)&nbsp;&nbsp;&nbsp;&nbsp; //db数据库名<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp; )<br />
<br />
2. Oracle数据导入导出 imp/exp<br />
功能：<a class="keyword" href="http://www.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=Oracle%CA%FD%BE%DD%B5%BC%C8%EB%B5%BC%B3%F6imp%2Fexp">Oracle数据导入导出imp/exp</a>就相当与oracle数据还原与备份。<br />
&nbsp;大多情况都可以用Oracle数据导入导出完成数据的备份和还原（不会造成数据的丢失）。<br />
&nbsp;查询服务器的字符集<br />
select * from nls_database_parameters t where t.parameter = 'NLS_CHARACTERSET'<br />
&nbsp; 如果 value=utf8<br />
&nbsp;&nbsp; 则设置客户端NLS_LANG=AMERICAN_AMERICA.UTF8<br />
&nbsp; 其它的字符集<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AMERICAN_AMERICA.WE8ISO8859P1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIMPLIFIED CHINESE_CHINA.ZHS16GBK</p>
<p>导出:<br />
&nbsp; exp scott/tiger tables=(s_region) file=d:\scott.dmp log=d:\scott.log<br />
导入:<br />
&nbsp;&nbsp;&nbsp; imp scott/tiger file=d:\scott.dmp tables=(s_region) ignore=y<br />
&nbsp;&nbsp;&nbsp; imp userid=dbown/dbown@db file=staff.dmp ignore=y log=staff_imp.log<br />
&nbsp; 我发现没有后面的ignore=y(忽略为yes)导入会有错,在数据库中查不到数据<br />
<br />
3. 管理数据</p>
<p style="text-indent: 2em">/*create index*/
<p style="text-indent: 2em">example:
<p style="text-indent: 2em">/*创建一般索引*/
<p style="text-indent: 2em">create index index_name on table_name(column_name) tablespace tablespace_name;
<p style="text-indent: 2em">/*创建位图索引*/
<p style="text-indent: 2em">create bitmap index index_name on table_name(column_name1,column_name2) tablespace tablespace_name;
<p style="text-indent: 2em">/*索引中不能用pctused*/
<p style="text-indent: 2em">create [bitmap] index index_name on table_name(column_name) tablespace tablespace_name pctfree 20 storage(inital 100k next 100k) ;
<p style="text-indent: 2em">/*大数据量的索引最好不要做日志*/
<p style="text-indent: 2em">create [bitmap] index index_name table_name(column_name1,column_name2) tablespace_name pctfree 20 storage(inital 100k next 100k) nologging;
<p style="text-indent: 2em">/*创建反转索引*/
<p style="text-indent: 2em">create index index_name on table_name(column_name) reverse;
<p style="text-indent: 2em">/*创建函数索引*/
<p style="text-indent: 2em">create index index_name on table_name(function_name(column_name)) tablespace tablespace_name;
<p style="text-indent: 2em">/*建表时创建约束条件*/
<p style="text-indent: 2em">create table user.table_name(column_name number(7) constraint constraint_name primary key deferrable using index storage(initial 100k next 100k) tablespace tablespace_name,column_name2 varchar2(25) constraint constraint_name not null,column_name3 number(7)) tablespace tablespace_name;
<p style="text-indent: 2em">/*给创建bitmap index分配的内存空间参数，以加速建索引*/
<p style="text-indent: 2em">show parameter create_bit;
<p style="text-indent: 2em">/*改变索引的存储参数*/
<p style="text-indent: 2em">alter index index_name pctfree 30 storage(initial 200k next 200k);
<p style="text-indent: 2em">/*给索引手工分配一个分区*/
<p style="text-indent: 2em">alter index index_name allocate extent (size 200k datafile '$ORACLE/oradata/..');
<p style="text-indent: 2em">/*释放索引中没用的空间*/
<p style="text-indent: 2em">alter index index_name deallocate unused;
<p style="text-indent: 2em">/*索引重建*/
<p style="text-indent: 2em">alter index index_name rebuild tablespace tablespace_name;
<p style="text-indent: 2em">/*普通索引和反转索引的互换*/
<p style="text-indent: 2em">alter index index_name rebuild tablespace tablespace_name reverse;
<p style="text-indent: 2em">/*重建索引时，不锁表*/
<p style="text-indent: 2em">alter index index_name rebuild online;
<p style="text-indent: 2em">/*给索引整理碎片*/
<p style="text-indent: 2em">alter index index_name COALESCE;
<p style="text-indent: 2em">/*分析索引,事实上是更新统计的过程*/
<p style="text-indent: 2em">analyze index index_name validate structure;
<p style="text-indent: 2em">desc index_state;
<p style="text-indent: 2em">drop index index_name;
<p style="text-indent: 2em">alter index index_name monitoring usage;-----监视索引是否被用到
<p style="text-indent: 2em">alter index index_name nomonitoring usage;----取消监视
<p style="text-indent: 2em">/*有关索引信息的视图*/
<p style="text-indent: 2em">select * from dba_indexes/dba_ind_columns/dbs_ind_expressions/v$object_usage;
<p style="text-indent: 2em">########## 数据完整性的管理(Maintaining data integrity) ##########
<p style="text-indent: 2em">alter table table_name drop constraint constraint_name;----drop 约束
<p style="text-indent: 2em">alter table table_name add constraint constraint_name primary key(column_name1,column_name2);-----创建主键
<p style="text-indent: 2em">alter table table_name add constraint constraint_name unique(column_name1,column_name2);---创建唯一约束
<p style="text-indent: 2em">/*创建外键约束*/
<p style="text-indent: 2em">alter table table_name add constraint constraint_name foreign key(column_name1) references table_name(column_name1);
<p style="text-indent: 2em">/*不效验老数据，只约束新的数据[enable/disable：约束/不约束新数据;novalidate/validate:不对/对老数据进行验证]*/
<p style="text-indent: 2em">alter table table_name add constraint constraint_name check(column_name like 'B%') enable/disable novalidate/validate;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select 'ALTER TABLE '||TABLE_NAME||' MODIFY CONSTRAINT '||CONSTRAINT_NAME||' ENABLE&nbsp;&nbsp; NOVALIDATE;'<br />
FROM USER_CONSTRAINTS<br />
WHERE TABLE_NAME IN ('STAFFBASE','STAFFCLAIM','STAFFJOB','STAFFPAY','STAFFREF','STAFFTIME','STAFF')<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*修改约束条件，延时验证，commit时验证*/
<p style="text-indent: 2em">alter table table_name modify constraint constraint_name initially deferred;
<p style="text-indent: 2em">/*修改约束条件，立即验证*/
<p style="text-indent: 2em">alter table table_name modify constraint constraint_name initially immediate;
<p style="text-indent: 2em">alter session set constraints=deferred/immediate;
<p style="text-indent: 2em">/*drop一个有外键的主键表,带cascade constraints参数级联删除*/
<p style="text-indent: 2em">drop table table_name cascade constraints;
<p style="text-indent: 2em">/*当truncate外键表时，先将外键设为无效，再truncate;*/
<p style="text-indent: 2em">truncate table table_name;
<p style="text-indent: 2em">/*设约束条件无效*/
<p style="text-indent: 2em">alter table table_name disable constraint constraint_name;
<p style="text-indent: 2em">alter table table_name enable novalidate constraint constraint_name;
<p style="text-indent: 2em">/*将无效约束的数据行放入exception的表中，此表记录了违反数据约束的行的行号；在此之前，要先建exceptions表*/
<p style="text-indent: 2em">alter table table_name add constraint constraint_name check(column_name &gt;;15) enable validate exceptions into exceptions;
<p style="text-indent: 2em">/*运行创建exceptions表的脚本*/
<p style="text-indent: 2em">start $ORACLE_HOME/rdbms/admin/utlexcpt.sql;
<p style="text-indent: 2em">/*获取约束条件信息的表或视图*/
<p style="text-indent: 2em">select * from user_constraints/dba_constraints/dba_cons_columns; <br />
4.Devloper Form 6i 中导入Java类出现 <br />
&nbsp;&nbsp; PDE-UJI002: Unable to find required Java importer classes 问题的解决方案<br />
&nbsp;设置classpath=.;C:\orant\TOOLS\COMMON60\JAVA\IMPORTER.JAR<br />
</p>
<p><br />
5.数据库文件<br />
a.查询数据文件<br />
&nbsp; SELECT * FROM DBA_TABLESPAC<br />
b.查看表空间的空余大小<br />
&nbsp;&nbsp; SELECT TABLESPACE_NAME,SUM(BYTES/1024/1024) MB FROM DBA_FREE_SPACE GROUP BY&nbsp;<br />
TABLESPACE_NAME;<br />
c.&nbsp; 查看数据文件存放路径<br />
&nbsp; SELECT TABLESPACE_NAME,BYTES/1024/1024 FILE_SIZE_MB,FILE_NAME FROM DBA_DATA_FILES;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/msmary/aggbug/176918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-22 10:03 <a href="http://www.blogjava.net/msmary/articles/176918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>listener.ora--sqlnet.ora--tnsnames.ora的关系以及手工配置举例</title><link>http://www.blogjava.net/msmary/articles/174464.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 10 Jan 2008 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/174464.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/174464.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/174464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/174464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/174464.html</trackback:ping><description><![CDATA[以下内容来之Internet，不知道原作者是哪位了，非常感谢作者的总结。<br />
<br />
版权归原作者。<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
最近看到好多人说到tns或者数据库不能登录等问题，就索性总结了下面的文档。<br />
　　<br />
　　首先来说Oracle的网络结构，往复杂处说能加上加密、LDAP等等。。这里不做讨论，重点放在基本的网络结构也就是我们最常用的这种情况<br />
　　<br />
　　三个配置文件<br />
　　<br />
　　listener.ora、sqlnet.ora、tnsnames.ora ，都是放在$ORACLE_HOME\network\admin目录下。<br />
　　<br />
　　重点:三个文件的作用和使用<br />
　　<br />
　　#-----------------------<br />
　　<br />
　　sqlnet.ora-----作用类似于linux或者其他unix的nsswitch.conf文件，通过这个文件来决定怎么样找一个连接中出现的连接字符串，<br />
　　<br />
　　例如我们客户端输入<br />
　　<br />
　　sqlplus sys/oracle@orcl<br />
　　<br />
　　假如我的sqlnet.ora是下面这个样子<br />
　　<br />
　　SQLNET.AUTHENTICATION_SERVICES= (NTS)<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)<br />
　　<br />
　　那么，客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名，通过网络的途径去解析它的ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例，当然我这里orcl并不是一个主机名<br />
　　<br />
　　如果我是这个样子<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (TNSNAMES)<br />
　　<br />
　　那么客户端就只会从tnsnames.ora查找orcl的记录<br />
　　<br />
　　括号中还有其他选项，如LDAP等并不常用。<br />
　　<br />
　　#------------------------<br />
　　<br />
　　Tnsnames.ora------这个文件类似于unix 的<a href="http://www.yesky.com/key/844/5844.html" target="_blank">hosts</a>文件，提供的tnsname到主机名或者ip的对应，只有当sqlnet.ora中类似<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (TNSNAMES) 这样，也就是客户端解析连接字符串的顺序中有TNSNAMES是，才会尝试使用这个文件。<br />
　　<br />
　　例子中有两个，ORCL 对应的本机，SALES对应的另外一个IP地址，里边还定义了使用主用服务器还是共享服务器模式进行连接，一句一句说<br />
　　<br />
　　#你所要连接的时候输入得TNSNAME<br />
　　<br />
　　ORCL =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS_LIST =<br />
　　<br />
　　#下面是这个TNSNAME对应的主机，端口，协议<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　(CONNECT_DATA =<br />
　　<br />
　　#使用专用服务器模式去连接需要跟服务器的模式匹配，如果没有就根据服务器的模式<br />
　　<br />
　　#自动调节<br />
　　<br />
　　(SERVER = DEDICATED)<br />
　　<br />
　　#对应service_name，SQLPLUS&gt;show <a href="http://www.yesky.com/key/567/595567.html" target="_blank">parameter</a> service_name;<br />
　　<br />
　　#进行查看<br />
　　<br />
　　(SERVICE_NAME = orcl)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　#下面这个类似<br />
　　<br />
　　SALES =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS_LIST =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　(CONNECT_DATA =<br />
　　<br />
　　(SERVER = DEDICATED)<br />
　　<br />
　　(SERVICE_NAME = sales)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　#----------------------<br />
　　<br />
　　客户端完了我们来看服务器端<br />
　　<br />
　　listener.ora------listener监听器进程的配置文件<br />
　　<br />
　　关于listener进程就不多说了，接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接，listener进程就不是必需的，同样的如果关闭listener进程并不会影响已经存在的数据库连接。<br />
　　<br />
　　Listener.ora文件的例子<br />
　　<br />
　　#listener.ora Network <a href="http://www.yesky.com/key/3428/8428.html" target="_blank">Configuration</a> File: #E:\oracle\product\10.1.0\Db_2\NETWORK\ADMIN\listener.ora<br />
　　<br />
　　# Generated by Oracle configuration tools.<br />
　　<br />
　　#下面定义LISTENER进程为哪个实例提供服务<br />
　　<br />
　　#这里是ORCL，并且它对应的ORACLE_HOME和GLOBAL_DBNAME<br />
　　<br />
　　#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做数据库连接<br />
　　<br />
　　SID_LIST_LISTENER =<br />
　　<br />
　　(SID_LIST =<br />
　　<br />
　　(SID_DESC =<br />
　　<br />
　　(GLOBAL_DBNAME = boway)<br />
　　<br />
　　(ORACLE_HOME = E:\oracle\product\10.1.0\Db_2)<br />
　　<br />
　　(SID_NAME = ORCL)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　#监听器的名字，一台数据库可以有不止一个监听器<br />
　　<br />
　　#再向下面是监听器监听的协议，ip，端口等，这里使用的tcp1521端口，并且使#用的是主机名<br />
　　<br />
　　LISTENER =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　上面的例子是一个最简单的例子，但也是最普遍的。一个listener进程为一个<a href="http://www.yesky.com/key/464/595464.html" target="_blank">instance</a>(SID)提供服务。<br />
　　<br />
　　监听器的操作命令<br />
　　<br />
　　$ORACLE_HOME/<a href="http://www.yesky.com/key/3442/8442.html" target="_blank">bin</a>/lsnrctl start,其他诸如stop,status等。具体敲完一个lsnrctl后看帮助。<br />
　　<br />
　　上面说到的三个文件都可以通过图形的配置工具来完成配置<br />
　　<br />
　　$ORACLE_HOME/netca 向导形式的<br />
　　<br />
　　$ORACLE_HOME/netmgr<br />
　　<br />
　　本人比较习惯netmgr,<br />
　　<br />
　　profile 配置的是sqlnet.ora也就是名称解析的方式<br />
　　<br />
　　service name 配置的是tnsnames.ora文件<br />
　　<br />
　　listeners配置的是listener.ora文件，即监听器进程<br />
　　<br />
　　具体的配置可以尝试一下然后来看一下配置文件。<br />
　　<br />
　　这样一来总体结构就有了，是当你输入sqlplus sys/oracle@orcl的时候<br />
　　<br />
　　1. 查询sqlnet.ora看看名称的解析方式，发现是TNSNAME<br />
　　<br />
　　2. 则查询tnsnames.ora文件，从里边找orcl的记录，并且找到主机名，端口和service_name<br />
　　<br />
　　3. 如果listener进程没有问题的话，建立与listener进程的连接。<br />
　　<br />
　　4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式，listener采取接下去的动作。默认是专用服务器模式，没有问题的话客户端就连接上了数据库的server process。<br />
　　<br />
　　5. 这时候网络连接已经建立，listener进程的历史使命也就完成了。<br />
<br />
#---------------<br />
　　<br />
　　几种连接用到的命令形式<br />
　　<br />
　　1.sqlplus / as sysdba 这是典型的操作系统认证，不需要listener进程<br />
　　<br />
　　2.sqlplus sys/oracle 这种连接方式只能连接本机数据库，同样不需要listener进程<br />
　　<br />
　　3.sqlplus sys/oracle@orcl 这种方式需要listener进程处于可用状态。最普遍的通过网络连接。<br />
　　<br />
　　以上连接方式使用sys用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态，操作系统认证也不需要数据库可用，普通用户因为是数据库认证，所以数据库必需处于open状态。<br />
　　<br />
　　然后就是<br />
　　<br />
　　#-------------<br />
　　<br />
　　平时排错可能会用到的<br />
　　<br />
　　1.lsnrctl status查看服务器端listener进程的状态<br />
　　<br />
　　LSNRCTL&gt; help<br />
　　<br />
　　The following operations are available<br />
　　<br />
　　An asterisk (*) denotes a modifier or extended command:<br />
　　<br />
　　start stop status<br />
　　<br />
　　services version reload<br />
　　<br />
　　save_config trace change_password<br />
　　<br />
　　quit exit set*<br />
　　<br />
　　show*<br />
　　<br />
　　LSNRCTL&gt; status<br />
　　<br />
　　2.tnsping 查看客户端sqlnet.ora和tnsname.ora文件的配置正确与否，及对应的服务器的listener进程的状态。<br />
　　<br />
　　C:\&gt;tnsping orcl<br />
　　<br />
　　TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 16-8月 -<br />
　　<br />
　　2005 09:36:08<br />
　　<br />
　　Copyright (c) 1997, 2003, Oracle. All rights reserved.<br />
　　<br />
　　Used parameter files:<br />
　　<br />
　　E:\oracle\product\10.1.0\Db_2\network\admin\sqlnet.ora<br />
　　<br />
　　Used TNSNAMES adapter to resolve the alias<br />
　　<br />
　　Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)<br />
　　<br />
　　(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_<br />
　　<br />
　　NAME = orcl)))<br />
　　<br />
　　OK (20 msec)<br />
　　<br />
　　3.<br />
　　<br />
　　SQL&gt;show sga 查看instance是否已经启动<br />
　　<br />
　　SQL&gt; select open_mode from v$database; 查看数据库是打开还是mount状态。<br />
　　<br />
　　OPEN_MODE<br />
　　<br />
　　----------<br />
　　<br />
　　READ WRITE<br />
　　<br />
　　#-----------------<br />
　　<br />
　　使用hostname访问数据库而不是tnsname的例子<br />
　　<br />
　　使用tnsname访问数据库是默认的方式，但是也带来点问题，那就是客户端都是需要配置tnsnames.ora文件的。如果你的数据库服务器地址发生改变，就需要重新编辑客户端这个文件。通过hostname访问数据库就没有了这个麻烦。<br />
　　<br />
　　需要修改<br />
　　<br />
　　服务器端listener.ora<br />
　　<br />
　　#监听器的配置文件listener.ora<br />
　　<br />
　　#使用host naming则不再需要tnsname.ora文件做本地解析<br />
　　<br />
　　# listener.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\listener.ora<br />
　　<br />
　　# Generated by Oracle configuration tools.<br />
　　<br />
　　SID_LIST_LISTENER =<br />
　　<br />
　　(SID_LIST =<br />
　　<br />
　　(SID_DESC =<br />
　　<br />
　　# (SID_NAME = PLSExtProc)<br />
　　<br />
　　(SID_NAME = orcl)<br />
　　<br />
　　(GLOBAL_DBNAME = boway)<br />
　　<br />
　　(ORACLE_HOME = d:\oracle\product\10.1.0\db_1)<br />
　　<br />
　　# (PROGRAM = extproc)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　LISTENER =<br />
　　<br />
　　(DESCRIPTION_LIST =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))<br />
　　<br />
　　)<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　客户端sqlnet.ora 如果确认不会使用TNSNAME访问的话，可以去掉TNSNAMES<br />
　　<br />
　　# sqlnet.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\sqlnet.ora<br />
　　<br />
　　# Generated by Oracle configuration tools.<br />
　　<br />
　　SQLNET.AUTHENTICATION_SERVICES= (NTS)<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (HOSTNAME)<br />
　　<br />
　　Tnsnames.ora文件不需要配置，删除也无所谓。<br />
　　<br />
　　下面就是网络和操作系统的配置问题了，怎么样能够解析我的主机名的问题了<br />
　　<br />
　　可以通过下面的方式连接<br />
　　<br />
　　sqlplus sys/oracle@boway<br />
　　<br />
　　这样的话，会连接boway这台服务器，并且listener来确定你所要连接的service_name。<br />
<img src ="http://www.blogjava.net/msmary/aggbug/174464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-10 22:58 <a href="http://www.blogjava.net/msmary/articles/174464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JasperReports是一个开源的java报表制作引擎</title><link>http://www.blogjava.net/msmary/articles/174260.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 10 Jan 2008 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/174260.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/174260.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/174260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/174260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/174260.html</trackback:ping><description><![CDATA[<div class="blog_content"><span class="hilite1">JasperReports</span>是一个开源的java报表制作引擎<br />
<a href="http://jasperreports.sourceforge.net/" target="_blank">http://<span class="hilite1">jasperreports</span>.sourceforge.net</a><br />
<br />
iReport是<span class="hilite1">JasperReports</span>的一个GUI工具，用来生成<span class="hilite1">JasperReports</span>的jrxml文件。<br />
<a href="http://ireport.sourceforge.net/" target="_blank">http://ireport.sourceforge.net</a><br />
<br />
<br />
<br />
首先使用iReport制作报表的模板（我自己起的名词）：<br />
<br />
&nbsp;&nbsp;&nbsp; 运行iReport，新建一个report。<br />
&nbsp;&nbsp;&nbsp; 在Title band中输入报表的名称，好象使用pageheader band也可以，目前我还没有弄明白2者具体的差别。<br />
&nbsp;&nbsp;&nbsp; 在column header band中放置一些static text，做为报表的列标题。<br />
&nbsp;&nbsp;&nbsp; 在detal band中放入一些textfield，显示报表的详细数据。<br />
&nbsp;&nbsp;&nbsp; 在summary band中放入类似于"合计"之类的textfield，这个band是显示在最后一行数据的下放。<br />
&nbsp;&nbsp;&nbsp; 在LastPageFooter band中放入想在最后一页显示的信息，比如说"审阅人签名"之类的。<br />
<br />
这样报表的框架就基本上搭好了，然后compile一下检查是否有错误，如果没有错误那么就可以在程序中使用这个报表模板了。<br />
<br />
<span class="hilite1">JasperReports</span>介绍：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 使用<span class="hilite1">JasperReports</span>生成报表是非常简单的，仅仅使用net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>包中的几个类即可完成报表的生成、预览、打印、导出等各个功能。<br />
<br />
1.&nbsp; net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperCompileManager类。<br />
&nbsp;&nbsp;&nbsp; 使用这个类的几个静态方法即可完成对报表的编译工作（具体参见api文档）<br />
&nbsp;&nbsp;&nbsp; 编译完成后可以JasperCompileManager有两种处理方式：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 1&gt; 返回一个JasperReport对象<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 2&gt; 在.jrxml文件所在的目录生成一个.jasper文件<br />
&nbsp;&nbsp;&nbsp; 这两种方式是由程序员自己选择的。不过我比较倾向使用.jasper文件，毕竟报表的结构不是每天都在改动，所以每次重新编译报表并不是很划算。<br />
<br />
2.&nbsp; net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperFillManager类<br />
&nbsp;&nbsp;&nbsp; 这个类的作用是用数据填充报表。它可以使用JasperReport对象也可以使用。jasper文件做为报表模板。<br />
&nbsp;&nbsp;&nbsp; 它同样有2中处理方式：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&gt; 返回一个JsaperPrint对象。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 2&gt; 在.jasper文件所在目录生成一个.jrprint文件<br />
&nbsp;&nbsp;&nbsp; 这个类使用net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JRDataSource接口的实现做为数据源。任何实现了JRDataSource的类均可做为数据源使用<br />
&nbsp;&nbsp;&nbsp; 在net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.data包中定义了一些数据源，可根据自己的需要选择。这里我使用的是<font size="+0">JRTableModelDataSource做为<br />
&nbsp;&nbsp;&nbsp; 数据源（因为我的报表还要显示在Table中）。<br />
<br />
3. net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperPrintManager和net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperExportManager<br />
&nbsp;&nbsp; 者两个类的作用是打印、导出报表<br />
&nbsp;&nbsp; 他们使用 JasperPrint 和 .jrprint文件做为输入。<br />
&nbsp;&nbsp; 可以根据自己的需要使用里面的方法。<br />
<br />
</font>例：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; import net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.*;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; import net.sf.<span class="hilite1">jasperreports</span>.view.*;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public class CompileReport {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; //编译report.jrxml并在report.jrxml所在的目录中生成report.jasper文件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; JasperCompileManager.compileReportToFile("report.jrxml");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; //填充数据，这里使用的是JREmptyDataSource<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; JasperFillManager.fillReportToFile("report.jasper", null, new JREmptyDataSource(50));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; //预览报表，false代表不是使用xml文件。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; JasperViewer view = new JasperViewer("reports.jrprint", false);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; view.pack();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; view.setVisible(true);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; e.printStackTrace()<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br />
</div>
<img src ="http://www.blogjava.net/msmary/aggbug/174260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-10 13:43 <a href="http://www.blogjava.net/msmary/articles/174260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 日期函数 </title><link>http://www.blogjava.net/msmary/articles/168612.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 18 Dec 2007 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/168612.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/168612.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/168612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/168612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/168612.html</trackback:ping><description><![CDATA[在oracle数据库的开发中，常因为时间的问题大费周章，所以特地将ORACLE数据的日期函数收藏致此。乃供
<p>他日所查也。<br />
&nbsp; add_months(d,n) 日期d加n个月<br />
&nbsp; last_day(d) 包含d的月?的最后一天的日期<br />
&nbsp; new_time(d,a,b) a?区的日期和??d在b?区的日期和??<br />
&nbsp; next_day(d,day) 比日期d?，由day指定的周几的日期<br />
&nbsp; sysdate 当前的系?日期和??<br />
&nbsp; greatest(d1,d2,...dn) ?出的日期列表中最后的日期<br />
&nbsp; least(d1,k2,...dn) ?出的日期列表中最早的日期<br />
&nbsp; to_char(d [,fmt]) 日期d按fmt指定的格式??成字符串<br />
&nbsp; to_date(st [,fmt]) 字符串st按fmt指定的格式?成日期?，若fmt忽略，st要用缺省格式<br />
&nbsp; round(d [,fmt]) 日期d按fmt指定格式舍入到最近的日期<br />
&nbsp; trunc(d [,fmt]) 日期d按fmt指定格式截断到最近的日期 <br />
&nbsp; to_date 字符串类型转为换日期类型 <br />
字符串中的相应位置上的字符,必须符合时间范围的限制 </p>
<p>查询Oracle日期格式 <br />
----------------------------------</p>
<p><br />
select * from nls_database_parameters; </p>
<p><br />
得到结果如下表: 表中NLS_DATE_FORMAT表示日期格式.<br />
PARAMETER VALUE <br />
----------------------------------- ----------------------------------- <br />
NLS_LANGUAGE AMERICAN <br />
NLS_TERRITORY AMERICA <br />
NLS_CURRENCY $ <br />
NLS_ISO_CURRENCY AMERICA <br />
NLS_NUMERIC_CHARACTERS ., <br />
NLS_CHARACTERSET ZHS16GBK <br />
NLS_CALENDAR GREGORIAN <br />
NLS_DATE_FORMAT DD-MON-RR <br />
NLS_DATE_LANGUAGE AMERICAN <br />
NLS_SORT&nbsp; BINARY <br />
NLS_TIME_FORMAT HH.MI.SSXFF AM <br />
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM <br />
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM <br />
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM <br />
NLS_DUAL_CURRENCY $ <br />
NLS_COMP&nbsp; BINARY <br />
NLS_NCHAR_CHARACTERSET ZHS16GBK <br />
NLS_RDBMS_VERSION 8.1.7.0.0 </p>
<p>或者查询V$NLS_PARAMETERS表,<br />
select * from V$NLS_PARAMETERS;<br />
也有类似结果</p>
<p>SQL&gt;select to_date('2004-11-12 12-07-32','yyyy-mm-dd hh24-mi-ss') value from dual; <br />
VALUE <br />
------------------- <br />
2004.11.12 12:07:32 </p>
<p>SQL&gt;select to_date('20041015') value from dual; <br />
VALUE <br />
------------------- <br />
2004.10.15 00:00:00 </p>
<p>SQL&gt;select to_date('20041315') value from dual; <br />
ERROR 位于第 1 行: <br />
ORA-01861: 文字与格式字符串不匹配 </p>
<p><br />
sysdate 当前日期和时间 </p>
<p>SQL&gt;select sysdate value from dual; <br />
VALUE <br />
------------------- <br />
2003.11.23 17:09:01 </p>
<p><br />
last_day 本月最后一天 </p>
<p>SQL&gt;select last_day(sysdate) value from dual; <br />
VALUE <br />
------------------- <br />
2003.11.30 17:08:17 </p>
<p><br />
add_months(d,n) 日期d后推n个月 </p>
<p>SQL&gt;select add_months(sysdate,2) value from dual; <br />
VALUE <br />
------------------- <br />
2005.01.23 17:10:21 </p>
<p><br />
next_day(d,day) 日期d之后的第一周中,指定的那天(指定星期的第几天)是什么日期 </p>
<p>SQL&gt;select next_day(sysdate,1) value from dual; <br />
VALUE <br />
------------------- <br />
2004.11.28 17:38:55 </p>
<p>&nbsp;</p>
<p><br />
[oracle/plsql]oracle日期处理完全版</p>
<p>日期处理完全版 <br />
TO_DATE格式 <br />
Day: <br />
dd number 12 <br />
dy abbreviated fri <br />
day spelled out friday <br />
ddspth spelled out, ordinal twelfth <br />
Month: <br />
mm number 03 <br />
mon abbreviated mar <br />
month spelled out march <br />
Year: <br />
yy two digits 98 <br />
yyyy four digits 1998 </p>
<p>24小时格式下时间范围为： 0:00:00 - 23:59:59.... <br />
12小时格式下时间范围为： 1:00:00 - 12:59:59 .... <br />
1. <br />
日期和字符转换函数用法（to_date,to_char） </p>
<p>2. <br />
select to_char( to_date(222,'J'),'Jsp') from dual </p>
<p>显示Two Hundred Twenty-Two </p>
<p>3. <br />
求某天是星期几 <br />
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; <br />
星期一 <br />
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from </p>
<p>dual; <br />
monday <br />
设置日期语言 <br />
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; <br />
也可以这样 <br />
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') </p>
<p>4. <br />
两个日期间的天数 <br />
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; </p>
<p>5. 时间为null的用法 <br />
select id, active_date from table1 <br />
UNION <br />
select 1, TO_DATE(null) from dual; </p>
<p>注意要用TO_DATE(null) </p>
<p>6. <br />
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') <br />
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 <br />
所以，当时间需要精确的时候，觉得to_char还是必要的 <br />
7. 日期格式冲突问题 <br />
输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' <br />
alter system set NLS_DATE_LANGUAGE = American <br />
alter session set NLS_DATE_LANGUAGE = American <br />
或者在to_date中写 <br />
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from </p>
<p>dual; <br />
注意我这只是举了NLS_DATE_LANGUAGE，当然还有很多， <br />
可查看 <br />
select * from nls_session_parameters <br />
select * from V$NLS_PARAMETERS </p>
<p>8. <br />
select count(*) <br />
from ( select rownum-1 rnum <br />
from all_objects <br />
where rownum &lt;= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- <br />
02-01','yyyy-mm-dd')+1 <br />
) <br />
where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) <br />
not <br />
in ( '1', '7' ) </p>
<p>查找2002-02-28至2002-02-01间除星期一和七的天数 <br />
在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). </p>
<p>9. <br />
select months_between(to_date('01-31-1999','MM-DD-YYYY'), <br />
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; <br />
1 </p>
<p>select months_between(to_date('02-01-1999','MM-DD-YYYY'), <br />
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; </p>
<p>1.03225806451613 <br />
10. Next_day的用法 <br />
Next_day(date, day) </p>
<p>Monday-Sunday, for format code DAY <br />
Mon-Sun, for format code DY <br />
1-7, for format code D </p>
<p>11 <br />
select to_char(sysdate,'hh:mi:ss') TIME from all_objects <br />
注意：第一条记录的TIME 与最后一行是一样的 <br />
可以建立一个函数来处理这个问题 <br />
create or replace function sys_date return date is <br />
begin <br />
return sysdate; <br />
end; </p>
<p>select to_char(sys_date,'hh:mi:ss') from all_objects; <br />
12. <br />
获得小时数 </p>
<p>SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer <br />
SQL&gt; select sysdate ,to_char(sysdate,'hh') from dual; </p>
<p>SYSDATE TO_CHAR(SYSDATE,'HH') <br />
-------------------- --------------------- <br />
2003-10-13 19:35:21 07 </p>
<p>SQL&gt; select sysdate ,to_char(sysdate,'hh24') from dual; </p>
<p>SYSDATE TO_CHAR(SYSDATE,'HH24') <br />
-------------------- ----------------------- <br />
2003-10-13 19:35:21 19 </p>
<p>获取年月日与此类似 <br />
13. <br />
年月日的处理 <br />
select older_date, <br />
newer_date, <br />
years, <br />
months, <br />
abs( <br />
trunc( <br />
newer_date- <br />
add_months( older_date,years*12+months ) <br />
) <br />
) days <br />
from ( select <br />
trunc(months_between( newer_date, older_date )/12) YEARS, <br />
mod(trunc(months_between( newer_date, older_date )), <br />
12 ) MONTHS, <br />
newer_date, <br />
older_date <br />
from ( select hiredate older_date, <br />
add_months(hiredate,rownum)+rownum newer_date <br />
from emp ) <br />
) </p>
<p>14. <br />
处理月份天数不定的办法 <br />
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual </p>
<p>16. <br />
找出今年的天数 <br />
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual </p>
<p>闰年的处理方法 <br />
to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' ) <br />
如果是28就不是闰年 </p>
<p>17. <br />
yyyy与rrrr的区别 <br />
'YYYY99 TO_C <br />
------- ---- <br />
yyyy 99 0099 <br />
rrrr 99 1999 <br />
yyyy 01 0001 <br />
rrrr 01 2001 </p>
<p>18.不同时区的处理 <br />
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate <br />
from dual; </p>
<p>19. <br />
5秒钟一个间隔 <br />
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') <br />
from dual </p>
<p>2002-11-1 9:55:00 35786 <br />
SSSSS表示5位秒数 </p>
<p>20. <br />
一年的第几天 <br />
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual <br />
310 2002-11-6 10:03:51 </p>
<p>21.计算小时,分,秒,毫秒 <br />
select <br />
Days, <br />
A, <br />
TRUNC(A*24) Hours, <br />
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, <br />
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, <br />
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds <br />
from <br />
( <br />
select <br />
trunc(sysdate) Days, <br />
sysdate - trunc(sysdate) A <br />
from dual <br />
) </p>
<p><br />
select * from tabname <br />
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); </p>
<p>// <br />
floor((date2-date1) /365) 作为年 <br />
floor((date2-date1, 365) /30) 作为月 <br />
mod(mod(date2-date1, 365), 30)作为日. <br />
23.next_day函数 <br />
next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 </p>
<img src ="http://www.blogjava.net/msmary/aggbug/168612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-12-18 23:15 <a href="http://www.blogjava.net/msmary/articles/168612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle开发工具介绍</title><link>http://www.blogjava.net/msmary/articles/168313.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Mon, 17 Dec 2007 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/168313.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/168313.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/168313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/168313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/168313.html</trackback:ping><description><![CDATA[Oracle工具家族手册<br />
　　<img src="http://oracle.chinaitlab.com/imgfiles/2002.12.13.12.5.35.tool.gif"  alt="" /> <br />
　　Oracle Designer<br />
　　一个基于共享信息仓储的建模和生成工具，设计和建立应用与数椐库定义的高效开发环境。<br />
　　Oracle Developer<br />
　　一个用于建立企业级客户/服务器和Web数椐库应用的、易于使用的集成式快速应用开发环（RAD）。<br />
　　Oracle JDeveloper<br />
　　在个利用java来建立基于部件的数椐库应用的最具生产力的开发环境。<br />
　　Oracle Reporls<br />
　　一个用于发布和报告的解决方案，部门可以利用它在其企业内部网或Internet上动态地发布信息。<br />
　　网络计算工具<br />
　　Oracle?的开发工具能为你提供最具生产力的数椐库应用开发环境。这些应用可以部署在可伸缩的专业管理服务器上，并能通过任何一台运行有标准Interner浏览器的PC或NC来访问。<br />
　　高生产力<br />
　　Oracle开发工具利用基于模型的方法设计和实现实际应用，多用户、共享式的Oracle信息仓储为业务、应用模型和规则提供了一个中央存储场地。应用再根椐这些模型自动生成，避免了应用彩不兼容的工具和语言通过手工来编制，造成可重用性低，低质量、高维护的系统。彩业务模型生成的应用，易维护、易调试、高质量，并且可以分布在客户/服务器用网络计算（Interner computing）应用方式下。<br />
　　<br />
　　基于服务器的部署<br />
　　客户/服务器体系结构要求应用安装在第一个卓面机上，这使得安装和管理成本大大的增加。而且，对于网络具有甚高的要求，使通过广域网（WAN）或Internet来使用应用不现实。<br />
　　<br />
　　利用Oracle开发工具所构造的数椐库应用可以部署在伸缩性很强的专业管理应用服务器上，采用基于服务器的部署方式，在服务器上集中管理应用并按需将应用下载到瘦客户机上，从而使上述问题得以圆满解决，无需管理员管理，从而大大降低了成本。任何运行有标准 Internet浏览器的PC或NC都可以访问这些应用，甚至通过非常窄的网络带宽也能顺利进行。<br />
　　<br />
　　充分利用Oracle平台<br />
　　Oracle工具采用了与数椐库相同的语言，它允许对应用进行高效分割和高度，利用Oracle工具构建的应用可以自动且充分地利用网络带宽，能充分利用Oracle企业级平台各级特性，具有较强的可伸缩性、高可靠性。<br />
　　<br />
　　投资保护<br />
　　在进入新一代的计算机环境中手工建立的应用，第一行代码都必须重复开发，以便能从新一代计算环境中完全受益。但使用Oracle的工具对应用进行建模，部门将真正拥挑战性技术。<br />
　　<br />
　　决策支持<br />
　　Oracle的决策支持产品家族全面致力于企业决策支持的需求；从生产报告、特殊查询，直到高层分析，以协同工作的方式可共同创建一个无缝的分析和报告环境，从而对棘手问题给予快速解答。这种集成式解决方案具有超于一般的易用性和无以伦比的性能，而花费和部署方面的成本却被大大的降低。<br />
　　<br />
　　该产品家族包括：<br />
　　<br />
　　　Oracle Reports---企业生产报告工具，IS开发者可用它来建立和开发复杂的高质量报告。<br />
　　<br />
　　 Oracle Discoverer---一个获得了特别奖的查询和分析工具，用于访问数据仓库，数据集市和　　　正在动作的数据库。<br />
　　<br />
　　 Oracle Express---世界上最先进的、面向联机分析处理（OLQP）的计算机引擎和多维数据高速缓存。<br />
　　<br />
　　企业级工具<br />
　　<br />
　　Oracle已经为办公室前台和后台提供了丰富而倍受欢迎的应用，这些应用覆盖了制造业、人力资源、销售部门办公自动化，以及连锁店管理。这种规模和复杂度的应用均需企业级工具。这也正是使用Oracle工具家族全面开发Oracle应用的原由所在。Oracle借助其工具技术 ，为企业提供迁移到客户服务器直到web方式，因此扔有成百甚至上行用户的客户均可以大大降低企业应用的实现、维护和更新成本及其复杂性。<br />
　　<br />
　　集用户所有需求于一体<br />
　　基于Oracle的套件战略，我们正在推出集用户所有需求于一体的解决方案。用户将能获得&#8220;一次到位&#8221;的购买方式的所有益处。<br />
　　<br />
　　所有产品均能保证在一起顺利运用。文件亦能交叉参考的机制，能提供不同产品间的完全兼容。<br />
　　<br />
　　Oracle Enterprise Developer Suite(Oracle企业开发套件)是一项基于模型来进行应用开发的产品套件。这一获奖产品可全面用于建立具有高度伸缩性和高可靠性的企业级数据库客户/服务器应用的web应用。对基于部件的开发Oracle JDeveloper Suite可向你提供建立2层和3层java数据库应用和部件的所有之需。<br />
　　<br />
　　Oracle领导市场新潮流<br />
　　Oracle是当今唯一一个提供适于整个系统生命周期的集成式企业开发工具集的厂商。Oracle工具所拥有的生产力和可伸缩能力已经导致了其在市场上的领导地位。Oracle拥有部署客户机应用、保护当前体系结构投资的独一无二的能力，南昌同时， 它却降低于Interner计算环境的成本，增加了对Internet计算环境可访问性的利益。Oracle工具已经帮助了客户从字符系统转移到客户/服务器架构，而今天已经转移到Internet计算环境之中。Oracle工具必将伴你走向末来。<br />
　　<br />
　　Oracle Developer/2000 <br />
　　Oracle Developer 简 介<br />
　　<br />
　　Oracle Developer/2000可以说是当今最好的开发工具，它以其全中文界面和其易于使用的集成式快速应用开发环境而倍受开发人员的欢迎。<br />
　　Oracle Developer 提 供 有 一 个 集 成 式 工 具 集， 支 持 大 规 模 开 发 活 动 的 生 产 力 需 求。Oracle Developer 支 持 企 业 级 应 用 的 可 伸 缩 需 求， 维 护 不 断 变 化 的 应 用 需 求， 以 及 真 实 环 境 中 的 异 构 性。 简 而 言 之，Oracle Developer 能 够 实 现 了Internet 计 算 环 境 的 种 种 愿 望。<br />
　　<br />
　　生 产 力<br />
　　<br />
　　Oracle Developer 中 纳 入 了 一 个 集 成 式 构 造 器 集 合， 用 于 创 建 表 格、 报 告、 图 表、 查 询、 数 据 库 对 象 和 过 程。 这 些 部 件 使 用 了 强 大 的 说 明 能 力， 允 许 你 直 接 从 数 据 库 定 义 中 创 建 应 用 而 无 需 编 号 任 何 代 码。<br />
　　<br />
　　Oracle Developer 通 过 使 用 快 速 应 用 开 发(RAD) 技 术、 面 向 对 象 技 术， 基 于 计 算 机 的 内 部 学 习， 以 及 统 一 的 客 户、 应 用 服 务 器 和 数 据 库 服 务 器 体 系 结 构， 为 客 户/ 服 务 器 和Web 开 发 建 立 了 新 的 易 于 使 用 的 生 产 力 标 准。<br />
　　<br />
　　组 织 的 开 发 标 准 能 够 轻 易 地 适 用 于 自 定 义 的 应 用 模 和 默 认 的 应 用 对 象 设 置。 为 了 达 到 最 高 的 生 产 力， 开 发 人 员 可 以 从 使 用Oracle Developer 创 建 的 模 型 中 直 接 选 择 以 生 成 完 整 的Oracle Developer 应 用。<br />
　　<br />
　　可 伸 缩 性<br />
　　<br />
　　Oracle Developer 的 嵌 入 式 特 性 允 许 客 户 在10 到1000 个 用 户，MB 到GB 级 数 据， 决 策 支 持 到 复 杂OLTP 应 用 间 自 由 伸 缩。 同 时Oracle Developer 灵 活 的 多 层 体 系 结 构 还 支 持Oracle 应 用 服 务 器 或 第 三 方 应 用 服 务 器， 如TP 还 支 持 监 视 器， 并 因 此 确 保 了 从 桌 面 级 到 专 业 级 的 可 伸 缩 性。<br />
　　<br />
　　开 放 性<br />
　　<br />
　　在Oracle Developer 的 其 他 应 用 和 工 具 间 基 于 标 准 的 交 互 是 建 立 在OCX/ActiveX 控 件，OLE( 对 象 连 接 与 嵌 入) 以 及DDE( 动 态 数 据 交 换) 之 上 的。 通 过 开 放API 对 多 种 多 媒 体 格 式 的 补 充 支 持，Oracle Developer 使 开 发 人 员 能 够 灵 活 地 扩 充 应 用， 并 能 将 其 他 部 件 集 成 在 这 些 应 用 之 中。<br />
　　<br />
　　Oracle Developer 不 仅 向 您 提 供 了 最 优 的Oracle 数 据 库 集 成， 而 且 还 提 供 了 对 所 有 主 流 数 据 库 包 括Oracle Developer Rdb、Microsoft SQL Server、Informix、Sybase 和DB/2 的 透 明 访 问。 对 数 据 库 的 访 问 可 以 通 过 数 据 库 直 接 驱 动 器 以 及 通 过Oracle Developer API 和Oracle Gateways 实 现。<br />
　　<br />
　　Oracle Developer 应 用 可 以 轻 易 地 转 换 和 部 署 在 超 过43 种 语 言 之 上， 它 提 供 了 高 生 产 力、 经 济 实 惠 的 解 决 方 案， 可 以 支 持 和 管 理 表 格、 报 告、 图 形 转 换。 它 允 许 组 织 机 构 同 时 发 行 本 国 和 多 语 种 应 用。 对UNICODE 的 支 持 也 使 得 用 户 能 够 在 同 一 屏 幕 上 显 示 单 字 节 和 多 字 节 语 言。<br />
　　<br />
　　通 过 合 作 伙 伴， 开 放 工 具 创 始 协 会 成 员 的 努 力 我 们 为 第 三 方 产 品 提 供 了 众 多 接 口。 这 些 接 口 包 括 版 本 控 制 和 配 置 管 理 工 具、 测 试 工 具、 压 缩 分 析 和 质 量 控 制 工 具、 迁 移 工 具 以 及 其 他 许 多 种 工 具。<br />
　　<br />
　　Web 事 务<br />
　　<br />
　　今 天， 组 织 机 构 所 需 要 的 是 充 分 利 用Web 的 投 资 及 其 访 问 能 力， 而 同 时 要 保 护 其 在 客 户/ 服 务 器 应 用 上 的 投 资。<br />
　　<br />
　　Oracle Developer Server 满 足 了 这 一 挑 战， 它 能 够 通 过 独 一 无 二 的 技 术 在 单 个 应 用 中 体 现 客 户/ 服 务 器 和Web 的 益 处。Oracle Developer Server 使 用Java 来 提 供 应 用 的 用 户 界 面， 同 时 还 动 用 了Oracle Developer 处 理 引 擎 对 可 伸 缩 应 用 服 务 器 的 强 大 支 持 来 处 理 事 件 和 与 数 据 库 交 互。 结 果， 它 带 来 了 这 样 一 个 好 处， 即 在 任 何 一 个 可 运 行Java 使 能 的Web 浏 览 器 的 瘦 客 户 机 上， 客 户/ 服 务 器 应 用 都 能 以 保 持 不 变 的 姿 态 加 以 运 行， 并 因 此 消 除 了 在 每 个 客 户 机 上 安 装 运 行 时 软 件 或 应 用 软 件 的 需 求。<br />
　　<br />
　　更 进 一 步 的 是， 开 发 人 员 可 以 充 
<img src ="http://www.blogjava.net/msmary/aggbug/168313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-12-17 20:18 <a href="http://www.blogjava.net/msmary/articles/168313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>误删数据库文件的解决之道</title><link>http://www.blogjava.net/msmary/articles/167990.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Sat, 15 Dec 2007 11:26:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/167990.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/167990.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/167990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/167990.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/167990.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上次在数据库服务没有启动的情况下把Oracle数据文件给删除了,那是我在E盘下面建的一个表空间下的多个数据库文件SALES_DATA01,再次启动服务后,用sqlplus / as sysdba登录不上,试了很多办法,才找到一个能登录的办法,就是用sqlplus sys/tanm as sysdba或者sqlplus/nolog&nbsp;&nbsp; conn sys/tanm as sysdba,但是又出现了新的问题,我想把scott用户的权限更改使其能有DBA权限登录,alter user scott account unlock进行解锁,提示database not open数据库不能打开,用select file_name from dba_data_files进行查询,出现错误ERROR at line 1:<br />
ORA-01219: database not open: queries allowed on fixed tables/views only<br />
查了一下资料:(使用了如下段方法)<br />
<pre>SQL&gt; select * from all_users;
select * from all_users
*
ERROR at line 1:
ORA-01219: database not open: queries allowed on fixed
tables/views only
SQL&gt; select status from v$instance;
STATUS
------------
MOUNTED
SQL&gt;
</pre>
<p>To open the database for normal access, we can alter the database again.
<p>
<pre>SQL&gt; alter database open;
Database altered.
</pre>
<p>The shutdown proccess is the simply opposite of the startup.
<p>
<pre>SQL&gt; shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.</pre>
<pre>运行 SQL&gt; alter database open;
ERROR at line 1:<br />
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file<br />
ORA-01110: data file 6: 'E:\SALES_DATA01.DBF'</pre>
<pre>依次使用</pre>
<pre>alter &nbsp; database &nbsp; datafiel &nbsp; 'E:\SALES_DATA01.DBF' &nbsp; offline &nbsp; drop;</pre>
<pre>alter &nbsp; database &nbsp; datafiel &nbsp; 'E:\SALES_DATA02.DBF' &nbsp; offline &nbsp; drop;</pre>
<pre>等方法把数据文件全部脱机删除,再运行SQL&gt;alter database open;就可以了</pre>
<pre>&nbsp;</pre>
<img src ="http://www.blogjava.net/msmary/aggbug/167990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-12-15 19:26 <a href="http://www.blogjava.net/msmary/articles/167990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>exp/imp导出导入工具的使用</title><link>http://www.blogjava.net/msmary/articles/155420.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 23 Oct 2007 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/155420.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/155420.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/155420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/155420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/155420.html</trackback:ping><description><![CDATA[一. 导出工具 exp<br />
<br />
1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin<br />
<br />
&nbsp;&nbsp; exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 它有三种模式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 用户模式： 导出用户所有对象以及对象中的数据；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 表模式： 导出用户所有表或者指定的表；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 整个数据库： 导出数据库中所有对象。<br />
<br />
2. 导出工具exp交互式命令行方式的使用的例子<br />
<br />
$exp test/test123@appdb<br />
Enter array fetch buffer size: 4096 &gt; 回车<br />
Export file: expdat.dmp &gt; m.dmp&nbsp; 生成导出的文件名 <br />
(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U &gt; 3<br />
Export table data (yes/no): yes &gt; 回车<br />
Compress extents (yes/no): yes &gt; 回车<br />
Export done in ZHS16GBK character set and ZHS16GBK NCHAR character set<br />
About to export specified tables via Conventional Path ...<br />
Table(T) or Partition(T:P) to be exported: (RETURN to quit) &gt; cmamenu&nbsp; 要导出的表名<br />
. . exporting table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMAMENU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4336 rows exported<br />
Table(T) or Partition(T:P) to be exported: (RETURN to quit) &gt;要导出的表名n<br />
Table(T) or Partition(T:P) to be exported: (RETURN to quit) &gt; 回车<br />
Export terminated successfully without warnings. <br />
<br />
3. 导出工具exp非交互式命令行方式的例子<br />
<br />
$exp scott/tiger tables=(emp,dept) file=/directory/scott.dmp grants=y <br />
<br />
说明:把scott用户里两个表emp,dept导出到文件/directory/scott.dmp<br />
<br />
$exp scott/tiger tables=emp query=\"where job=\'salesman\' and sal\&lt;1600\" file=/directory/scott2.dmp <br />
<br />
说明:在exp里面加上导出emp的查询条件job='salesman' and sal&lt;1600<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; (但我个人很少这样用,还是把满足条件的记录生成临时表后,再exp会方便一些)<br />
<br />
$exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp filesize=2000M log=/directory2/username_exp.log<br />
<br />
参数文件username.par内容<br />
userid=username/userpassword<br />
buffer=8192000<br />
compress=n<br />
grants=y<br />
<br />
说明:username.par为导出工具exp用的参数文件,里面具体参数可以根据需要去修改<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; filesize指定生成的二进制备份文件的最大字节数<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; (可用来解决某些OS下2G物理文件的限制及加快压缩速度和方便刻历史数据光盘等)<br />
<br />
二.导入工具 imp<br />
<br />
1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin<br />
<br />
imp导入工具将EXP形成的二进制系统文件导入到数据库中.<br />
<br />
&nbsp;&nbsp; 它有三种模式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 用户模式： 导出用户所有对象以及对象中的数据；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 表模式： 导出用户所有表或者指定的表；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 整个数据库： 导出数据库中所有对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 只有拥有IMP_FULL_DATABASE和DBA权限的用户才能做整个数据库导入<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; imp步骤：<br />
&nbsp;&nbsp; (1) create table&nbsp; (2) insert data&nbsp; (3) create index (4) create triggers,constraints<br />
<br />
2.导入工具imp交互式命令行方式的例子<br />
$ imp<br />
Import: Release 8.1.6.0.0 - Production on 星期五 12月 7 17:01:08 2001<br />
(c) Copyright 1999 Oracle Corporation.&nbsp; All rights reserved.<br />
用户名:&nbsp; test<br />
口令:****<br />
连接到: Oracle8i Enterprise Edition Release 8.1.6.0.0 - 64bit Production<br />
With the Partitioning option<br />
JServer Release 8.1.6.0.0 - Production<br />
导入文件: expdat.dmp&gt; /tmp/m.dmp<br />
输入插入缓冲区大小（最小为 8192 ) 30720&gt;<br />
经由常规路径导出由EXPORT:V08.01.06创建的文件<br />
警告: 此对象由 TEST 导出, 而不是当前用户<br />
已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入<br />
只列出导入文件的内容(yes/no)：no&gt;<br />
由于对象已存在, 忽略创建错误(yes/no)：no&gt; yes<br />
导入权限(yes/no)：yes&gt;<br />
导入表数据(yes/no)：yes&gt;<br />
导入整个导出文件(yes/no)：no&gt; yes<br />
. 正在将TEST的对象导入到 SCOTT<br />
. . 正在导入表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "CMAMENU"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4336行被导入<br />
成功终止导入，但出现警告。 <br />
<br />
<br />
3.导入工具imp非交互式命令行方式的例子<br />
<br />
$ imp system/manager fromuser=jones tables=(accts) <br />
$ imp system/manager fromuser=scott tables=(emp,dept) <br />
$ imp system/manager fromuser=scott touser=joe tables=emp <br />
$ imp scott/tiger file = expdat.dmp full=y <br />
$ imp scott/tiger file = /mnt1/t1.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle_backup/log/imp_scott.log<br />
$ imp system/manager parfile=params.dat <br />
params.dat 内容 <br />
file=dba.dmp show=n ignore=n grants=y fromuser=scott tables=(dept,emp) <br />
<br />
4.导入工具imp可能出现的问题<br />
<br />
(1) 数据库对象已经存在<br />
一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等;&nbsp; <br />
数据库对象已经存在, 按缺省的imp参数, 则会导入失败<br />
如果用了参数ignore=y, 会把exp文件内的数据内容导入<br />
如果表有唯一关键字的约束条件, 不合条件将不被导入<br />
如果表没有唯一关键字的约束条件, 将引起记录重复<br />
<br />
(2) 数据库对象有主外键约束<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不符合主外键约束时, 数据会导入失败 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决办法: 先导入主表, 再导入依存表<br />
disable目标导入对象的主外键约束, 导入数据后, 再enable它们<br />
(3)&nbsp; 权限不够<br />
如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限<br />
<br />
(4)&nbsp; 导入大表( 大于80M ) 时, 存储分配失败<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的EXP时, compress = Y, 也就是把所有的数据压缩在一个数据块上.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入时, 如果不存在连续一个大数据块, 则会导入失败.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出80M以上的大表时, 记得compress= N, 则不会引起这种错误.<br />
<br />
(5) imp和exp使用的字符集不同<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果字符集不同, 导入会失败, 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入完成后再改回来.<br />
<br />
(6) imp和exp版本不能往上兼容<br />
imp可以成功导入低版本exp生成的文件, 不能导入高版本exp生成的文件<br />
根据情况我们可以用<br />
$ imp username/password@connect_string<br />
说明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora<br />
&nbsp;&nbsp; 定义的本地或者远端数据库的名称<br />
注意事项:<br />
UNIX: /etc/hosts &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要定义本地或者远端数据库服务器的主机名<br />
win98:&nbsp;&nbsp;&nbsp; windows\hosts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和IP地址的对应关系&nbsp; <br />
<br />
win2000:&nbsp; winnt\system32\drivers\etc\hosts<br />
<img src ="http://www.blogjava.net/msmary/aggbug/155420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-10-23 23:06 <a href="http://www.blogjava.net/msmary/articles/155420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据字典定义</title><link>http://www.blogjava.net/msmary/articles/152183.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 11 Oct 2007 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/152183.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/152183.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/152183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/152183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/152183.html</trackback:ping><description><![CDATA[关于数据字典&nbsp;(转)<br />
<br />
<span style="color: red">1、什么是数据字典(Data Dictionary)？</span> <br />
<p>应该承认，每个人对数据字典的理解有不同的地方，因为并没有这方面的标准，下面是三个大同小异的定义： <br />
</p>
<p>1)数据字典是以数据库中数据基本单元为单位，按一定顺序排列，对其内容作详细说明的数据集。 <br />
2)数据字典中存放着系统中所有数据的定义，即对所有数据库结构的描述。数据字典提供了对数据库数据描述的集中管理手段。 <br />
3_数据字典是一个定义应用程序中使用的所有数据元素和结构的含义、类型、数据大小、格式、度量单位、精度以及允许取值范围的共享仓库。 </p>
<p><br />
<br />
<span style="color: red">2、数据字典的作用是什么？ <br />
</span></p>
<p>确保开发人员使用统一的数据定义； <br />
数据字典中有关系统的详细信息是系统设计、系统实施与维护的重要依据。 <br />
</p>
<p>我印象最深的是，数据字典作为最终文档的一部分提交给用户，用在系统维护中。</p>
<p><br />
<br />
<span style="color: red">3、数据字典用在信息系统分析与设计的哪个阶段？ <br />
</span><br />
不仅在系统的分析与设计过程中有用，而且在实现阶段经常被用来建立数据库。 </p>
<br />
数据字典之定义&nbsp;<br />
<br />
数据库的重要部分是数据字典。它存放有数据库所用的有关信息，对用户来说是一组只读的表。数据字典内容包括：<br />
<br />
数据库中所有模式对象的信息，如表、视图、簇、及索引等。<br />
<br />
分配多少空间，当前使用了多少空间等。<br />
<br />
列的缺省值。<br />
<br />
约束信息的完整性。<br />
<br />
用户的名字。<br />
<br />
用户及角色被授予的权限。<br />
<br />
用户访问或使用的审计信息。<br />
<br />
其它产生的数据库信息。<br />
<br />
数据库数据字典是一组表和视图结构。它们存放在SYSTEM表空间中。<br />
<br />
数据库数据字典不仅是每个数据库的中心。而且对每个用户也是非常重要的信息。用户可以用SQL语句访问数据库数据字典。&nbsp;&nbsp;
<img src ="http://www.blogjava.net/msmary/aggbug/152183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-10-12 00:00 <a href="http://www.blogjava.net/msmary/articles/152183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中的数据字典技术初级入门 </title><link>http://www.blogjava.net/msmary/articles/152179.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 11 Oct 2007 15:25:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/152179.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/152179.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/152179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/152179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/152179.html</trackback:ping><description><![CDATA[数据字典是Oracle存放有关数据库信息的地方，其用途是用来描述数据的。比如一个表的创建者信息，创建时间信息，所属表空间信息，用户访问权限信息等。当用户在对数据库中的数据进行操作时遇到困难就可以访问数据字典来查看详细的信息。<br />
　　<br />
　　Oracle中的数据字典有静态和动态之分。静态数据字典主要是在用户访问数据字典时不会发生改变的，但动态数据字典是依赖数据库运行的性能的，反映数据库运行的一些内在信息，所以在访问这类数据字典时往往不是一成不变的。以下分别就这两类数据字典来论述。<br />
　　<br />
　　<strong>1． 静态数据字典</strong><br />
　　<br />
　　这类数据字典主要是由表和视图组成，应该注意的是，数据字典中的表是不能直接被访问的，但是可以访问数据字典中的视图。静态数据字典中的视图分为三类，它们分别由三个前缀够成：user_*、 all_*、 dba_*。<br />
　　<br />
　　user_*<br />
　　<br />
　　该视图存储了关于当前用户所拥有的对象的信息。（即所有在该用户模式下的对象）<br />
　　<br />
　　all_*<br />
　　<br />
　　该试图存储了当前用户能够访问的对象的信息。（与user_*相比，all_* 并不需要拥有该对象，只需要具有访问该对象的权限即可）<br />
　　<br />
　　dba_*<br />
　　<br />
　　该视图存储了数据库中所有对象的信息。（前提是当前用户具有访问这些数据库的权限，一般来说必须具有管理员权限）<br />
　　<br />
　　从上面的描述可以看出，三者之间存储的数据肯定会有重叠，其实它们除了访问范围的不同以外（因为权限不一样，所以访问对象的范围不一样），其他均具有一致性。具体来说，由于数据字典视图是由SYS（系统用户）所拥有的，所以在却省情况下，只有SYS和拥有DBA系统权限的用户可以看到所有的视图。没有DBA权限的用户只能看到user_*和all_*视。如果没有被授予相关的SELECT权限的话，他们是不能看到 dba_*视图的。<br />
　　<br />
　　由于三者具有相似性，下面以user_为例介绍几个常用的静态视图：<br />
　　<br />
　　user_users视图<br />
　　<br />
　　主要描述当前用户的信息，主要包括当前用户名、帐户id、帐户状态、表空间名、创建时间等。例如执行下列命令即可返回这些信息。<br />
　　select * from user_users<br />
　　<br />
　　user_tables视图<br />
　　<br />
　　主要描述当前用户拥有的所有表的信息，主要包括表名、表空间名、簇名等。通过此视图可以清楚了解当前用户可以操作的表有哪些。执行命令为：select * from user_tables<br />
　　<br />
　　user_objects视图<br />
　　<br />
　　主要描述当前用户拥有的所有对象的信息，对象包括表、视图、存储过程、触发器、包、索引、序列等。该视图比user_tables视图更加全面。例如, 需要获取一个名为&#8220;package1&#8221;的对象类型和其状态的信息，可以执行下面命令：<br />
　　<br />
　　select object_type,status<br />
　　from user_objects<br />
　　where object_name=upper(&#8216;package1&#8217;);<br />
　　<br />
　　这里需注意upper的使用，数据字典里的所有对象均为大写形式，而PL/SQL里不是大小写敏感的，所以在实际操作中一定要注意大小写匹配。<br />
　　<br />
　　user_tab_privs视图<br />
　　<br />
　　该视图主要是存储当前用户下对所有表的权限信息。比如，为了了解当前用户对table1的权限信息，可以执行如下命令：<br />
　　<br />
　　select * from user_tab_privs where table_name=upper('table1')<br />
　　<br />
　　了解了当前用户对该表的权限之后就可以清楚的知道，哪些操作可以执行，哪些操作不能执行。<br />
　　<br />
　　前面的视图均为user_开头的，其实all_开头的也完全是一样的，只是列出来的信息是当前用户可以访问的对象而不是当前用户拥有的对象。对于dba_开头的需要管理员权限，其他用法也完全一样，这里就不再赘述了。<br />
　　<br />
　　<strong>2． 动态数据字典</strong><br />
　　<br />
　　Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图，由于当数据库运行的时候它们会不断进行更新，所以称它们为动态数据字典（或者是动态性能视图）。这些视图提供了关于内存和磁盘的运行情况，所以我们只能对其进行只读访问而不能修改它们。<br />
　　<br />
　　Oracle中这些动态性能视图都是以v$开头的视图，比如v$access。下面就几个主要的动态性能视图进行介绍。<br />
　　<br />
　　v$access<br />
　　<br />
　　该视图显示数据库中锁定的数据库对象以及访问这些对象的会话对象（session对象）。<br />
　　<br />
　　运行如下命令：<br />
　　<br />
　　select * from v$access<br />
　　<br />
　　结果如下：（因记录较多，故这里只是节选了部分记录）<br />
　　<br />
　　SID　　OWNER　　 OBJECT　　　　　　　　　 TYPE<br />
　　27　　 DKH　　　 V$ACCESS　　　　　　　　 CURSOR<br />
　　27　　　PUBLIC　 V$ACCESS　　　　　　　　 SYNONYM<br />
　　27　　　SYS　　　DBMS_APPLICATION_INFO　　PACKAGE<br />
　　27　　　SYS　　　GV$ACCESS　　　　　　　　VIEW<br />
　　<br />
　　v$session<br />
　　<br />
　　该视图列出当前会话的详细信息。由于该视图字段较多，这里就不列详细字段，为了解详细信息，可以直接在sql*plus命令行下键入：desc v$session即可。<br />
　　<br />
　　v$active_instance<br />
　　<br />
　　该视图主要描述当前数据库下的活动的实例的信息。依然可以使用select语句来观察该信息。<br />
　　<br />
　　v$context<br />
　　<br />
　　该视图列出当前会话的属性信息。比如命名空间、属性值等。<br />
　　<br />
　　<strong>3．小结</strong><br />
　　<br />
　　以上是Oracle的数据字典方面的基本内容，还有很多有用视图因为篇幅原因这里不能一一讲解，希望大家在平时使用中多留心。总之，运用好数据字典技术，可以让数据库开发人员能够更好的了解数据库的全貌，这样对于数据库优化、管理等有极大的帮助。
<img src ="http://www.blogjava.net/msmary/aggbug/152179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-10-11 23:25 <a href="http://www.blogjava.net/msmary/articles/152179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计经验谈(转) </title><link>http://www.blogjava.net/msmary/articles/152178.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 11 Oct 2007 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/152178.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/152178.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/152178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/152178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/152178.html</trackback:ping><description><![CDATA[<div style="text-indent: 21pt">一个成功的管理系统，是由：[50% 的业务 + 50% 的软件] 所组成，而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成，数据库设计的好坏是一个关键。如果把企业的数据比做生命所必需的血液，那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋，大学学位课程里也有专门的讲述。不过，就如我们反复强调的那样，再好的老师也比不过经验的教诲。所以我归纳历年来所走的弯路及体会，并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。精选了其中的 60 个最佳技巧，并把这些技巧编写成了本文，为了方便索引其内容划分为 5 个部分：</div>
<div>&nbsp;</div>
<div><strong>第 1 </strong><strong>部分 - </strong><strong>设计数据库之前</strong></div>
<div style="text-indent: 21pt">这一部分罗列了 12 个基本技巧，包括命名规范和明确业务需求等。 </div>
<div><strong>第 2 </strong><strong>部分 - </strong><strong>设计数据库表</strong></div>
<div style="text-indent: 21pt">总共 24 个指南性技巧，涵盖表内字段设计以及应该避免的常见问题等。 </div>
<div><strong>第 3 </strong><strong>部分 - </strong><strong>选择键</strong></div>
<div style="text-indent: 21pt">怎么选择键呢？这里有 10 个技巧专门涉及系统生成的主键的正确用法，还有何 时以及如何索引字段以获得最佳性能等。 </div>
<div><strong>第 4 </strong><strong>部分 - </strong><strong>保证数据完整性</strong></div>
<div style="text-indent: 21pt">讨论如何保持数据库的清晰和健壮，如何把有害数据降低到最小程度。 </div>
<div><strong>第 5 </strong><strong>部分 - </strong><strong>各种小技巧</strong></div>
<div style="text-indent: 21pt">不包括在以上 4 个部分中的其他技巧，五花八门，有了它们希望你的数据库开发工作会更轻松一些。 </div>
<div style="margin: 13pt 0cm"><strong><font size="5">第 1 部分 - 设计数据库之前</font></strong></div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">考察现有环境</font></font></strong></div>
<div style="text-indent: 21pt">在设计一个新数据库时，你不但应该仔细研究业务需求而且还要考察现有的系统。大多数数据库项目都不是从头开始建立的；通常，机构内总会存在用来满足特定需求的现有系统（可能没有实现自动计算）。显然，现有系统并不完美，否则你就不必再建立新系统了。但是对旧系统的研究可以让你发现一些可能会忽略的细微问题。一般来说，考察现有系统对你绝对有好处。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">定义标准的对象命名规范</font></font></strong></div>
<div style="text-indent: 21pt">一定要定义数据库对象的命名规范。对数据库表来说，从项目一开始就要确定表名是采用复数还是单数形式。此外还要给表的别名定义简单规则（比方说，如果表名是一个单词，别名就取单词的前 4 个字母；如果表名是两个单词，就各取两个单词的前两个字母组成 4 个字母长的别名；如果表的名字由 3 个单词组成，你不妨从头两个单词中各取一个然后从最后一个单词中再取出两个字母，结果还是组成 4 字母长的别名，其余依次类推）对工作用表来说，表名可以加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[字段]要针对键采用一整套设计规则。比如，如果键是数字类型，你可以用 _N 作为后缀；如果是字符类型则可以采用 _C 后缀。对列[字段]名应该采用标准的前缀和后缀。再如，假如你的表里有好多&#8220;money&#8221;字段，你不妨给每个列[字段]增加一个 _M 后缀。还有，日期列[字段]最好以 D_ 作为名字打头。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">检查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞糊涂了。假如你坚持统一地命名这些数据库的不同组成部分，至少你应该在这些对象名字的开头用 Table、Query 或者 Report 等前缀加以区别。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">如果采用了 Microsoft Access，你可以用 qry、rpt、tbl 和 mod 等符号来标识对象（比如 tbl_Employees）。我在和 SQL Server 打交道的时候还用过 tbl 来索引表，但我用 sp_company （现在用 sp_feft_）标识存储过程，因为在有的时候如果我发现了更好的处理办法往往会保存好几个拷贝。我在实现 SQL Server 2000 时用 udf_ （或者类似的标记）标识我编写的函数。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">工欲善其事, 必先利其器</font></font></strong></div>
<div style="text-indent: 21pt">采用理想的数据库设计工具，比如：SyBase 公司的 PowerDesign，她支持 PB、VB、Delphe 等语言，通过 ODBC 可以连接市面上流行的 30 多个数据库，包括 dBase、FoxPro、VFP、SQL Server 等，今后有机会我将着重介绍 PowerDesign 的使用。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">获取数据模式资源手册</font></font></strong></div>
<div style="text-indent: 21pt">正在寻求示例模式的人可以阅读《数据模式资源手册》一书，该书由 Len Silverston、W. H. Inmon 和 Kent Graziano 编写，是一本值得拥有的最佳数据建模图书。该书包括的章节涵盖多种数据领域，比如人员、机构和工作效能等。其他的你还可以参考：[1]萨师煊　王珊著　数据库系统概论(第二版)高等教育出版社 1991、[2][美] Steven M.Bobrowski 著 Oracle 7 与客户／服务器计算技术从入门到精通　刘建元等译　电子工业出版社，1996、[3]周中元　信息系统建模方法(下)　电子与信息化　1999年第3期，1999 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">畅想未来，但不可忘了过去的教训</font></font></strong></div>
<div style="text-indent: 21pt">我发现询问用户如何看待未来需求变化非常有用。这样做可以达到两个目的：首先，你可以清楚地了解应用设计在哪个地方应该更具灵活性以及如何避免性能瓶颈；其次，你知道发生事先没有确定的需求变更时用户将和你一样感到吃惊。</div>
<div>&nbsp;</div>
<div>一定要记住过去的经验教训！我们开发人员还应该通过分享自己的体会和经验互相帮助。即使用户认为他们再也不需要什么支持了，我们也应该对他们进行这方面的教育，我们都曾经面临过这样的时刻&#8220;当初要是这么做了该多好..&#8221;。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">在物理实践之前进行逻辑设计</font></font></strong></div>
<div style="text-indent: 21pt">在深入物理设计之前要先进行逻辑设计。随着大量的 CASE 工具不断涌现出来，你的设计也可以达到相当高的逻辑水准，你通常可以从整体上更好地了解数据库设计所需要的方方面面。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">了解你的业务</font></font></strong></div>
<div style="text-indent: 21pt">在你百分百地确定系统从客户角度满足其需求之前不要在你的 ER（实体关系）模式中加入哪怕一个数据表（怎么，你还没有模式？那请你参看技巧 9）。了解你的企业业务可以在以后的开发阶段节约大量的时间。一旦你明确了业务需求，你就可以自己做出许多决策了。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">一旦你认为你已经明确了业务内容，你最好同客户进行一次系统的交流。采用客户的术语并且向他们解释你所想到的和你所听到的。同时还应该用可能、将会和必须等词汇表达出系统的关系基数。这样你就可以让你的客户纠正你自己的理解然后做好下一步的 ER 设计。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">创建数据字典和 ER 图表</font></font></strong></div>
<div style="text-indent: 21pt">一定要花点时间创建 ER 图表和数据字典。其中至少应该包含每个字段的数据类型和在每个表内的主外键。创建 ER 图表和数据字典确实有点费时但对其他开发人员要了解整个设计却是完全必要的。越早创建越能有助于避免今后面临的可能混乱，从而可以让任何了解数据库的人都明确如何从数据库中获得数据。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">有一份诸如 ER 图表等最新文档其重要性如何强调都不过分，这对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对 SQL 表达式的文档化来说这是完全必要的。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">创建模式</font></font></strong></div>
<div style="text-indent: 21pt">一张图表胜过千言万语：开发人员不仅要阅读和实现它，而且还要用它来帮助自己和用户对话。模式有助于提高协作效能，这样在先期的数据库设计中几乎不可能出现大的问题。模式不必弄的很复杂；甚至可以简单到手写在一张纸上就可以了。只是要保证其上的逻辑关系今后能产生效益。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">从输入输出下手</font></font></strong></div>
<div style="text-indent: 21pt">在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。举个简单的例子：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">报表技巧</font></font></strong></div>
<div style="text-indent: 21pt">要了解用户通常是如何报告数据的：批处理还是在线提交报表？时间间隔是每天、每周、每月、每个季度还是每年？如果需要的话还可以考虑创建总结表。系统生成的主键在报表中很难管理。用户在具有系统生成主键的表内用副键进行检索往往会返回许多重复数据。这样的检索性能比较低而且容易引起混乱。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">理解客户需求</font></font></strong></div>
<div style="text-indent: 21pt">看起来这应该是显而易见的事，但需求就是来自客户（这里要从内部和外部客户的角度考虑）。不要依赖用户写下来的需求，真正的需求在客户的脑袋里。你要让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是：&#8220;只有我看见了我才知道我想要的是什么&#8221;必然会导致大量的返工，因为数据库没有达到客户从来没有写下来的需求标准。而更糟的是你对他们需求的解释只属于你自己，而且可能是完全错误的。 </div>
<div style="margin: 13pt 0cm"><strong><font size="5">第 2 部分 - 设计表和字段</font></strong></div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">检查各种变化</font></font></strong></div>
<div style="text-indent: 21pt">我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变更。比方说，姓氏就是如此（注意是西方人的姓氏，比如女性结婚后从夫姓等）。所以，在建立系统存储客户信息时，我倾向于在单独的一个数据表里存储姓氏字段，而且还附加起始日和终止日等字段，这样就可以跟踪这一数据条目的变化。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">采用有意义的字段名</font></font></strong></div>
<div style="text-indent: 21pt">有一回我参加开发过一个项目，其中有从其他程序员那里继承的程序，那个程序员喜欢用屏幕上显示数据指示用语命名字段，这也不赖，但不幸的是，她还喜欢用一些奇怪的命名法，其命名采用了匈牙利命名和控制序号的组合形式，比如 cbo1、txt2、txt2_b 等等。</div>
<div>除非你在使用只面向你的缩写字段名的系统，否则请尽可能地把字段描述的清楚些。当然，也别做过头了，比如 Customer_Shipping_Address_Street_Line_1，虽然很富有说明性，但没人愿意键入这么长的名字，具体尺度就在你的把握中。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">采用前缀命名</font></font></strong></div>
<div style="text-indent: 21pt">如果多个表里有好多同一类型的字段（比如 FirstName），你不妨用特定表的前缀（比如 CusLastName）来帮助你标识字段。</div>
<div>&nbsp;</div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">时效数据</font></font></strong></div>
<div style="text-indent: 21pt">时效性数据应包括&#8220;最近更新日期/时间&#8221;字段。时间标记对查找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有用。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">标准化和数据驱动</font></font></strong></div>
<div style="text-indent: 21pt">数据的标准化不仅方便了自己而且也方便了其他人。比方说，假如你的用户界面要访问外部数据源（文件、XML 文档、其他数据库等），你不妨把相应的连接和路径信息存储在用户界面支持表里。还有，如果用户界面执行工作流之类的任务（发送邮件、打印信笺、修改记录状态等），那么产生工作流的数据也可以存放在数据库里。预先安排总需要付出努力，但如果这些过程采用数据驱动而非硬编码的方式，那么策略变更和维护都会方便得多。事实上，如果过程是数据驱动的，你就可以把相当大的责任推给用户，由用户来维护自己的工作流过程。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">标准化不能过头</font></font></strong></div>
<div style="text-indent: 21pt">对那些不熟悉标准化一词（normalization）的人而言，标准化可以保证表内的字段都是最基础的要素，而这一措施有助于消除数据库中的数据冗余。标准化有好几种形式，但 Third Normal Form（3NF）通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说，3NF 规定：</div>
<div>* 表内的每一个值都只能被表达一次。</div>
<div>* 表内的每一行都应该被唯一的标识（有唯一键）。</div>
<div>* 表内不应该存储依赖于其他键的非键信息。</div>
<div style="text-indent: 21pt">遵守 3NF 标准的数据库具有以下特点：有一组表专门存放通过键连接起来的关联数据。比方说，某个存放客户及其有关定单的 3NF 数据库就可能有两个表：Customer 和 Order。Order 表不包含定单关联客户的任何信息，但表内会存放一个键值，该键指向 Customer 表里包含该客户信息的那一行。</div>
<div style="text-indent: 21pt">更高层次的标准化也有，但更标准是否就一定更好呢？答案是不一定。事实上，对某些项目来说，甚至就连 3NF 都可能给数据库引入太高的复杂性。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">为了效率的缘故，对表不进行标准化有时也是必要的，这样的例子很多。曾经有个开发餐饮分析软件的活就是用非标准化表把查询时间从平均 40 秒降低到了两秒左右。虽然我不得不这么做，但我绝不把数据表的非标准化当作当然的设计理念。而具体的操作不过是一种派生。所以如果表出了问题重新产生非标准化的表是完全可能的。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">Microsoft Visual FoxPro 报表技巧</font></font></strong></div>
<div style="text-indent: 21pt">如果你正在使用 Microsoft Visual FoxPro，你可以用对用户友好的字段名来代替编号的名称：比如用 Customer Name 代替 txtCNaM。这样，当你用向导程序 [Wizards，台湾人称为&#8216;精灵&#8217;] 创建表单和报表时，其名字会让那些不是程序员的人更容易阅读。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">不活跃或者不采用的指示符</font></font></strong></div>
<div style="text-indent: 21pt">增加一个字段表示所在记录是否在业务中不再活跃挺有用的。不管是客户、员工还是其他什么人，这样做都能有助于再运行查询的时候过滤活跃或者不活跃状态。同时还消除了新用户在采用数据时所面临的一些问题，比如，某些记录可能不再为他们所用，再删除的时候可以起到一定的防范作用。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">使用角色实体定义属于某类别的列[字段]</font></font></strong></div>
<div style="text-indent: 21pt">在需要对属于特定类别或者具有特定角色的事物做定义时，可以用角色实体来创建特定的时间关联关系，从而可以实现自我文档化。</div>
<div style="text-indent: 21pt">这里的含义不是让 PERSON 实体带有 Title 字段，而是说，为什么不用 PERSON 实体和 PERSON_TYPE 实体来描述人员呢？比方说，当 John Smith, Engineer 提升为 John Smith, Director 乃至最后爬到 John Smith, CIO 的高位，而所有你要做的不过是改变两个表 PERSON 和 PERSON_TYPE 之间关系的键值，同时增加一个日期/时间字段来知道变化是何时发生的。这样，你的 PERSON_TYPE 表就包含了所有 PERSON 的可能类型，比如 Associate、Engineer、Director、CIO 或者 CEO 等。</div>
<div style="text-indent: 21pt">还有个替代办法就是改变 PERSON 记录来反映新头衔的变化，不过这样一来在时间上无法跟踪个人所处位置的具体时间。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">采用常用实体命名机构数据</font></font></strong></div>
<div style="text-indent: 21pt">组织数据的最简单办法就是采用常用名字，比如：PERSON、ORGANIZATION、ADDRESS 和 PHONE 等等。当你把这些常用的一般名字组合起来或者创建特定的相应副实体时，你就得到了自己用的特殊版本。开始的时候采用一般术语的主要原因在于所有的具体用户都能对抽象事物具体化。</div>
<div style="text-indent: 21pt">有了这些抽象表示，你就可以在第 2 级标识中采用自己的特殊名称，比如，PERSON 可能是 Employee、Spouse、Patient、Client、Customer、Vendor 或者 Teacher 等。同样的，ORGANIZATION 也可能是 MyCompany、MyDepartment、Competitor、Hospital、Warehouse、Government 等。最后 ADDRESS 可以具体为 Site、Location、Home、Work、Client、Vendor、Corporate 和 FieldOffice 等。</div>
<div style="text-indent: 21pt">采用一般抽象术语来标识&#8220;事物&#8221;的类别可以让你在关联数据以满足业务要求方面获得巨大的灵活性，同时这样做还可以显著降低数据存储所需的冗余量。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">用户来自世界各地</font></font></strong></div>
<div style="text-indent: 21pt">在设计用到网络或者具有其他国际特性的数据库时，一定要记住大多数国家都有不同的字段格式，比如邮政编码等，有些国家，比如新西兰就没有邮政编码一说。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">数据重复需要采用分立的数据表</font></font></strong></div>
<div style="text-indent: 21pt">如果你发现自己在重复输入数据，请创建新表和新的关系。 </div>
<div>每个表中都应该添加的 3 个有用的字段</div>
<div>* dRecordCreationDate，在 VB 下默认是 Now()，而在 SQL Server 下默认为 GETDATE()</div>
<div>* sRecordCreator，在 SQL Server 下默认为 NOT NULL DEFAULT USER</div>
<div>* nRecordVersion，记录的版本标记；有助于准确说明记录中出现 null 数据或者丢失数据的原因 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">对地址和电话采用多个字段</font></font></strong></div>
<div style="text-indent: 21pt">描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和 Address_Line3 可以提供更大的灵活性。还有，电话号码和邮件地址最好拥有自己的数据表，其间具有自身的类型和标记类别。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">过分标准化可要小心，这样做可能会导致性能上出现问题。虽然地址和电话表分离通常可以达到最佳状态，但是如果需要经常访问这类信息，或许在其父表中存放&#8220;首选&#8221;信息（比如 Customer 等）更为妥当些。非标准化和加速访问之间的妥协是有一定意义的。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">使用多个名称字段</font></font></strong></div>
<div style="text-indent: 21pt">我觉得很吃惊，许多人在数据库里就给 name 留一个字段。我觉得只有刚入门的开发人员才会这么做，但实际上网上这种做法非常普遍。我建议应该把姓氏和名字当作两个字段来处理，然后在查询的时候再把他们组合起来。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">我最常用的是在同一表中创建一个计算列[字段]，通过它可以自动地连接标准化后的字段，这样数据变动的时候它也跟着变。不过，这样做在采用建模软件时得很机灵才行。总之，采用连接字段的方式可以有效的隔离用户应用和开发人员界面。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">提防大小写混用的对象名和特殊字符</font></font></strong></div>
<div style="text-indent: 21pt">过去最令我恼火的事情之一就是数据库里有大小写混用的对象名，比如 CustomerData。这一问题从 Access 到 Oracle 数据库都存在。我不喜欢采用这种大小写混用的对象命名方法，结果还不得不手工修改名字。想想看，这种数据库/应用程序能混到采用更强大数据库的那一天吗？采用全部大写而且包含下划符的名字具有更好的可读性（CUSTOMER_DATA），绝对不要在对象名的字符之间留空格。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">小心保留词</font></font></strong></div>
<div style="text-indent: 21pt">要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突，比如，最近我编写的一个 ODBC 连接程序里有个表，其中就用了 DESC 作为说明字段名。后果可想而知！DESC 是 DESCENDING 缩写后的保留词。表里的一个 SELECT * 语句倒是能用，但我得到的却是一大堆毫无用处的信息。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">保持字段名和类型的一致性</font></font></strong></div>
<div style="text-indent: 21pt">在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做&#8220;agreement_number&#8221;，你就别在另一个表里把名字改成&#8220;ref1&#8221;。假如数据类型在一个表里是整数，那在另一个表里可就别变成字符型了。记住，你干完自己的活了，其他人还要用你的数据库呢。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">仔细选择数字类型</font></font></strong></div>
<div style="text-indent: 21pt">在 SQL 中使用 smallint 和 tinyint 类型要特别小心，比如，假如你想看看月销售总额，你的总额字段类型是 smallint，那么，如果总额超过了 $32,767 你就不能进行计算操作了。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">删除标记</font></font></strong></div>
<div style="text-indent: 21pt">在表中包含一个&#8220;删除标记&#8221;字段，这样就可以把行标记为删除。在关系数据库里不要单独删除某一行；最好采用清除数据程序而且要仔细维护索引整体性。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">避免使用触发器</font></font></strong></div>
<div style="text-indent: 21pt">触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器，你最好集中对它文档化。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">包含版本机制</font></font></strong></div>
<div style="text-indent: 21pt">建议你在数据库中引入版本控制机制来确定使用中的数据库的版本。无论如何你都要实现这一要求。时间一长，用户的需求总是会改变的。最终可能会要求修改数据库结构。虽然你可以通过检查新字段或者索引来确定数据库结构的版本，但我发现把版本信息直接存放到数据库中不更为方便吗？。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">给文本字段留足余量</font></font></strong></div>
<div style="text-indent: 21pt">ID 类型的文本字段，比如客户 ID 或定单号等等都应该设置得比一般想象更大，因为时间不长你多半就会因为要添加额外的字符而难堪不已。比方说，假设你的客户 ID 为 10 位数长。那你应该把数据库表字段的长度设为 12 或者 13 个字符长。这算浪费空间吗？是有一点，但也没你想象的那么多：一个字段加长 3 个字符在有 1 百万条记录，再加上一点索引的情况下才不过让整个数据库多占据 3MB 的空间。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。身份证的号码从 15 位变成 18 位就是最好和最惨痛的例子。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">列[字段]命名技巧</font></font></strong></div>
<div style="text-indent: 21pt">我们发现，假如你给每个表的列[字段]名都采用统一的前缀，那么在编写 SQL 表达式的时候会得到大大的简化。这样做也确实有缺点，比如破坏了自动表连接工具的作用，后者把公共列[字段]名同某些数据库联系起来，不过就连这些工具有时不也连接错误嘛。举个简单的例子，假设有两个表：</div>
<div>Customer 和 Order。Customer 表的前缀是 cu_，所以该表内的字段名如下：cu_name_id、cu_surname、cu_initials 和cu_address 等。Order 表的前缀是 or_，所以字段名是：</div>
<div>or_order_id、or_cust_name_id、or_quantity 和 or_description 等。</div>
<div>这样从数据库中选出全部数据的 SQL 语句可以写成如下所示：</div>
<div>Select * From Customer, Order Where cu_surname = "MYNAME" ;</div>
<div>and cu_name_id = or_cust_name_id and or_quantity = 1</div>
<div>在没有这些前缀的情况下则写成这个样子（用别名来区分）：</div>
<div>Select * From Customer, Order Where Customer.surname = "MYNAME" ;</div>
<div>and Customer.name_id = Order.cust_name_id and Order.quantity = 1</div>
<div>第 1 个 SQL 语句没少键入多少字符。但如果查询涉及到 5 个表乃至更多的列[字段]你就知道这个技巧多有用了。 </div>
<div style="margin: 13pt 0cm"><strong><font size="5">第 3 部分 - 选择键和索引</font></strong></div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">数据采掘要预先计划</font></font></strong></div>
<div style="text-indent: 21pt">我所在的某一客户部门一度要处理 8 万多份联系方式，同时填写每个客户的必要数据（这绝对不是小活）。我从中还要确定出一组客户作为市场目标。当我从最开始设计表和字段的时候，我试图不在主索引里增加太多的字段以便加快数据库的运行速度。然后我意识到特定的组查询和信息采掘既不准确速度也不快。结果只好在主索引中重建而且合并了数据字段。我发现有一个指示计划相当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢？我可以用传真号码进行检索，但是它几乎就象系统类型一样对我来说并不重要。采用后者作为主字段，数据库更新后重新索引和检索就快多了。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">可操作数据仓库（ODS）和数据仓库（DW）这两种环境下的数据索引是有差别的。在 DW 环境下，你要考虑销售部门是如何组织销售活动的。他们并不是数据库管理员，但是他们确定表内的键信息。这里设计人员或者数据库工作人员应该分析数据库结构从而确定出性能和正确输出之间的最佳条件。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">使用系统生成的主键</font></font></strong></div>
<div style="text-indent: 21pt">这类同技巧 1，但我觉得有必要在这里重复提醒大家。假如你总是在设计数据库的时候采用系统生成的键作为主键，那么你实际控制了数据库的索引完整性。这样，数据库和非人工机制就有效地控制了对存储数据中每一行的访问。</div>
<div style="text-indent: 21pt">采用系统生成键作为主键还有一个优点：当你拥有一致的键结构时，找到逻辑缺陷很容易。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">分解字段用于索引</font></font></strong></div>
<div style="text-indent: 21pt">为了分离命名字段和包含字段以支持用户定义的报表，请考虑分解其他字段（甚至主键）为其组成要素以便用户可以对其进行索引。索引将加快 SQL 和报表生成器脚本的执行速度。比方说，我通常在必须使用 SQL LIKE 表达式的情况下创建报表，因为 case number 字段无法分解为 year、serial number、case type 和 defendant code 等要素。性能也会变坏。假如年度和类型字段可以分解为索引字段那么这些报表运行起来就会快多了。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">键设计 4 原则</font></font></strong></div>
<div>* 为关联字段创建外键。</div>
<div>* 所有的键都必须唯一。</div>
<div>* 避免使用复合键。</div>
<div>* 外键总是关联唯一的键字段。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">别忘了索引</font></font></strong></div>
<div style="text-indent: 21pt">索引是从数据库中获取数据的最高效方式之一。95% 的数据库性能问题都可以采用索引技术得到解决。作为一条规则，我通常对逻辑主键使用唯一的成组索引，对系统键（作为存储过程）采用唯一的非成组索引，对任何外键列[字段]采用非成组索引。不过，索引就象是盐，太多了菜就咸了。你得考虑数据库的空间有多大，表如何进行访问，还有这些访问是否主要用作读写。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">大多数数据库都索引自动创建的主键字段，但是可别忘了索引外键，它们也是经常使用的键，比如运行查询显示主表和所有关联表的某条记录就用得上。还有，不要索引 memo/note 字段，不要索引大型字段（有很多字符），这样作会让索引占用太多的存储空间。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">不要索引常用的小型表</font></font></strong></div>
<div style="text-indent: 21pt">不要为小型数据表设置任何键，假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">不要把社会保障号码（SSN）或身份证号码（ID）选作键</font></font></strong></div>
<div style="text-indent: 21pt">永远都不要使用 SSN 或 ID 作为数据库的键。除了隐私原因以外，须知政府越来越趋向于不准许把 SSN 或 ID 用作除收入相关以外的其他目的，SSN 或 ID 需要手工输入。永远不要使用手工输入的键作为主键，因为一旦你输入错误，你唯一能做的就是删除整个记录然后从头开始。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">我在破解他人的程序时候，我看到很多人把 SSN 或 ID 还曾被用做系列号，当然尽管这么做是非法的。而且人们也都知道这是非法的，但他们已经习惯了。后来，随着盗取身份犯罪案件的增加，我现在的同行正痛苦地从一大摊子数据中把 SSN 或 ID 删除。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">不要用用户的键</font></font></strong></div>
<div style="text-indent: 21pt">在确定采用什么字段作为表的键的时候，可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。这样做会迫使你采取以下两个措施：</div>
<div style="text-indent: 21pt">* 在创建记录之后对用户编辑字段的行为施加限制。假如你这么做了，你可能会发现你的应用程序在商务需求突然发生变化，而用户需要编辑那些不可编辑的字段时缺乏足够的灵活性。当用户在输入数据之后直到保存记录才发现系统出了问题他们该怎么想？删除重建？假如记录不可重建是否让用户走开？</div>
<div style="text-indent: 21pt">* 提出一些检测和纠正键冲突的方法。通常，费点精力也就搞定了，但是从性能上来看这样做的代价就比较大了。还有，键的纠正可能会迫使你突破你的数据和商业/用户界面层之间的隔离。</div>
<div>所以还是重提一句老话：你的设计要适应用户而不是让用户来适应你的设计。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">不让主键具有可更新性的原因是在关系模式下，主键实现了不同表之间的关联。比如，Customer 表有一个主键 CustomerID，而客户的定单则存放在另一个表里。Order 表的主键可能是 OrderNo 或者 OrderNo、CustomerID 和日期的组合。不管你选择哪种键设置，你都需要在 Order 表中存放 CustomerID 来保证你可以给下定单的用户找到其定单记录。</div>
<div style="text-indent: 21pt">假如你在 Customer 表里修改了 CustomerID，那么你必须找出 Order 表中的所有相关记录对其进行修改。否则，有些定单就会不属于任何客户——数据库的完整性就算完蛋了。</div>
<div>如果索引完整性规则施加到表一级，那么在不编写大量代码和附加删除记录的情况下几乎不可能改变某一条记录的键和数据库内所有关联的记录。而这一过程往往错误丛生所以应该尽量避免。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">可选键(候选键)有时可做主键</font></font></strong></div>
<div style="text-indent: 21pt">记住，查询数据的不是机器而是人。</div>
<div style="text-indent: 21pt">假如你有可选键，你可能进一步把它用做主键。那样的话，你就拥有了建立强大索引的能力。这样可以阻止使用数据库的人不得不连接数据库从而恰当的过滤数据。在严格控制域表的数据库上，这种负载是比较醒目的。如果可选键真正有用，那就是达到了主键的水准。</div>
<div>我的看法是，假如你有可选键，比如国家表内的 state_code，你不要在现有不能变动的唯一键上创建后续的键。你要做的无非是创建毫无价值的数据。如你因为过度使用表的后续键[别名]建立这种表的关联，操作负载真得需要考虑一下了。 </div>
<div>别忘了外键</div>
<div>大多数数据库索引自动创建的主键字段。但别忘了索引外键字段，它们在你想查询主表中的记录及其关联记录时每次都会用到。还有，不要索引 memo/notes 字段而且不要索引大型文本字段（许多字符），这样做会让你的索引占据大量的数据库空间。 </div>
<div style="margin: 13pt 0cm"><strong><font size="5">第 4 部分 - 保证数据的完整性</font></strong></div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">用约束而非商务规则强制数据完整性</font></font></strong></div>
<div style="text-indent: 21pt">如果你按照商务规则来处理需求，那么你应当检查商务层次/用户界面：如果商务规则以后发生变化，那么只需要进行更新即可。假如需求源于维护数据完整性的需要，那么在数据库层面上需要施加限制条件。如果你在数据层确实采用了约束，你要保证有办法把更新不能通过约束检查的原因采用用户理解的语言通知用户界面。除非你的字段命名很冗长，否则字段名本身还不够。</div>
<div>&nbsp;</div>
<div style="text-indent: 21pt">只要有可能，请采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性；它不能保证表之间（外键）的完整性所以不能强加于其他完整性规则之上。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">分布式数据系统</font></font></strong></div>
<div style="text-indent: 21pt">对分布式系统而言，在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该估计一下未来 5 年或者 10 年的数据量。当你把数据传送到其他站点的时候，最好在数据库字段中设置一些标记。在目的站点收到你的数据之后更新你的标记。为了进行这种数据传输，请写下你自己的批处理或者调度程序以特定时间间隔运行而不要让用户在每天的工作后传输数据。本地拷贝你的维护数据，比如计算常数和利息率等，设置版本号保证数据在每个站点都完全一致。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">强制指示完整性(参照完整性?)</font></font></strong></div>
<div style="text-indent: 21pt">没有好办法能在有害数据进入数据库之后消除它，所以你应该在它进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">关系</font></font></strong></div>
<div style="text-indent: 21pt">如果两个实体之间存在多对一关系，而且还有可能转化为多对多关系，那么你最好一开始就设置成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">采用视图</font></font></strong></div>
<div style="text-indent: 21pt">为了在你的数据库和你的应用程序代码之间提供另一层抽象，你可以为你的应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">给数据保有和恢复制定计划</font></font></strong></div>
<div style="text-indent: 21pt">考虑数据保有策略并包含在设计过程中，预先设计你的数据恢复过程。采用可以发布给用户/开发人员的数据字典实现方便的数据识别同时保证对数据源文档化。编写在线更新来&#8220;更新查询&#8221;供以后万一数据丢失可以重新处理更新。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">用存储过程让系统做重活</font></font></strong></div>
<div style="text-indent: 21pt">解决了许多麻烦来产生一个具有高度完整性的数据库解决方案之后，我决定封装一些关联表的功能组，提供一整套常规的存储过程来访问各组以便加快速度和简化客户程序代码的开发。数据库不只是一个存放数据的地方，它也是简化编码之地。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">使用查找</font></font></strong></div>
<div style="text-indent: 21pt">控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找：国家代码、状态代码等。 </div>
<div style="margin: 13pt 0cm"><strong><font size="5">第 5 部分 - 各种小技巧</font></strong></div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">文档、文档、文档</font></font></strong></div>
<div>对所有的快捷方式、命名规范、限制和函数都要编制文档。</div>
<div>&nbsp;</div>
<div>采用给表、列[字段]、触发器等加注释的数据库工具。是的，这有点费事，但从长远来看，这样做对开发、支持和跟踪修改非常有用。</div>
<div>&nbsp;</div>
<div>取决于你使用的数据库系统，可能有一些软件会给你一些供你很快上手的文档。你可能希望先开始在说，然后获得越来越多的细节。或者你可能希望周期性的预排，在输入新数据同时随着你的进展对每一部分细节化。不管你选择哪种方式，总要对你的数据库文档化，或者在数据库自身的内部或者单独建立文档。这样，当你过了一年多时间后再回过头来做第 2 个版本，你犯错的机会将大大减少。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">使用常用英语（或者其他任何语言）而不要使用编码</font></font></strong></div>
<div style="text-indent: 21pt">为什么我们经常采用编码（比如 9935A 可能是&#8216;青岛啤酒&#8217;的供应代码，4XF788-Q 可能是帐目编码）？理由很多。但是用户通常都用英语进行思考而不是编码。工作 5 年的会计或许知道 4XF788-Q 是什么东西，但新来的可就不一定了。在创建下拉菜单、列表、报表时最好按照英语名排序。假如你需要编码，那你可以在编码旁附上用户知道的英语。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">保存常用信息</font></font></strong></div>
<div style="text-indent: 21pt">让一个表专门存放一般数据库信息非常有用。我常在这个表里存放数据库当前版本、最近检查/修复（对 FoxPro）、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库，当客户抱怨他们的数据库没有达到希望的要求而与你联系时，这样做对非客户机/服务器环境特别有用。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">测试、测试、反复测试</font></font></strong></div>
<div style="text-indent: 21pt">建立或者修订数据库之后，必须用用户新输入的数据测试数据字段。最重要的是，让用户进行测试并且同用户一道保证你选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">检查设计</font></font></strong></div>
<div style="text-indent: 21pt">在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说，针对每一种最终表达数据的原型应用，保证你检查了数据模型并且查看如何取出数据。 </div>
<div style="margin: 13pt 0cm"><strong><font size="4"><font size="5">Microsoft Visual FoxPro 设计技巧</font></font></strong></div>
<div style="text-indent: 21pt">对复杂的 Microsoft Visual FoxPro 数据库应用程序而言，可以把所有的主表放在一个数据库容器文件里，然后增加其他数据库表文件和装载同原有数据库有关的特殊文件。根据需要用这些文件连接到主文件中的主表。比如数据输入、数据索引、统计分析、向管理层或者政府部门提供报表以及各类只读查询等。这一措施简化了用户和组权限的分配，而且有利于应用程序函数（存储过程）的分组和划分，从而在程序必须修改的时候易于管理。 <br />
<br />
</div>
<img src ="http://www.blogjava.net/msmary/aggbug/152178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-10-11 23:22 <a href="http://www.blogjava.net/msmary/articles/152178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解什么是数据字典</title><link>http://www.blogjava.net/msmary/articles/152177.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 11 Oct 2007 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/152177.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/152177.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/152177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/152177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/152177.html</trackback:ping><description><![CDATA[<p>每个Oracle数据库包括一个被称为&#8220;元数据&#8221;的集合，或者说包含用来描述数据库有关数据结构的数据。包含这些元数据的表和视图称为Oracle数据字典。 &nbsp; <br />
&nbsp; 数据字典中有前缀V$或GV$的表是动态表，它们会不断更新以反映出Oracle数据库当前的状态。静态数据字典表都有一个形如DBA_、ALL_或USER_的前缀，表示该视图中列出的对象范围。 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 数据库组件　　　　　　数据库字典中的表和视图 &nbsp; <br />
&nbsp; 数据库　　　　　　　　V$DATABASE &nbsp; <br />
&nbsp; 表空间　　　　　　　　DBA_TABLESPACE，DBA_DATA_FILES， &nbsp; <br />
&nbsp; 　　　　　　　　　　　DBA_FREE_SPACE &nbsp; <br />
&nbsp; 控制文件　　　　　　　V$CONTROLFILE，V$PARAMETER， &nbsp; <br />
&nbsp; 　　　　　　　　　　　V$CONTROLFILE_RECORD_SECTION &nbsp; <br />
&nbsp; 数据文件　　　　　　　V$DATAFILE，V$DATAFILE_HEADER，V$FILESTAT， &nbsp; <br />
&nbsp; 　　　　　　　　　　　DBA_DATA_FILES &nbsp; <br />
&nbsp; 段　　　　　　　　　　DBA_SEGMENTS &nbsp; <br />
&nbsp; 数据范围　　　　　　　DBA_EXTENTS &nbsp; <br />
&nbsp; 日志线程、日志组和　　V$THREAD，V$LOG，V$LOGFILE &nbsp; <br />
&nbsp; 日志序列号 &nbsp; <br />
&nbsp; 归档状态　　　　　　　V$DATABASE，V$LOG，V$ARCHIVED_LOG， &nbsp; <br />
&nbsp; 　　　　　　　　　　　V$ARCHIVE_DEST &nbsp; <br />
&nbsp; 数据库实例　　　　　　V$INSTANCE，V$PARAMETER， &nbsp; <br />
&nbsp; 　　　　　　　　　　　V$SYSTEM_PARAMETER &nbsp; <br />
&nbsp; 内存结构　　　　　　　V$SGA，V$SGASTAT，V$DB_OBJECT_CACHE，V$SQL， &nbsp; <br />
&nbsp; 　　　　　　　　　　　V$SQLTEXT，V$SQLAREA &nbsp; <br />
&nbsp; 后台进程　　　　　　　V$BGPROCESS，V$SESSION</p>
<p>-----------------------------------------------------------------------------</p>
<p>数据字典就是一个用描述数据库中表的字段名,字段长度,字段说明等信息的文挡;<br />
--------------------------<br />
数据词典是对数据库里字段的一种描述，说明<br />
--------------------------<br />
数据<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key1" onmouseover="kwE(event,1, this);" style="color: #6600ff; border-bottom: 0px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">字典</nobr>就是存储数据库中基本元素的一个集合！它可以存储基本表的数据结构，存储过程，等等...<br />
-------------------------<br />
数据字典是一张表,记录某些<nobr oncontextmenu="return false;" onmousemove="kwM(4);" id="key4" onmouseover="kwE(event,4, this);" style="color: #6600ff; border-bottom: 0px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">数据</nobr>库的信息<br />
-------------------------<br />
</p>
<p><nobr oncontextmenu="return false;" onmousemove="kwM(0);" id="key0" onmouseover="kwE(event,0, this);" style="color: #6600ff; border-bottom: 0px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">数据</nobr>字典都包括些什么东西？格式怎么样子的？ &nbsp; <br />
&nbsp; 最好能给个实例 <span>问题点数：20、回复次数：4</span><a href="http://topic.csdn.net/t/20050708/14/4131742.html#">Top</a> </p>
<div class="tagad">&nbsp;</div>
<h3><strong><a class="anchor" name="r_30443120">1 楼</a>summerICEREDTEA（从基础学起）<input class="user4" title="四级用户 该版得分小于等于2000分，大于1000分" type="button" /></strong><span>回复于 2005-07-08 14:54:29 得分 <em>5</em></span></h3>
<p>use &nbsp; northwind &nbsp; <br />
&nbsp; go &nbsp; <br />
&nbsp; select &nbsp; name &nbsp; from &nbsp; sysobjects &nbsp; where &nbsp; xtype &nbsp; = &nbsp; 'u'<a href="http://topic.csdn.net/t/20050708/14/4131742.html#">Top</a></p>
<h3><strong><a class="anchor" name="r_30447472">2 楼</a>phantomMan（）<input class="star1" title="一星用户 该版得分小于等于10000分，大于5000分" type="button" /></strong><span>回复于 2005-07-08 17:26:53 得分 <em>5</em></span></h3>
<p>数据<nobr oncontextmenu="return false;" onmousemove="kwM(4);" id="key4" onmouseover="kwE(event,4, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">字典</nobr> &nbsp; (data &nbsp; dictionary) &nbsp; &nbsp; <br />
&nbsp; 存储在目录中的一组<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key1" onmouseover="kwE(event,1, this);" style="color: #6600ff; border-bottom: 0px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">系统</nobr>表，包括数据库结构和相关信息的定义（如权限）。 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 数据字典分为两种: &nbsp; <br />
&nbsp; 一位DBMS里面的 &nbsp; 向SQL &nbsp; 中的某些 &nbsp; sys表 &nbsp; 里面记录着系统字段的定义关系 &nbsp; 触发器 &nbsp; 视图 &nbsp; 存储过程&#8230;&#8230; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 二为 &nbsp; <nobr oncontextmenu="return false;" onmousemove="kwM(2);" id="key2" onmouseover="kwE(event,2, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">用户</nobr>的数据字典 &nbsp; 相当于在系统的上面进行加工 &nbsp; 用与对用户对象进行描述和管理等等 &nbsp; <br />
&nbsp; <a href="http://topic.csdn.net/t/20050708/14/4131742.html#">Top</a></p>
<h3><strong><a class="anchor" name="r_30448703">3 楼</a>bugchen888（臭虫）<input class="star1" title="一星用户 该版得分小于等于10000分，大于5000分" type="button" /></strong><span>回复于 2005-07-08 18:31:58 得分 <em>5</em></span></h3>
<p>对数据库中各种对象的<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">信息</nobr>，如 &nbsp; <br />
&nbsp; dbo.syscolumns 记录table中列、存储过程中的参数、index中的列 &nbsp; <br />
&nbsp; dbo.syscomments 记录存储过程、视图等的创建语句 &nbsp; <br />
&nbsp; dbo.sysdepends 记录对象之间的依赖关系 &nbsp; <br />
&nbsp; dbo.sysfilegroups &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录文件组的信息 &nbsp; <br />
&nbsp; dbo.sysfiles 记录数据文件的信息 &nbsp; <br />
&nbsp; dbo.sysfiles1 。。。。。 &nbsp; <br />
&nbsp; dbo.sysforeignkeys &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录外键的信息 &nbsp; <br />
&nbsp; dbo.sysfulltextcatalogs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录全文索引的信息 &nbsp; <br />
&nbsp; dbo.sysfulltextnotify &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 。。。。。 &nbsp; <br />
&nbsp; dbo.sysindexes 记录索引和相关table的信息 &nbsp; <br />
&nbsp; dbo.sysindexkeys &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 。。。。。 &nbsp; <br />
&nbsp; dbo.sysmembers 。。。。。 &nbsp; <br />
&nbsp; dbo.sysobjects 记录所有数据库对象 &nbsp; <br />
&nbsp; dbo.syspermissions &nbsp; <br />
&nbsp; dbo.sysproperties &nbsp; <br />
&nbsp; dbo.sysprotects &nbsp; <br />
&nbsp; dbo.sysreferences &nbsp; <br />
&nbsp; dbo.systypes 记录数据库中所有数据类型的信息 &nbsp; <br />
&nbsp; dbo.sysusers 记录数据库中所有用户的信息<a href="http://topic.csdn.net/t/20050708/14/4131742.html#">Top</a></p>
<h3><strong><a class="anchor" name="r_30448730">4 楼</a>bugchen888（臭虫）<input class="star1" title="一星用户 该版得分小于等于10000分，大于5000分" type="button" /></strong><span>回复于 2005-07-08 18:34:45 得分 <em>5</em></span></h3>
<p>详细的格式和含义可以看帮助文件中的：T-SQL参考----系统表 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 如： &nbsp; <br />
&nbsp; syscolumns &nbsp; <br />
&nbsp; 每个表和视图中的每列在表中占一行，存储过程中的每个参数在表中也占一行。该表位于每个数据库中。&nbsp;&nbsp; <br />
<br />
Oracle 高级编程<br />
</p>
<p style="text-indent: 21pt; line-height: 15pt">实际上，您希望知道的关于Oracle数据库的各种信息都可以通过参考数据字典而得到。本章从概念的角度思考数据字典，然后，再研究其结构及内容。最后，通过讨论当在Oracle环境中进行编程的时候，您是否可以利用数据字典作为结束。</p>
<p style="text-indent: 21pt; line-height: 15pt">如果已经使用了另外的关系型数据库管理系统，您或许会发现对数据字典概念性的描述已经非常熟悉了。换而言之，如果在编程过程中，始终带有文件系统，我们希望您会发现概念性的讨论是新的，并且是很有启发的。</p>
<h3>6.1 &nbsp;数据字典的概念</h3>
<p style="text-indent: 20.6pt; line-height: 15pt">每个编程环境都有两个基本成分：程序逻辑—— 程序需要进行的工作说明—— 及数据。可以在程序内部，或者持久稳固地在外部以变量的方式临时保存数据，如文件或者数据库中。传统的文件结构需要开发员进行理解，然后描述文件结构，以使程序可以适当地访问，并且处理文件的字段或者记录。但是，在Oracle关系型数据库内部，整个数据库结构(包括它的表、视图、索引、用户、安全规则等)存储在一组特殊的表及视图中，称其为数据字典。</p>
<p style="text-indent: 21pt">Oracle数据字典由特殊的用户账户所拥有，称其为SYS。SYS账户与Unix系统的根超级用户是一样的。通常开发员将永远不需要与共享数据库进行连接，作为特权账户。甚至不鼓励数据库管理员使用SYS账户进行任何工作，但是仅有很少的操作需要该等级的能力。如果您既是开发人员，又是DBA，或许在Oracle数据库的个人复制上，需要理解当作为SYS进行连接的时候，进行交互式的工作的潜在危机。</p>
<p style="text-indent: 21pt; line-height: 15pt">另外一个关于Oracle数据字典的普通条目将它的表存储在一些特殊的表空间(如SYSTEM以及SYSAUX)中。在这些特殊的表空间中，永远不创建其他的应用程序数据库对象。</p>
<p style="text-indent: 21pt">Oracle数据字典的关键在于可以使用相同的SQL语言，在数据库内部访问应用程序的数据结构，对其进行访问。通常，直接地访问字典限于SELECT语句(永远不针对字典对象发布INSERT、UPDATE或者DELETE语句)。通过特殊的SQL语句间接地修改数据字典，通常称其为数据处理语言(DML)命令。DML语句，如CREATE TABLE、DROP INDEX、GRANT等，需要特殊的许可。它们通常由开发机构中的DBA来执行，该机构在DBA及开发人员之间进行责任分配。为了建立并且维护自己的数据库环境，独立地进行工作的学生或者开发人员将必须学习SLQ DML命令。</p>
<img src ="http://www.blogjava.net/msmary/aggbug/152177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-10-11 23:19 <a href="http://www.blogjava.net/msmary/articles/152177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用SQL*Loader将Excel数据导出到Oracle</title><link>http://www.blogjava.net/msmary/articles/151862.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 10 Oct 2007 12:43:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/151862.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/151862.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/151862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/151862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/151862.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt"><span style="font-family: 宋体">&nbsp; </span></span>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">实现目的：往</span><span style="color: #323432; font-family: Verdana">oracle</span><span style="color: #323432; font-family: 宋体">数据库中，插入</span><span style="color: #323432; font-family: Verdana">excel</span><span style="color: #323432; font-family: 宋体">文件中的数据</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="color: #323432; font-family: 宋体"><span style="font-size: 12pt"><span style="font-family: 宋体">实现步骤：</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">1</span><span style="color: #323432; font-family: 宋体">、打开</span><span style="color: #323432; font-family: Verdana">MicroSoft Excel 2000 </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">2</span><span style="color: #323432; font-family: 宋体">、文件</span><span style="color: #323432; font-family: Verdana">(F)</span><span style="color: #323432; font-family: 宋体">&#8594;</span><span style="color: #323432; font-family: 宋体">新建</span><span style="color: #323432; font-family: Verdana">(N)</span><span style="color: #323432; font-family: 宋体">&#8594;</span><span style="color: #323432; font-family: 宋体">工作簿</span><span style="color: #323432; font-family: 宋体">&#8594;</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">3</span><span style="color: #323432; font-family: 宋体">、输入数据后，存盘为</span><span style="color: #323432; font-family: Verdana">test.xls</span><span style="color: #323432; font-family: 宋体">，</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #3366ff; font-family: Verdana">4</span><span style="color: #3366ff; font-family: 宋体">、文件</span><span style="color: #3366ff; font-family: Verdana">(F)</span><span style="color: #3366ff; font-family: 宋体">&#8594;</span><span style="color: #3366ff; font-family: 宋体">另存为</span><span style="color: #3366ff; font-family: Verdana">(A)</span><span style="color: #3366ff; font-family: 宋体">&#8594;</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #3366ff; font-family: 宋体">保存类型为：制表符分隔，起名为</span><span style="color: #3366ff; font-family: Verdana">text.txt</span><span style="color: #3366ff; font-family: 宋体">，保存到</span><span style="color: #3366ff; font-family: Verdana">C:</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">5</span><span style="color: #323432; font-family: 宋体">、须先创建表结构：</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">连入</span><span style="color: #323432; font-family: Verdana">SQL*Plus</span><span style="color: #323432; font-family: 宋体">，以</span><span style="color: #323432; font-family: Verdana">system/manager</span><span style="color: #323432; font-family: 宋体">用户登录，</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="color: #323432; font-family: Verdana"><span style="font-size: 12pt"><span style="font-family: 宋体">SQL&gt; conn system/manager </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="color: #323432; font-family: 宋体"><span style="font-size: 12pt"><span style="font-family: 宋体">创建表结构</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="color: #323432; font-family: Verdana"><span style="font-size: 12pt"><span style="font-family: 宋体">SQL&gt; create table user </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">( </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">id</span><span style="color: #323432; font-family: 宋体">　　　　　　　</span><span style="color: #323432; font-family: Verdana">number,</span><span style="color: #323432; font-family: 宋体">　　　　　　　　</span><span style="color: #323432; font-family: Verdana">--</span><span style="color: #323432; font-family: 宋体">序号</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">username</span><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">varchar2(10),</span><span style="color: #323432; font-family: 宋体">　　　　　</span><span style="color: #323432; font-family: Verdana">--</span><span style="color: #323432; font-family: 宋体">用户名</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">password</span><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">varchar2(10),</span><span style="color: #323432; font-family: 宋体">　　　　　</span><span style="color: #323432; font-family: Verdana">--</span><span style="color: #323432; font-family: 宋体">密码</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">sj</span><span style="color: #323432; font-family: 宋体">　　　　　　　</span><span style="color: #323432; font-family: Verdana">varchar2(20)</span><span style="color: #323432; font-family: 宋体">　　　　　</span><span style="color: #323432; font-family: Verdana"> --</span><span style="color: #323432; font-family: 宋体">建立日期</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">); </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">6</span><span style="color: #323432; font-family: 宋体">、创建</span><span style="color: #323432; font-family: Verdana">SQL*Loader</span><span style="color: #323432; font-family: 宋体">输入数据所需要的文件，均保存到</span><span style="color: #323432; font-family: Verdana">C:</span><span style="color: #323432; font-family: 宋体">，用记事本编辑：</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">控制文件：</span><span style="color: #3366ff; font-family: Verdana">input.ctl</span><span style="color: #323432; font-family: 宋体">，内容如下：</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　</span><span style="color: #323432; font-family: Verdana">load data</span><span style="color: #323432; font-family: 宋体">　　　　　　　　　　</span><span style="color: #323432; font-family: Verdana"> --1</span><span style="color: #323432; font-family: 宋体">、控制文件标识</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　</span><span style="color: #323432; font-family: Verdana">infile 'test.txt'</span><span style="color: #323432; font-family: 宋体">　　　　　　</span><span style="color: #323432; font-family: Verdana">&nbsp;&nbsp;--2</span><span style="color: #323432; font-family: 宋体">、要输入的数据文件名为</span><span style="color: #323432; font-family: Verdana">test.txt </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　</span><span style="color: #323432; font-family: Verdana">append into table user</span><span style="color: #323432; font-family: 宋体">　　　　</span><span style="color: #323432; font-family: Verdana">--3</span><span style="color: #323432; font-family: 宋体">、向表</span><span style="color: #323432; font-family: Verdana">test</span><span style="color: #323432; font-family: 宋体">中追加记录</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　</span><span style="color: #323432; font-family: Verdana">fields terminated by X'09'</span><span style="color: #323432; font-family: 宋体">　　</span><span style="color: #323432; font-family: Verdana">--4</span><span style="color: #323432; font-family: 宋体">、字段终止于</span><span style="color: #323432; font-family: Verdana">X'09'</span><span style="color: #323432; font-family: 宋体">，是一个制表符（</span><span style="color: #323432; font-family: Verdana">TAB</span><span style="color: #323432; font-family: 宋体">）</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　</span><span style="color: #323432; font-family: Verdana">(id,username,password,sj)</span><span style="color: #323432; font-family: 宋体">　　</span><span style="color: #323432; font-family: Verdana"> -----</span><span style="color: #323432; font-family: 宋体">定义列对应顺序</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">a</span><span style="color: #323432; font-family: 宋体">、</span><span style="color: #323432; font-family: Verdana">insert</span><span style="color: #323432; font-family: 宋体">，为缺省方式，在数据装载开始时要求表为空</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">b</span><span style="color: #323432; font-family: 宋体">、</span><span style="color: #323432; font-family: Verdana">append</span><span style="color: #323432; font-family: 宋体">，在表中追加新记录</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">c</span><span style="color: #323432; font-family: 宋体">、</span><span style="color: #323432; font-family: Verdana">replace</span><span style="color: #323432; font-family: 宋体">，删除旧记录，替换成新装载的记录</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">d</span><span style="color: #323432; font-family: 宋体">、</span><span style="color: #323432; font-family: Verdana">truncate</span><span style="color: #323432; font-family: 宋体">，同上</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">7</span><span style="color: #323432; font-family: 宋体">、在</span><span style="color: #323432; font-family: Verdana">DOS</span><span style="color: #323432; font-family: 宋体">窗口下使用</span><span style="color: #323432; font-family: Verdana">SQL*Loader</span><span style="color: #323432; font-family: 宋体">命令实现数据的输入</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="color: #3366ff; font-family: Verdana"><span style="font-size: 12pt"><span style="font-family: 宋体">C:&gt;sqlldr userid=system/manager control=input.ctl </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #3366ff; font-family: 宋体">或者</span><span style="color: #3366ff; font-family: Verdana"> sqlldr scott/tiger control=input.ctl</span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　默认日志文件名为：</span><span style="color: #323432; font-family: Verdana">input.log </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">　　默认坏记录文件为：</span><span style="color: #323432; font-family: Verdana">input.bad </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: 宋体">如果是远程对数据库进行导入操作</span><span style="color: #323432; font-family: Verdana">,</span><span style="color: #323432; font-family: 宋体">则输入字符串应改为</span><span style="color: #323432; font-family: Verdana">: </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="color: #323432; font-family: Verdana"><span style="font-size: 12pt"><span style="font-family: 宋体">C:&gt;sqlldr userid=system/manager@serviceName_192.168.1.248 control=input.ctl </span></span></span></p>
<p style="line-height: 16.5pt; text-align: left" align="left"><span style="font-size: 12pt"><span style="font-family: 宋体"><span style="color: #323432; font-family: Verdana">8</span><span style="color: #323432; font-family: 宋体">、连接到</span><span style="color: #323432; font-family: Verdana">SQL*Plus</span><span style="color: #323432; font-family: 宋体">中，查看是否成功输入，可比较</span><span style="color: #323432; font-family: Verdana">input.log</span><span style="color: #323432; font-family: 宋体">与原</span><span style="color: #323432; font-family: Verdana">test.xls</span><span style="color: #323432; font-family: 宋体">文件，查看数据是否全部导入，是否导入成功．</span></span></span></p>
<img src ="http://www.blogjava.net/msmary/aggbug/151862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-10-10 20:43 <a href="http://www.blogjava.net/msmary/articles/151862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>