﻿<?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-Kimi's NutShell-随笔分类-Database</title><link>http://www.blogjava.net/kemi/category/8725.html</link><description>壁立千仞，无欲则刚</description><language>zh-cn</language><lastBuildDate>Fri, 16 Nov 2007 01:36:44 GMT</lastBuildDate><pubDate>Fri, 16 Nov 2007 01:36:44 GMT</pubDate><ttl>60</ttl><item><title>oracle 基本连接操作图示 （转）</title><link>http://www.blogjava.net/kemi/archive/2007/11/15/160689.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Thu, 15 Nov 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2007/11/15/160689.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/160689.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2007/11/15/160689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/160689.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/160689.html</trackback:ping><description><![CDATA[
		<div style="TEXT-INDENT: 24pt; LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">近段时间很多网友提出监听配置相关问题，客户终端(Client)无法连接服务器端(Server)。本文现对监听配置作一简单介绍，并提出一些客户终端无法连接服务器端的解决思路，愿对广大网友与读者有一些帮助。</span>
		</div>
		<div style="LINE-HEIGHT: 150%"> </div>
		<div style="LINE-HEIGHT: 150%">
				<strong>
						<span style="LINE-HEIGHT: 150%">一、</span>
				</strong>
				<strong>
						<span style="LINE-HEIGHT: 150%">监听器(LISTENER)</span>
				</strong>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">　　监听器是Oracle基于服务器端的一种网络服务，主要用于监听客户端向数据库服务器端提出的连接请求。既然是基于服务器端的服务，那么它也只存在于数据库服务器端，进行监听器的设置也是在数据库服务器端完成的。</span>
		</div>
		<div style="LINE-HEIGHT: 150%"> </div>
		<div style="LINE-HEIGHT: 150%">
				<strong>
						<span style="LINE-HEIGHT: 150%">二、</span>
				</strong>
				<strong>
						<span style="LINE-HEIGHT: 150%">本地服务名(Tnsname)</span>
				</strong>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">　　Oracle</span>
				<span style="LINE-HEIGHT: 150%">客户端与服务器端的连接是通过客户端发出连接请求，由服务器端监听器对客户端连接请求进行合法检查，如果连接请求有效，则进行连接，否则拒绝该连接。</span>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">本地服务名是Oracle客户端网络配置的一种，另外还有Oracle名字服务器(Oracle Names Server)等。Oracle常用的客户端配置就是采用的本地服务名，本文中介绍的也主要是基于本地服务名的配置。</span>
		</div>
		<div style="LINE-HEIGHT: 150%"> </div>
		<div style="LINE-HEIGHT: 150%">
				<strong>
						<span style="LINE-HEIGHT: 150%">三、</span>
				</strong>
				<strong>
						<span style="LINE-HEIGHT: 150%">Oracle</span>
				</strong>
				<strong>
						<span style="LINE-HEIGHT: 150%">网络连接配置方法</span>
				</strong>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">　　配 置Oracle服务器端与客户端都可以在其自带的图形化Oracle网络管理器(Oracle Net Manager)里完成（强烈建议在这个图形化的工具下完成Oracle服务端或客户端的配置）。在Windows下，点击“开始/程序/Oracle - OraHome92/Configuration and Migration Tools/Net Manager”启动Oracle网络管理器工具，在Linux/Unix下，利用netmgr命令来启动图形化Oracle网络管理器，如：</span>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">$ netmgr</span>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">Windows</span>
				<span style="LINE-HEIGHT: 150%">下启动Net Manager图形窗口如下图示：</span>
		</div>
		<div style="LINE-HEIGHT: 150%"> </div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">
						<img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143457473.png" />
				</span>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">                                                              </span>
				<span style="LINE-HEIGHT: 150%">图(一)</span>
		</div>
		<div style="LINE-HEIGHT: 150%"> </div>
		<div style="LINE-HEIGHT: 150%">
				<strong>
						<span style="LINE-HEIGHT: 150%">1、 </span>
						<span style="LINE-HEIGHT: 150%">Oracle</span>
						<span style="LINE-HEIGHT: 150%">监听器配置(LISTENER)</span>
				</strong>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">　　如 图(一)示，选中树形目录中监听程序项，再点击左上侧“+”按钮添加监听程序，点击监听程序目录，默认新加的监听器名称是LISTENER(该名称也可以 由任意合法字符命名)。选中该名称，选中窗口右侧栏下拉选项中的“监听位置”，点击添加地址按钮。在出现的网络地址栏的协议下拉选项中选中 “TCP/IP”，主机文本框中输入主机名称或IP地址(如果主机即用作服务端也作为客户端，输入两项之一均有效；如果主机作为服务端并需要通过网络连 接，建议输入IP地址)，端口文本框中输入数字端口，默认是1521，也可以自定义任意有效数字端口。配置好的监听位置如下图示：</span>
		</div>
		<div style="LINE-HEIGHT: 150%"> </div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">
						<img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143458390.png" />
				</span>
		</div>
		<div style="LINE-HEIGHT: 150%">
				<span style="LINE-HEIGHT: 150%">                                                               </span>
				<span style="LINE-HEIGHT: 150%">图(二)</span>
		</div>
		<div style="LINE-HEIGHT: 150%">  
<div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　选 中窗口右侧栏下拉选项中的“数据库服务”，点击添加数据库按钮。在出现的数据库栏中输入全局数据库名，如myoracle。注意这里的全局数据库名与数据 库SID有所区别，全局数据库名实际通过域名来控制在同一网段内数据库全局命名的唯一性，就如Windows下的域名控制器，如这里可以输入 myoracle.192.168.1.5。Oracle主目录可以不填写，输入SID，如myoracle。完整的数据库服务配置如下图示：</span></div><br clear="all" /><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"><img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143458958.png" /></span></div><div style="TEXT-INDENT: 220.5pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">          图(三)</span></div><div style="TEXT-INDENT: 215.25pt; LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　保 存以上配置，默认即可在Oracle安装目录下找到监听配置文件 (Windows下如D:oracleora92networkadminlistener.ora，Linux/Unix下$ ORACLE_HOME/network/admin/listerer.ora)。至此，Oracle服务端监听器配置已经完成。</span></div><div style="LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">2、 </span><span style="LINE-HEIGHT: 150%">本地服务名配置(Tnsnames)</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　本 地服务名是基于Oracle客户端的网络配置，所以，如果客户端需要连接数据库服务器进行操作，则需要配置该客户端，其依附对象可以是任意一台欲连接数据 库服务器进行操作的<a class="none" title="pc" href="http://game.pchome.net/pcgame" target="_blank" rel="external"><font color="#0066cc">pc</font></a>机，也可以是数据库服务器自身。如前面所介绍，可以利用Oracle自带的图形化管理工具Net Manager来完成Oracle客户端的配置。选中如图(一)中的服务命名，再点击左上侧“+”按钮，弹出如下图示对话框：</span></div><div style="LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"><img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143458176.png" /></span></div><div style="MARGIN-LEFT: 45.05pt; TEXT-INDENT: 165.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">                      图(四)</span></div><div style="LINE-HEIGHT: 150%" align="center"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　输入Net服务名，如myoracle，点击下一步，进入下图示对话框：</span></div><div style="LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"><img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143459429.png" /></span></div><div style="LINE-HEIGHT: 150%" align="center"><span style="LINE-HEIGHT: 150%">                图(五)</span></div><div style="LINE-HEIGHT: 150%" align="center"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"></span> 选中TCP/IP(Internet协议)，点击下一步，如下图示：<br clear="all" /><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"><img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143459723.png" /></span></div><div style="LINE-HEIGHT: 150%" align="center"><span style="LINE-HEIGHT: 150%">                图(六)</span></div><div style="LINE-HEIGHT: 150%" align="center"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　输入主机名与端口号。注意这里的主机名与端口号必须与数据库服务器端监听器配置的主机名和端口号相同。点击下一步，如下图示：</span></div><div style="LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"><img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143459417.png" /></span></div><div style="MARGIN-LEFT: 45.05pt; TEXT-INDENT: 165.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">                     图(七)</span></div><div style="LINE-HEIGHT: 150%" align="center"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　选 中(Oracle8i或更高版本)服务名，输入服务名。这里的服务名实际上就是数据库服务器端监听器配置中的全局数据库名，前者与后者必须相同。连接类型 通常选专用服务器，这要视数据库服务器的配置而定，如果配置的共享数据库服务器，这里的连接类型就要选共享服务器，否则建议选专用服务器(关于专用服务器 的介绍请参阅相关文档)。配置好后点击下一步，如下图示：</span></div><div style="LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"><img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143459414.png" /></span></div><div style="LINE-HEIGHT: 150%" align="center"><span style="LINE-HEIGHT: 150%">                图(八)</span></div><div style="LINE-HEIGHT: 150%" align="center"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"></span> 　如 果数据库服务器端相关服务启动了，可以点击测试按钮进行连接测试。Oracle默认是通过scott/tiger用户进行测试连接，由于scott用户是 Oracle自带的示例用户，对于正式的业务数据库或专业测试数据库可能没有配置这个用户，所以需要更改成有效的用户登录才可能测试成功。如果这里测试连 接不成功，也不要紧，先点完成按钮结束配置。 
<div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　回 到Oracle网络管理器(Oracle Net Manager)主窗口，保存配置，默认即可在Oracle安装目录下找到本地服务名配置文件 (Windows下如D:oracleora92networkadmintnsnames.ora，Linux/Unix下$ ORACLE_HOME/network/admin/ tnsnames.ora)。配置完成的本地服务名如下图示：</span></div><br clear="all" /><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%"><img alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200705/20070518143500206.png" /></span></div><div style="MARGIN-LEFT: 45.05pt; TEXT-INDENT: 170.65pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">                  图(九)</span></div><div style="LINE-HEIGHT: 150%" align="center"> </div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　树形目录下的服务命名可以通过编辑菜单里的重命名菜单更改成任意合法字符组成的服务名称，注意服务名称前不能有空格字符，否则可能无法连接数据库服务器。</span></div><div style="LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">3、 </span><span style="LINE-HEIGHT: 150%">连接数据库服务器</span></strong></div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">(1)<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span><span style="LINE-HEIGHT: 150%">启动服务器端监听器与数据库服务</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">Linux/Unix</span><span style="LINE-HEIGHT: 150%">下，启动监听器：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">$ lsnrctl start                     </span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">关闭监听器：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">$ lsnrctl stop</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">查看监听状态：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">$ lsnrctl status</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">启动数据库：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">$ sqlplus /nolog</span></div><div style="MARGIN-LEFT: 226.5pt; TEXT-INDENT: -147pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">SQL&gt;conn sys@myoracle as sysdba   --</span><span style="LINE-HEIGHT: 150%">这里的myoracle是前面配置的客户端本地服务名</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">或</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">SQL&gt;conn / as sysdba</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">SQL&gt;startup</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">Windows</span><span style="LINE-HEIGHT: 150%">下，启动监听器：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">C:lsnrctl start</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">启动Oracle实例服务：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">C:oradim ?a href="http://game.pchome.net/pcgame" class="none" title="cs" rel="external"&gt;cstartup –sid myoracle   </span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">关闭Oracle实例服务：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">C:oradim –shutdown –sid myoracle</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　以上服务必须同时启动，客户端才能连接数据库。由于默认配置的监听器名称是Listener，上述命令可以正常启动监听器，如果监听器名称是其它名称，如aListener，则需要用下列方式才能启动：</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">Linux/Unix</span><span style="LINE-HEIGHT: 150%">下：</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">$ lsnrctl start aListener</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">Windows</span><span style="LINE-HEIGHT: 150%">下：</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">C:lsnrctl start aListener</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">(2)<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span><span style="LINE-HEIGHT: 150%">测试连接数据库服务器</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　测试的方法多种多样，可以在上面配置本地服务名时进行测试，也可以是第三方客户端工具，如PL/SQL Developer，最方便的是用Oracle自带的sqlplus工具，以下利用sqlplus进行测试：</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">C:sqlplus /nolog</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">SQL&gt;conn zgh@myoracle</span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">已连接。 </span></div><div style="MARGIN-LEFT: 63pt; TEXT-INDENT: 14.4pt; LINE-HEIGHT: 150%"> </div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%"></span></strong>  
<div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">四、</span></strong><strong><span style="LINE-HEIGHT: 150%">客户端连接服务器端常见问题排除方法</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　要排除客户端与服务器端的连接问题，首先检查客户端配置是否正确(客户端配置必须与数据库服务器端监听配置一致)，再根据错误提示解决。下面列出几种常见的连接问题：</span></div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">1、 </span><span style="LINE-HEIGHT: 150%">ORA-12541: TNS: </span><span style="LINE-HEIGHT: 150%">没有监听器</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">显而易见，服务器端的监听器没有启动，另外检查客户端IP地址或端口填写是否正确。启动监听器：</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">$ lsnrctl start</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">或</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">C:lsnrctl start</span></div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">2、 </span><span style="LINE-HEIGHT: 150%">ORA-12500: TNS: </span><span style="LINE-HEIGHT: 150%">监听程序无法启动专用服务器进程</span></strong></div><div style="MARGIN-LEFT: 60pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">对于Windows而言，没有启动Oracle实例服务。启动实例服务：</span></div><div style="MARGIN-LEFT: 60pt; LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">C:oradim –startup -sid myoracle</span></div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">3、 </span><span style="LINE-HEIGHT: 150%">ORA-12535: TNS: </span><span style="LINE-HEIGHT: 150%">操作超时</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　出现这个问题的原因很多，但主要跟网络有关。解决这个问题，首先检查客户端与服务端的网络是否畅通，如果网络连通，则检查两端的防火墙是否阻挡了连接。</span></div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">4、 </span><span style="LINE-HEIGHT: 150%">ORA-12154: TNS: </span><span style="LINE-HEIGHT: 150%">无法处理服务名</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　检 查输入的服务名与配置的服务名是否一致。另外注意生成的本地服务名文件(Windows下如D:oracleora92networkadmin tnsnames.ora，Linux/Unix下/network/admin/tnsnames.ora)里每项服务的首 行服务名称前不能有空格。</span></div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">5、 </span><span style="LINE-HEIGHT: 150%">ORA-12514: TNS: </span><span style="LINE-HEIGHT: 150%">监听进程不能解析在连接描述符中给出的 SERVICE_NAME</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　打开Net Manager，选中服务名称，检查服务标识栏里的服务名输入是否正确。该服务名必须与服务器端监听器配置的全局数据库名一致。</span></div><div style="LINE-HEIGHT: 150%"><strong><span style="LINE-HEIGHT: 150%">6、 </span><span style="LINE-HEIGHT: 150%">Windows</span><span style="LINE-HEIGHT: 150%">下启动监听服务提示找不到路径</span></strong></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">　　用 命令或在服务窗口中启动监听提示找不到路径，或监听服务启动异常。打开注册表，进入HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/OracleOraHome92TNSListener项，查看ImagePath字符串项是否存在，如果没 有，设定值为D:oracleora92BINTNSLSNR，不同的安装路径设定值做相应的更改。这种方法同样适用于Oracle实例服务，同 上，找到如同HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/Oracle ServiceMYORACLE项，查看ImagePath字符串项是否存在，如果没有，则新建，设定值为d:oracleora92 binORACLE.EXE MYORACLE。</span></div><div style="LINE-HEIGHT: 150%"><span style="LINE-HEIGHT: 150%">以上是Oracle客户端连接服务器端常见的一些问题，当然不能囊括所有的连接异常。解决问题的关键在于方法与思路，而不是每种问题都有固定的答案。<br /></span></div></div></div></div></div>
<img src ="http://www.blogjava.net/kemi/aggbug/160689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2007-11-15 09:54 <a href="http://www.blogjava.net/kemi/archive/2007/11/15/160689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 10G ODBC连接步骤和含义（转）</title><link>http://www.blogjava.net/kemi/archive/2007/09/26/148352.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Wed, 26 Sep 2007 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2007/09/26/148352.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/148352.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2007/09/26/148352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/148352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/148352.html</trackback:ping><description><![CDATA[Oracle 10g不但支持多种程序，如Java、.NET、.Com和Win32，而且确保所有的程序开发都可以使用到Oracle高级的数据库特性。也就是说，Oracle提供良好的开发环境，以支持各种应用程序的开发，并且，每个数据存取的驱动程序都经过良好的设计，以达到最佳的存取功能。对于Windows的开发环境而言，最常使用的数据存取方式有.NET和.Com两种，分别介绍如下。 <br />    .NET数据存取方式有三种，如图13-1所示。第一种是程序语言（例如，ASP.NET等）通过OLE DB.NET调用Oracle OLE DB，再存取Oracle数据库；第二种是程序语言通过ODBC.NET调用Oracle ODBC，再存取Oracle数据库；第三种是程序语言通过Oracle Data Provider for.NET直接存取Oracle数据库。 <br /><div align="center"><img height="258" src="http://www.khp.com.cn/zhuanti/5037/images/p1.jpg" width="500" border="0" /></div><br />另一种数据存取的方式为.Com，如图13-2所示。<br /><div align="center"><img height="344" src="http://www.khp.com.cn/zhuanti/5037/images/p2.gif" width="500" border="0" /></div>    .Com数据存取的方式有三种。第一种是程序语言（例如，ASP.NET等）通过Oracle Objects for OLE（0040）存取Oracle数据库；第二种是程序语言通过ActiveX Data Objects（ADO）调用Oracle ODBC，再存取Oracle数据库；第三种是程序语言通过ActiveX Data Objects（ADO）调用Oracle OLE DB，再存取Oracle数据库。另外，程序语言也可以通过COM Automation Feature取得Oracle数据库的数据。 <br />    Oracle 10g Web数据库的存取如同前文所述，有多种数据存取的方式。在本节中，使用的方式如图13-3所示。<br /><div align="center"><img height="268" src="http://www.khp.com.cn/zhuanti/5037/images/p3.gif" width="233" border="0" /></div>    首先编写ASP（Active Server Page）程序，通过ADO（ActiveX Data Object）访问ODBC（Open Database Connectivity，开放式数据库连接），再通过ODBC存取Oracle数据库。 <br />    在Oracle 10g Web数据库的开发环境中，需要完成下列各项工作，才能从Internet上存取Oracle 10g Web数据库，这些工作如下所示： 
<ul><li type="square">创建一个数据库管理系统 
</li><li type="square">设置ODBC 
</li><li type="square">设置Web Server（例如，IIS的虚拟目录） 
</li><li type="square">ASP程序的开发 </li></ul>    我们以本书的Misdb数据库为例，请先完成前面章节中的项目管理，创建11个表，分别有EMP、depart、probuy、invoice、customer、delivery、Ord、product、stock、WIP和 salgrade表，并插入多条数据。下面，分别介绍设置ODBC、设置Web Server和开发ASP程序。<br /><br /><b>13-2    设置ODBC</b><br /><br />    ODBC的全名是Open Database Connectivity（开放式数据库连接），是应用程序连接数据库的接口。由于计算机的类型不同，从个人计算机到大型主机，都有自己处理数据的方式，ODBC则可以连接到相同或不相同的数据库管理系统，因此，ODBC可以给应用程序提供相同的存取数据库的接口，程序设计员在设计连接不同数据库时，只要处理与ODBC的连接就可以了，而不必针对不同的数据库设计完全不同的程序。特别需要提醒的是，不同的数据库都有自己对应的ODBC驱动程序，在使用不同数据库的同时，务必设置正确的ODBC驱动程序。就像在本节中，想要连接Oracle 10g数据库，就必须设置Oracle ODBC驱动程序，操作步骤如下： <br />    （1）选择Start→Programs→Oracle-OraDb10g_home1→Configuration and Migration Tools→Microsoft ODBC Administrator，如图13-4所示。<br /><div align="center"><img height="268" src="http://www.khp.com.cn/zhuanti/5037/images/p4.jpg" width="446" border="0" /></div>    （2）打开ODBC Data Source Administrator，如图13-5所示。  <br /><div align="center"><img height="312" src="http://www.khp.com.cn/zhuanti/5037/images/p5.jpg" width="500" border="0" /></div>    （3）单击System DSN标签，如图13-6所示。 <br /><div align="center"><img height="348" src="http://www.khp.com.cn/zhuanti/5037/images/p6.jpg" width="500" border="0" /></div>    （4）单击Add按钮，出现如图13-7所示的对话框。 <br /><div align="center"><img height="218" src="http://www.khp.com.cn/zhuanti/5037/images/p7.gif" width="343" border="0" /></div>    （5）向下拖动滚动条，找到Oracle in OraDb10g_home1选项，选择该选项，如图13-8所示。<br /><div align="center"><img height="224" src="http://www.khp.com.cn/zhuanti/5037/images/p8.gif" width="402" border="0" /></div>    （6）单击Finish按钮，进入Oracle ODBC Driver Configuration对话框，如图13-9所示。<br /><div align="center"><img height="261" src="http://www.khp.com.cn/zhuanti/5037/images/p9.gif" width="481" border="0" /></div>    Data Source Name：自定义，程序调用时将使用这个名称，请输入misdbdsn。 <br />    TNS Service Name：Oracle TNS服务名称，在创建数据库时，一般默认TNS服务名称与数据库名称相同，请输入MISDB，读者也可以自定义。 <br />    User ID：用户的账户名称，这里使用System账户来测试。<br />    （7）单击Test Connection按钮，出现Oracle ODBC Driver Connect对话框，如图13-10所示。<br /><div align="center"><img height="162" src="http://www.khp.com.cn/zhuanti/5037/images/p10.gif" width="324" border="0" /></div>    Password：请输入安装时给System设置的密码，或自行修改后的密码。 <br />    （8）单击OK按钮，出现如图13-11所示的对话框。 <br /><div align="center"><img height="118" src="http://www.khp.com.cn/zhuanti/5037/images/p11.gif" width="249" border="0" /></div>    （9）单击OK按钮，回到Oracle ODBC Driver Configuration对话框，如图13-12所示。 
<div align="center"><img src="http://www.khp.com.cn/zhuanti/5037/images/p12.jpg" /></div>    （10）单击OK按钮，回到ODBC Data Source Administrator的System DNS选项卡，如图13-13所示。 
<div align="center"><img src="http://www.khp.com.cn/zhuanti/5037/images/p13.jpg" /></div>    （11）单击OK按钮，完成ODBC的设置。 <img src ="http://www.blogjava.net/kemi/aggbug/148352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2007-09-26 16:00 <a href="http://www.blogjava.net/kemi/archive/2007/09/26/148352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 基本操作－－－丢了很久，今天又捡起来了，呵呵。玩具性的数据库，不过做点小程序还是蛮好的！</title><link>http://www.blogjava.net/kemi/archive/2007/04/04/108446.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Wed, 04 Apr 2007 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2007/04/04/108446.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/108446.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2007/04/04/108446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/108446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/108446.html</trackback:ping><description><![CDATA[
		<table class="style2" cellspacing="0" cellpadding="0" width="95%" align="center" border="0" valign="top">
				<tbody>
						<tr bgcolor="#e7e7e7">
								<td width="83%" bgcolor="#e7e7e7" height="20">
										<span class="style5">
												<strong>
														<font color="#003366">MySQL数据库的基本操作</font>
												</strong>
										</span>
								</td>
								<td align="right" width="17%">[ 转载 ]</td>
						</tr>
						<tr>
								<td colspan="2">
										<img height="10" src="http://www.musemailsvr.com/0.gif" width="1" />
								</td>
						</tr>
						<tr>
								<td colspan="2">
										<div align="left">
										</div>
										<table height="33" cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td class="style14">
																		<p>
																				<br />
																				<strong>一、连接MYSQL</strong>
																		</p>
																		<p>　　格式： mysql -h主机地址 -u用户名 －p用户密码</p>
																		<p>　　1、例1：连接到本机上的MYSQL。</p>
																		<p>　　首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -h localhost -u root -p+回车,也可以键入命令mysql -u root -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql&gt;</p>
																		<p>　　2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令：<br />　　 mysql -h110.110.110.110 -uroot -pabcd123</p>
																		<p>　　（注:u与root可以不用加空格，其它也一样）</p>
																		<p>　　3、退出MYSQL命令： exit （回车）</p>
																		<p>
																				<strong>二、修改密码</strong>
																		</p>
																		<p>　　格式：mysqladmin -u用户名 -p旧密码 password 新密码</p>
																		<p>　　1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令<br />　　 mysqladmin -uroot -password ab12</p>
																		<p>　　注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。</p>
																		<p>　　2、例2：再将root的密码改为djg345。<br />　　 mysqladmin -uroot -pab12 password djg345<br /></p>
																		<p>
																				<strong>三、增加新用户</strong>（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符）</p>
																		<p>　　格式：grant select on 数据库.* to 用户名@登录主机 identified by "密码"</p>
																		<p>　　例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令：<br />　　 grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";<br />　　 但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。</p>
																		<p>　　例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问了。<br />　　 grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";</p>
																		<p>　　如果你不想test2有密码，可以再打一个命令将密码消掉。<br />　　 grant select,insert,update,delete on mydb.* to test2@localhost identified by ""; <br /></p>
																		<p>　　下面来看看MYSQL中有关数据库方面的操作。注意：必须首先登录到MYSQL中，以下操作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。</p>
																		<p>
																				<br />
																				<strong>四、操作技巧</strong>
																		</p>
																		<p>　　1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。<br />五、显示命令</p>
																		<p>　　1、显示数据库列表。<br />　　 show databases;<br />　　 刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。</p>
																		<p>　　2、显示库中的数据表：<br />　　 use mysql； //打开库，学过FOXBASE的一定不会陌生吧<br />　　 show tables;</p>
																		<p>　　3、显示数据表的结构：<br />　　 describe 表名;</p>
																		<p>　　4、建库：<br />　　 create database 库名;</p>
																		<p>　　5、建表：<br />　　 use 库名；<br />　　 create table 表名 (字段设定列表)；</p>
																		<p>　　6、删库和删表:<br />　　 drop database 库名;<br />　　 drop table 表名；</p>
																		<p>　　7、将表中记录清空：<br />　　 delete from 表名;</p>
																		<p>　　8、显示表中的记录：<br />　　 select * from 表名;</p>
																		<p> </p>
																		<p>
																				<strong>六、一个建库和建表以及插入数据的实例</strong>
																		</p>
																		<p>drop database if exists school; //如果存在SCHOOL则删除<br />create database school; //建立库SCHOOL<br />use school; //打开库SCHOOL<br />create table teacher //建立表TEACHER<br />(<br />id int(3) auto_increment not null primary key,<br />name char(10) not null,<br />address varchar(50) default '南阳',<br />year date<br />); //建表结束<br />//以下为插入字段<br />insert into teacher values(','xuefeng','南阳理工,'1984-05-27');<br />insert into teacher values(','huifan','杞县高中','1985-07-23');</p>
																		<p>注：在建表中:<br />1.将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key。<br />2.将NAME设为长度为10的字符字段。<br />3.将ADDRESS设为长度50的字符字段，而且缺省值为'南阳'。　　<br />4.将YEAR设为日期字段。<br /></p>
																		<p>如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:\下，并在DOS状态进入目录\mysql\bin，然后键入以下命令：<br /></p>
																		<p>　　 mysql -uroot -p密码 &lt; c:\school.sql<br /></p>
																		<p>如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。</p>
																		<p>
																				<strong>七、将文本数据转到数据库中</strong>
																		</p>
																		<p>　　1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用\n来代替.<br />　　 例：<br />　　　 3 yanzi 南阳师院 1984-05-27<br />　　　 4 mike 南阳七中 1985-07-23</p>
																		<p>　　2、数据传入命令 load data local infile "文件名" into table 表名;<br />　　 注意：你最好将文件复制到\mysql\bin目录下，并且要先用use命令打表所在的库 。</p>
																		<p>
																				<strong>八、备份数据库：</strong>（命令在DOS的\mysql\bin目录下执行）</p>
																		<p>　　mysqldump --opt school&gt;school.bbb<br />　　 注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/kemi/aggbug/108446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2007-04-04 15:34 <a href="http://www.blogjava.net/kemi/archive/2007/04/04/108446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB40的管理工具object manager1.8的基本使用  (转自MatriX)</title><link>http://www.blogjava.net/kemi/archive/2006/12/29/90661.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Fri, 29 Dec 2006 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/12/29/90661.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/90661.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/12/29/90661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/90661.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/90661.html</trackback:ping><description><![CDATA[使用Object Manager 瀏覽數據：<br />下載 objectmanager-1.7.1-win_ikvm.zip ( 這個包含 java vm)<br /><a href="http://developer.db4o.com/Files/" target="_new">http://developer.db4o.com/Files/</a><br /><br />解壓後 直接 運行 objectmanager.bat<br />然後會出現 Object Manager 的介面,<br />選擇 File -&gt; Open "Encrypted" File      // 由於上面 encrypt 設為true, 故這裡使用encrypted<br />browse 上面例子產生的資料庫檔案 db.yap<br />輸入 例子裡的 password : 123123        // 我測試時使用密碼打不開, 不輸入密碼卻能開啟檔案, 其怪<br />如果成功連接了就會出現下面的畫面：<br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://blog.matrix.org.cn/resources/joeyta/db4o_om1.gif" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />選擇 File -&gt; Query , 選擇要查詢的 Object class<br />就會出現下面的畫面：<br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://blog.matrix.org.cn/resources/joeyta/db4o_om2.gif" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />選擇 File -&gt; Export to XML<br />輸入 db.xml, 按存檔就會產生 db.xml 到目錄裡.<br />db.xml 的內容為：<br /><pre class="overflow">&lt;com.db4o.reflect.generic.GenericObject id="1527"&gt;<br />   &lt;name&gt;&lt;&gt;;jane&gt;&lt;/name&gt;<br />   &lt;password&gt;&lt;&gt;;pass456&gt;&lt;/password&gt;<br />&lt;/com.db4o.reflect.generic.GenericObject&gt;<br />&lt;com.db4o.reflect.generic.GenericObject id="2021"&gt;<br />   &lt;name&gt;&lt;&gt;;joeyta&gt;&lt;/name&gt;<br />   &lt;password&gt;&lt;&gt;;pass000&gt;&lt;/password&gt;<br />&lt;/com.db4o.reflect.generic.GenericObject&gt;</pre><br /><br />當使用commit() 及rollback(), db4o 自動提供 read committed 的transactions.<br /><br />db4o的功能不少，有興趣的同仁可參考下面更多官方的教學：<br /><a href="http://www.db4o.com/community/testdrive/formulaonetutorial.aspx" target="_new">http://www.db4o.com/community/testdrive/formulaonetutorial.aspx</a><br /><a href="http://www.db4o.com/about/productinformation/resources/db4o-5.0-tutorial-java.pdf" target="_new">http://www.db4o.com/about/productinformation/resources/db4o-5.0-tutorial-java.pdf</a><img src ="http://www.blogjava.net/kemi/aggbug/90661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-12-29 10:21 <a href="http://www.blogjava.net/kemi/archive/2006/12/29/90661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>比较 SQL SERVER与ORACLE（转）</title><link>http://www.blogjava.net/kemi/archive/2006/08/22/65093.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Tue, 22 Aug 2006 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/08/22/65093.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/65093.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/08/22/65093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/65093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/65093.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" size="2">T-SQL是SQL Server的语言引擎，而Oracle的语言引擎却是PLSQL。这两种查询语言都对ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明，同时还要介绍下如何对这些扩展进行转化以用在SQL Server环境下。 </font>
		</p>
		<p>
				<font face="Arial" size="2">列的选择 </font>
		</p>
		<p>
				<font face="Arial" size="2">用PLSQL执行数据查询的时候，FROM子句是必须的，这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表Dual。Dual表是Oracle中的一个实际存在的表，任何用户均可读取，常用在没有目标表的Select中。Dual表由Oracle连同数据字典一同创建，所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY，该列定义为VARCHAR2(1)类型，有一行值X。从DUAL表选择数据常被用来通过SELECT语句计算常数表达式，由于DUAL只有一行数据，所以常数只返回一次。</font>
		</p>
		<p>
				<font face="Arial" size="2">Oracle下的DUAL查询如下所示： <br />SELECT ‘x’ FROM dual <br />而对等的SQL Server查询则是下面这个样子： <br />SELECT ‘x’ </font>
		</p>
		<p>
				<font face="Arial" size="2">以下是null相关的知识，用到了dual：<br />SQL&gt; select 1 from dual where null=null;<br />没有查到记录<br />SQL&gt; select 1 from dual where null='';<br />没有查到记录<br />SQL&gt; select 1 from dual where ''=''; <br />没有查到记录<br />SQL&gt; select 1 from dual where null is null;<br />1<br />---------<br />1<br />SQL&gt; select 1 from dual where nvl(null,0)=nvl(null,0);<br />1<br />---------<br />1<br />查看当前连接用户<br />SQL&gt; select user from dual;</font>
		</p>
		<p>
				<font face="Arial" size="2">查看当前日期、时间<br />SQL&gt; select sysdate from dual;</font>
		</p>
		<p>
				<font face="Arial" size="2">连接 </font>
		</p>
		<p>
				<font face="Arial" size="2">Oracle用|| 符号作为连接符，而SQL Server的连接符是加号：+ 。 </font>
		</p>
		<p>
				<font face="Arial" size="2">Oracle查询如下所示： <br />Select ‘Name’ || ‘Last Name’ From tableName </font>
		</p>
		<p>
				<font face="Arial" size="2">对应的SQL Server查询如下所示： <br />Select ‘Name’ + ‘Last Name’ </font>
		</p>
		<p>
				<br />
				<font face="Arial" size="2">数字取舍 </font>
		</p>
		<p>
				<font face="Arial" size="2">Oracle数据库内有一个TRUNC函数，该函数返回m位十进制数的n位；如果省略m则n就是0位。m的值可以为负，表示截去小数点左边m位数字。</font>
		</p>
		<p>
				<font face="Arial" size="2">在SQL Server下可以用Round或者Floor。 </font>
		</p>
		<p>
				<font face="Arial" size="2">以下是Oracle查询： <br />SELECT TRUNC(15.79,1) "Truncate" FROM DUAL; </font>
		</p>
		<p>
				<font face="Arial" size="2">下面是同类查询的SQL Server版本： <br />SELECT ROUND(15.79, 0) rounded , ROUND(15.79, 0,1) truncated <br />SELECT FLOOR(ROUND(15.79, 0)), FLOOR(ROUND(15.79, 0,1) ) </font>
		</p>
		<p>
				<br />
				<font face="Arial" size="2">数字转换 </font>
		</p>
		<p>
				<font face="Arial" size="2">Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR2 数据类型，同时采用可选的数字格式。 </font>
		</p>
		<p>
				<font face="Arial" size="2">SQL Server则通过STR函数返回数字转换之后的字符数据。不过，该函数不具方便的Format参数。 </font>
		</p>
		<p>
				<font face="Arial" size="2">Oracle查询如下： <br />SELECT to_char(123.45 ,99999999999999) from tab <br />SELECT to_char(EXPIRY_DATE,'DDMONYYYY') from tab </font>
		</p>
		<p>
				<font face="Arial" size="2">以下是SQL Server版本的查询： <br />SELECT STR(123.45, 14) <br />SELECT STR(round(123.455 , 2),12,2) <br />SELECT CAST(REPLACE((CONVERT(varchar(12) , EXPIRYDATE, 106 )),' ' , '') as varchar(9)) </font>
		</p>
		<p>
				<br />
				<font face="Arial" size="2">LENGTH和LEN </font>
		</p>
		<p>
				<font face="Arial" size="2">以下是Oracle的查询： <br />SELECT LENGTH('SQLMAG') "Length in characters" FROM DUAL; </font>
		</p>
		<p>
				<font face="Arial" size="2">以上查询在SQL Server下是这样写的： <br />SELECT LEN('SQLMAG') "Length in characters" </font>
		</p>
		<p>
				<br />
				<font face="Arial" size="2">日期 </font>
		</p>
		<p>
				<font face="Arial" size="2">以上两种系统都具有各自的当前日期和时间格式。 </font>
		</p>
		<p>
				<font face="Arial" size="2">Oracle取得日期和采用如下方式： <br />SYSDATE </font>
		</p>
		<p>
				<font face="Arial" size="2">SQL Server则是这样的： <br />GETDATE() </font>
		</p>
		<p>
				<font face="Arial" size="2">你可以用各种语法操作日期。以下的代码对Oracle日期值中的月份进行了格式调整（返回日期再加上n月）： <br />Select add_months(sysdate,12) from dual </font>
		</p>
		<p>
				<font face="Arial" size="2">SQL Server则是如下完成同等功能的： <br />Select dateadd(mm,12,getdate()) </font>
		</p>
		<p>
				<font face="Arial" size="2">数据的减法也不同。以下代码在Oracle中直接对数据进行减法操作： <br />SELECT sysdate -add_months(sysdate,12) FROM dual </font>
		</p>
		<p>
				<font face="Arial" size="2">SQL Server则是这样做的： <br />SELECT datediff(dd, GetDate(),dateadd(mm,12,getdate())) <br /></font>
		</p>
<img src ="http://www.blogjava.net/kemi/aggbug/65093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-08-22 15:44 <a href="http://www.blogjava.net/kemi/archive/2006/08/22/65093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHEK_POS_SALE </title><link>http://www.blogjava.net/kemi/archive/2006/07/14/58177.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Fri, 14 Jul 2006 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/07/14/58177.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/58177.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/07/14/58177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/58177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/58177.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">CREATE OR REPLACE Package Body Check_Pos_Sales Is</font>
		</p>
		<p>
				<font face="Verdana" size="2">  /*<br />  TODO: owner="Administrator" created="2006-4-21"<br />  text="cell procedure"<br />  */<br />  Procedure Exec_Menology_Zsalebymonth(p_Brand   In Varchar2,<br />                                       p_Branch  In Varchar2,<br />                                       p_Yearid  In Varchar2,<br />                                       p_Monthid In Varchar2) Is<br />  <br />    Flag    Number;<br />    Str_Sql Varchar2(1000);<br /> <br />    v_Customer_Cc2 Constant Varchar2(20) := 'mm';<br />    v_Customer_Cc3 Constant Varchar2(20) := 'yyyy';<br />    -- v_Customer_Cc4 Constant Varchar2(40) := 'yyyy-mm-dd hh24:mi:ss';<br />  <br />  Begin<br />  <br />    Flag := 0;<br />    Select Count(*)<br />      Into Flag<br />      From Dpdt.Menology Ec<br />     Where Ec.Brand = p_Brand<br />       And Ec.Branch = p_Branch<br />       And Ec.Yearid = p_Yearid<br />       And Ec.Monthid = p_Monthid;<br />  <br />    If (Flag = 1) Then<br />      Str_Sql := 'Update dpdt.menology w Set w.seqid=portsequence.nextval ,w.monthsale=(Select Nvl(Sum(Sprc), 0) From  ' ||<br />                 p_Branch || '.Zsale T1 Where To_Char(T1.Sdate,' || '''' ||<br />                 v_Customer_Cc2 || '''' || ') Like ' || '''' || p_Monthid || '''' ||<br />                 ' and To_Char(T1.Sdate,' || '''' || v_Customer_Cc3 || '''' ||<br />                 ') Like ' || '''' || p_Yearid || '''' ||<br />                 '), w.updated_time= sysdate  where w.branch like ' || '''' ||<br />                 p_Branch || '''' || ' and w.brand like ' || '''' ||<br />                 p_Brand || '''' || ' and w.yearid =' || '''' || p_Yearid || '''' ||<br />                 ' and w.monthid=' || '''' || p_Monthid || '''' || '';<br />    Elsif (Flag = 0) Then<br />      Str_Sql := 'Insert into dpdt.menology values(Portsequence.Nextval, ' || '''' ||<br />                 p_Brand || '''' || ', ' || '''' || p_Branch || '''' || ', ' || '''' ||<br />                 p_Yearid || '''' || ', ' || '''' || p_Monthid || '''' ||<br />                 ' ,(Select Nvl(Sum(Sprc), 0) From  ' || p_Branch ||<br />                 '.Zsale T1 Where To_Char(T1.Sdate,' || '''' ||<br />                 v_Customer_Cc2 || '''' || ') Like ' || '''' || p_Monthid || '''' ||<br />                 ' and To_Char(T1.Sdate,' || '''' || v_Customer_Cc3 || '''' ||<br />                 ') Like ' || '''' || p_Yearid || '''' ||<br />                 '),sysdate,sysdate)';<br />    End If;<br />    Execute Immediate Str_Sql;<br />    Commit;<br />  Exception<br />    When Others Then<br />      Dbms_Output.Put_Line(Sqlerrm);<br />      Rollback;<br />    <br />  End Exec_Menology_Zsalebymonth;</font>
		</p>
		<p>
				<font face="Verdana" size="2">  /*<br />  TODO: owner="Administrator" created="2006-4-21"<br />  text="job procedure"<br />  */<br />  Procedure Exec_Menology_Actionjob Is<br />  <br />    Cursor C1 Is<br />      Select Name From Pos_Db_User Group By Name;<br />  <br />  Begin<br />    For V1 In C1 Loop<br />      Exec_Menology_Zsalebymonth(Substr(V1.Name, 1, 2),<br />                                 V1.Name,<br />                                 To_Char(Sysdate, 'yyyy'),<br />                                 To_Char(Sysdate, 'mm'));<br />      Exec_Menology_Zsalebymonth(Substr(V1.Name, 1, 2),<br />                                 V1.Name,<br />                                 To_Char(Add_Months(Sysdate, -1), 'yyyy'),<br />                                 To_Char(Add_Months(Sysdate, -1), 'mm'));<br />    <br />    End Loop;<br />    Commit;<br />  Exception<br />    When Others Then<br />      Dbms_Output.Put_Line(Sqlerrm);<br />      Rollback;<br />  End Exec_Menology_Actionjob;</font>
		</p>
		<p>
				<font face="Verdana" size="2">  Procedure Exec_Meters_Jobs Is<br />    Flag         Number;<br />    Flag2        Number;<br />    Yearsale     Number;<br />    Lastyearsale Number;<br />  Begin<br />    Select Sum(Monthsale)<br />      Into Yearsale<br />      From Dpdt.Menology<br />     Where Yearid = To_Char(Sysdate, 'yyyy');<br />    Select Sum(Monthsale)<br />      Into Lastyearsale<br />      From Dpdt.Menology<br />     Where Yearid = To_Char(Add_Months(Sysdate, -12), 'yyyy');<br />    Flag := 0;<br />    Select Count(*)<br />      Into Flag<br />      From Dpdt.Meters t<br />     Where t.Saletype = 'FINISH'<br />       And t.Yearid = To_Char(Sysdate, 'yyyy');<br />    If (Flag = 1) Then<br />      Update Dpdt.Meters t<br />         Set t.Salesum      = Yearsale,<br />             t.Updated_Time = Sysdate,<br />             t.Seqid        = Portsequence.Nextval<br />       Where t.Saletype = 'FINISH'<br />         And t.Yearid = To_Char(Sysdate, 'yyyy');<br />    Elsif (Flag = 0) Then<br />      Insert Into Dpdt.Meters<br />      Values<br />        (Portsequence.Nextval,<br />         'FINISH',<br />         Yearsale,<br />         To_Char(Sysdate, 'yyyy'),<br />         Sysdate,<br />         Sysdate);<br />    End If;<br />  <br />    Flag2 := 0;<br />    Select Count(*)<br />      Into Flag2<br />      From Dpdt.Meters t<br />     Where t.Saletype = 'FINISH'<br />       And t.Yearid = To_Char(Add_Months(Sysdate, -12), 'yyyy');<br />    If (Flag2 = 1) Then<br />      Update Dpdt.Meters t<br />         Set t.Salesum      = Lastyearsale,<br />             t.Updated_Time = Sysdate,<br />             t.Seqid        = Portsequence.Nextval<br />       Where t.Saletype = 'FINISH'<br />         And t.Yearid = To_Char(Add_Months(Sysdate, -12), 'yyyy');<br />    Elsif (Flag2 = 0) Then<br />      Insert Into Dpdt.Meters<br />      Values<br />        (Portsequence.Nextval,<br />         'FINISH',<br />         Lastyearsale,<br />         To_Char(Add_Months(Sysdate, -12), 'yyyy'),<br />         Sysdate,<br />         Sysdate);<br />    End If;<br />    Commit;<br />  Exception<br />    When Others Then<br />      Dbms_Output.Put_Line(Sqlerrm);<br />      Rollback;<br />  End Exec_Meters_Jobs;<br />  <br />  <br />  </font>
		</p>
		<p>
				<br />
				<font face="Verdana" size="2">  Procedure Test_Move_Ready is<br />    Cursor Cur Is<br />      select * from dpdt.saledtl;<br />  begin<br />    For V1 In Cur Loop<br />      Test_Move_Action(v1.brhcst,<br />                       v1.saleno,<br />                       v1.seqno,<br />                       v1.styno,<br />                       v1.sizerun,<br />                       v1.reject,<br />                       v1.qty,<br />                       v1.prc,<br />                       v1.disc,<br />                       v1.rebate,<br />                       v1.cst_prc,<br />                       v1.org_prc,<br />                       v1.sprc,<br />                       v1.rsn);<br />      /*   insert into dpdt.saledtltest<br />        (BRHCST,<br />         saleno,<br />         seqno,<br />         styno,<br />         sizerun,<br />         reject,<br />         qty,<br />         prc,<br />         disc,<br />         rebate,<br />         cst_prc,<br />         org_prc,<br />         sprc,<br />         rsn)<br />      values<br />        (v1.brhcst,<br />         v1.saleno,<br />         v1.seqno,<br />         v1.styno,<br />         v1.sizerun,<br />         v1.reject,<br />         v1.qty,<br />         v1.prc,<br />         v1.disc,<br />         v1.rebate,<br />         v1.cst_prc,<br />         v1.org_prc,<br />         v1.sprc,<br />         v1.rsn);*/<br />    End Loop;<br />    Commit;<br />  Exception<br />    When Others Then<br />      Dbms_Output.Put_Line(Sqlerrm);<br />      Rollback;<br />    <br />  End Test_Move_Ready;<br />  <br />  Procedure Test_Move_Action(brhcst  In varchar2,<br />                             saleno  In varchar2,<br />                             seqno   In integer,<br />                             styno   In varchar2,<br />                             sizerun In varchar2,<br />                             reject  In char,<br />                             qty     In integer,<br />                             prc     In number,<br />                             disc    In number,<br />                             rebate  In number,<br />                             cst_prc In number,<br />                             org_prc In number,<br />                             sprc    In char,<br />                             rsn     In char) is<br />  <br />  begin<br />    insert into dpdt.saledtltest<br />      (BRHCST,<br />       saleno,<br />       seqno,<br />       styno,<br />       sizerun,<br />       reject,<br />       qty,<br />       prc,<br />       disc,<br />       rebate,<br />       cst_prc,<br />       org_prc,<br />       sprc,<br />       rsn)<br />    values<br />      (brhcst,<br />       saleno,<br />       seqno,<br />       styno,<br />       sizerun,<br />       reject,<br />       qty,<br />       prc,<br />       disc,<br />       rebate,<br />       cst_prc,<br />       org_prc,<br />       sprc,<br />       rsn);<br />    Commit;<br />     dbms_output.put_line('ggg');<br />  Exception<br />    When Others Then<br />      Dbms_Output.Put_Line(Sqlerrm);<br />      Rollback;<br />    <br />  End Test_Move_Action;</font>
		</p>
		<p>
				<font face="Verdana" size="2">  <br />End Check_Pos_Sales;<br /></font>
		</p>
<img src ="http://www.blogjava.net/kemi/aggbug/58177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-07-14 14:05 <a href="http://www.blogjava.net/kemi/archive/2006/07/14/58177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2个INIT和UPDATE ORACLE库的Package</title><link>http://www.blogjava.net/kemi/archive/2006/07/14/58175.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Fri, 14 Jul 2006 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/07/14/58175.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/58175.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/07/14/58175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/58175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/58175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: INIT：						CREATE OR REPLACE PACKAGE BODY CUX_INIT_BASE_INFO IS								  procedure INIT_ALL is  begin    init_item;    init_item_category_bkind;    init_item_category_mkind;    init_item_categ...&nbsp;&nbsp;<a href='http://www.blogjava.net/kemi/archive/2006/07/14/58175.html'>阅读全文</a><img src ="http://www.blogjava.net/kemi/aggbug/58175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-07-14 14:03 <a href="http://www.blogjava.net/kemi/archive/2006/07/14/58175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用rownum控制查询到的结果</title><link>http://www.blogjava.net/kemi/archive/2006/07/01/56070.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Sat, 01 Jul 2006 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/07/01/56070.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/56070.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/07/01/56070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/56070.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/56070.html</trackback:ping><description><![CDATA[一个例子：<br /> select * from (select rownum row_id ,t.* from cux_package t)  where row_id between 5 and 9; <img src ="http://www.blogjava.net/kemi/aggbug/56070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-07-01 10:37 <a href="http://www.blogjava.net/kemi/archive/2006/07/01/56070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>具体的一个引入JAR入ORACLE的语句</title><link>http://www.blogjava.net/kemi/archive/2006/06/16/53209.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Fri, 16 Jun 2006 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/06/16/53209.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/53209.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/06/16/53209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/53209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/53209.html</trackback:ping><description><![CDATA[
		<font size="2">call sys.dbms_java.loadjava('-v -r -grant PUBLIC D:\Oracle\javalib\jconn2.jar')<br />注意路径是ORACLE所在机器的路径</font>
<img src ="http://www.blogjava.net/kemi/aggbug/53209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-06-16 11:55 <a href="http://www.blogjava.net/kemi/archive/2006/06/16/53209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的oracle pl/sql 调用java的实现，目标：从SYBASE数据库里向ERP数据库（Oracle）实现数据流通</title><link>http://www.blogjava.net/kemi/archive/2006/06/13/52347.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Tue, 13 Jun 2006 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/06/13/52347.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/52347.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/06/13/52347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/52347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/52347.html</trackback:ping><description><![CDATA[
		<font size="2">1.向ORACLE里导入SYBASE　JDBC　的驱动JAR。<br />　使用语言LOADJAVA。<br />　例如：SQL&gt; call dbms_java.loadjava (?-r -install -v -s -g public -genmissing<br />   absolute path to J2EE_HOME/lib/j2ee.jar?);<br />　具体可以参考　</font>
		<a href="http://www.stanford.edu/dept/itss/docs/oracle/10g/java.101/b12021/intro.htm">
				<font size="2">http://www.stanford.edu/dept/itss/docs/oracle/10g/java.101/b12021/intro.htm</font>
		</a>
		<br />
		<font size="2">2.导入后在PL/SQL DEVELOPER的JAVA SOURCE里面新建所用的JAVA CLASS　，一般采用外部调试好的JAVA ，COPY即可。<br />　create or replace and compile java source named ErpToWms as<br />import java.sql.*;<br />import java.util.*;<br />public class ErpToWms {<br /> public static String  dd()throws Exception{<br />  ResultSet rs=null;<br />  Statement stmt=null;<br />  Connection conn=null;<br />  try{<br />  Class.forName("com.sybase.jdbc2.jdbc.SybDriver").newInstance(); <br />  String url ="jdbc:sybase:Tds:192.168.0.206:4000/WMS";//myDB为你的数据库名 <br />  Properties sysProps = System.getProperties(); <br />  sysProps.put("user","sa"); <br />  sysProps.put("password",""); <br />   conn= DriverManager.getConnection(url, sysProps);<br />   stmt = conn.createStatement();<br />  String strSql = "select Count(*) from BARCODE t";<br />   rs = stmt.executeQuery(strSql);<br />  if (rs.next()) {<br />   System.out.println(rs.getString(1));<br />  }<br />  return rs.getString(1);<br />  }catch(Exception e){<br />   e.printStackTrace();<br />   return "";<br />  }finally{<br />  rs.close();<br />  stmt.close();<br />  conn.close();<br />  }<br />  }<br />    }<br />3.建立所对应的procedure或者funtion, 关键是看JAVA SOURCE的返回值而定。<br />　　例如 Function写法：<br />　　create or replace function getDataFromWms return varchar2 is<br />  language java name 'ErpToWms.dd() return String';<br />4.最后写一个简单的procedure调用funtion.OK，搞定<br /><br />有点麻烦的地方，请纠正。<br /><br /><br /></font>
<img src ="http://www.blogjava.net/kemi/aggbug/52347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-06-13 09:41 <a href="http://www.blogjava.net/kemi/archive/2006/06/13/52347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL&amp;PL/SQL (转)</title><link>http://www.blogjava.net/kemi/archive/2006/06/13/52344.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Tue, 13 Jun 2006 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/06/13/52344.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/52344.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/06/13/52344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/52344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/52344.html</trackback:ping><description><![CDATA[
		<div>
				<font size="2">
						<font face="Courier New">
								<strong>SQL&amp;PL/SQL<br /></strong>
								<font color="#ff0000">[Q]怎么样查询特殊字符，如通配符%与_</font>
								<br />[A]select * from table where name like 'A_%' escape ''<br /><font color="#ff0000">[Q]如何插入单引号到数据库表中</font><br />[A]可以用ASCII码处理，其它特殊字符如&amp;也一样，如 <br />insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符'<br />或者用两个单引号表示一个<br />or insert into t values('I''m'); -- 两个''可以表示一个'<br /><font color="#ff0000">[Q]怎样设置事务一致性</font><br />[A]set transaction [isolation level] read committed; 默认语句级一致性<br />set transaction [isolation level] serializable;<br />read only; 事务级一致性<br /><font color="#ff0000">[Q]怎么样利用游标更新数据</font><br />[A]cursor c1 is <br />select * from tablename <br />where name is null for update [of column]<br />……<br />update tablename set column = ……<br />where current of c1;<br /><font color="#ff0000">[Q]怎样自定义异常</font><br />[A] pragma_exception_init(exception_name,error_number);<br />如果立即抛出异常<br />raise_application_error(error_number,error_msg,true|false);<br />其中number从-20000到-20999，错误信息最大2048B<br />异常变量<br />SQLCODE 错误代码<br />SQLERRM 错误信息<br /><font color="#ff0000">[Q]十进制与十六进制的转换</font><br />[A]8i以上版本：<br />to_char(100,'XX')<br />to_number('4D','XX')<br />8i以下的进制之间的转换参考如下脚本<br />create or replace function to_base( p_dec in number, p_base in number ) <br />return varchar2 <br />is <br />l_str varchar2(255) default NULL; <br />l_num number default p_dec; <br />l_hex varchar2(16) default '0123456789ABCDEF'; <br />begin <br />if ( p_dec is null or p_base is null ) then <br />return null; <br />end if; <br />if ( trunc(p_dec) p_dec OR p_dec 20;<br /><font color="#ff0000">[Q]怎么样抽取重复记录</font><br />[A]select * from table t1 where where t1.rowed !=<br />(select max(rowed) from table t2 <br />where t1.id=t2.id and t1.name=t2.name)<br />或者<br />select count(*), t.col_a,t.col_b from table t<br />group by col_a,col_b<br />having count(*)&gt;1<br />如果想删除重复记录，可以把第一个语句的select替换为delete<br /><font color="#ff0000">[Q]怎么样设置自治事务</font><br />[A]8i以上版本，不影响主事务<br />pragma autonomous_transaction;<br />……<br />commit|rollback;<br /><font color="#ff0000">[Q]怎么样在过程中暂停指定时间</font><br />[A]DBMS_LOCK包的sleep过程<br />如：dbms_lock.sleep(5);表示暂停5秒。<br /><font color="#ff0000">[Q]怎么样快速计算事务的时间与日志量</font><br />[A]可以采用类似如下的脚本<br />DECLARE <br />start_time NUMBER;<br />end_time NUMBER;<br />start_redo_size NUMBER;<br />end_redo_size NUMBER;<br />BEGIN<br />start_time := dbms_utility.get_time;<br />SELECT VALUE INTO start_redo_size FROM v$mystat m,v$statname s <br />WHERE m.STATISTIC#=s.STATISTIC#<br />AND s.NAME='redo size';<br />--transaction start<br />INSERT INTO t1 <br />SELECT * FROM All_Objects; <br />--other dml statement<br />COMMIT;<br />end_time := dbms_utility.get_time;<br />SELECT VALUE INTO end_redo_size FROM v$mystat m,v$statname s <br />WHERE m.STATISTIC#=s.STATISTIC#<br />AND s.NAME='redo size';<br />dbms_output.put_line('Escape Time:'||to_char(end_time-start_time)||' centiseconds');<br />dbms_output.put_line('Redo Size:'||to_char(end_redo_size-start_redo_size)||' bytes');<br />END;<br /><font color="#ff0000">[Q]怎样创建临时表</font><br />[A]8i以上版本<br />create global temporary tablename(column list)<br />on commit preserve rows; --提交保留数据 会话临时表<br />on commit delete rows; --提交删除数据 事务临时表<br />临时表是相对于会话的，别的会话看不到该会话的数据。<br /><font color="#ff0000">[Q]怎么样在PL/SQL中执行DDL语句</font><br />[A]1、8i以下版本dbms_sql包<br />2、8i以上版本还可以用<br />execute immediate sql;<br />dbms_utility.exec_ddl_statement('sql');<br /><font color="#ff0000">[Q]怎么样获取IP地址</font><br />[A]服务器(817以上)：utl_inaddr.get_host_address<br />客户端：sys_context('userenv','ip_address')<br /><font color="#ff0000">[Q]怎么样加密存储过程</font><br />[A]用wrap命令，如（假定你的存储过程保存为a.sql）<br />wrap iname=a.sql<br />PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001<br />Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved.<br />Processing a.sql to a.plb<br />提示a.sql转换为a.plb，这就是加密了的脚本，执行a.plb即可生成加密了的存储过程<br /><font color="#ff0000">[Q]怎么样在ORACLE中定时运行存储过程</font><br />[A]可以利用dbms_job包来定时运行作业，如执行存储过程，一个简单的例子，提交一个作业：<br />VARIABLE jobno number;<br />BEGIN<br />DBMS_JOB.SUBMIT(:jobno, 'ur_procedure;',SYSDATE,'SYSDATE + 1');<br />commit;<br />END;<br />之后，就可以用以下语句查询已经提交的作业<br />select * from user_jobs;<br /><font color="#ff0000">[Q]怎么样从数据库中获得毫秒</font><br />[A]9i以上版本，有一个timestamp类型获得毫秒，如<br />SQL&gt;select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1, <br />to_char(current_timestamp) time2 from dual;<br />TIME1 TIME2<br />----------------------------- ----------------------------------------------------------------<br />2003-10-24 10:48:45.656000 24-OCT-03 10.48.45.656000 AM +08:00<br />可以看到，毫秒在to_char中对应的是FF。<br />8i以上版本可以创建一个如下的java函数<br />SQL&gt;create or replace and compile <br />java source<br />named "MyTimestamp"<br />as<br />import java.lang.String;<br />import java.sql.Timestamp;<br />public class MyTimestamp<br />{<br />public static String getTimestamp()<br />{<br />return(new Timestamp(System.currentTimeMillis())).toString();<br />}<br />};<br />SQL&gt;java created.<br />注：注意java的语法，注意大小写<br />SQL&gt;create or replace function my_timestamp return varchar2<br />as language java<br />name 'MyTimestamp.getTimestamp() return java.lang.String';<br />/<br />SQL&gt;function created.<br />SQL&gt;select my_timestamp,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') ORACLE_TIME from dual;<br />MY_TIMESTAMP ORACLE_TIME<br />------------------------ -------------------<br />2003-03-17 19:15:59.688 2003-03-17 19:15:59 <br />如果只想获得1/100秒(hsecs)，还可以利用dbms_utility.get_time<br /><font color="#ff0000">[Q]如果存在就更新，不存在就插入可以用一个语句实现吗</font><br />[A]9i已经支持了，是Merge，但是只支持select子查询，<br />如果是单条数据记录，可以写作select …… from dual的子查询。<br />语法为：<br />MERGE INTO table<br />USING data_source<br />ON (condition)<br />WHEN MATCHED THEN update_clause<br />WHEN NOT MATCHED THEN insert_clause;<br />如<br />MERGE INTO course c<br />USING (SELECT course_name, period,<br />course_hours<br />FROM course_updates) cu<br />ON (c.course_name = cu.course_name<br />AND c.period = cu.period)<br />WHEN MATCHED THEN<br />UPDATE<br />SET c.course_hours = cu.course_hours<br />WHEN NOT MATCHED THEN<br />INSERT (c.course_name, c.period,<br />c.course_hours)<br />VALUES (cu.course_name, cu.period,<br />cu.course_hours);<br /><font color="#ff0000">[Q]怎么实现左联，右联与外联</font><br />[A]在9i以前可以这么写:<br />左联：<br />select a.id,a.name,b.address from a,b <br />where a.id=b.id(+)<br />右联:<br />select a.id,a.name,b.address from a,b <br />where a.id(+)=b.id<br />外联<br />SELECT a.id,a.name,b.address<br />FROM a,b<br />WHERE a.id = b.id(+)<br />UNION<br />SELECT b.id,'' name,b.address<br />FROM b<br />WHERE NOT EXISTS (<br />SELECT * FROM a<br />WHERE a.id = b.id);<br />在9i以上，已经开始支持SQL99标准，所以，以上语句可以写成：<br />默认内部联结：<br />select a.id,a.name,b.address,c.subject<br />from (a inner join b on a.id=b.id) <br />inner join c on b.name = c.name<br />where other_clause<br />左联<br />select a.id,a.name,b.address<br />from a left outer join b on a.id=b.id <br />where other_clause<br />右联<br />select a.id,a.name,b.address<br />from a right outer join b on a.id=b.id <br />where other_clause<br />外联<br />select a.id,a.name,b.address<br />from a full outer join b on a.id=b.id <br />where other_clause<br />or<br />select a.id,a.name,b.address<br />from a full outer join b using (id)<br />where other_clause<br /><font color="#ff0000">[Q]怎么实现一条记录根据条件多表插入</font><br />[A]9i以上可以通过Insert all语句完成，仅仅是一个语句，如：<br />INSERT ALL<br />WHEN (id=1) THEN<br />INTO table_1 (id, name)<br />values(id,name)<br />WHEN (id=2) THEN<br />INTO table_2 (id, name)<br />values(id,name)<br />ELSE<br />INTO table_other (id, name)<br />values(id, name)<br />SELECT id,name<br />FROM a;<br />如果没有条件的话，则完成每个表的插入，如<br />INSERT ALL<br />INTO table_1 (id, name)<br />values(id,name)<br />INTO table_2 (id, name)<br />values(id,name)<br />INTO table_other (id, name)<br />values(id, name)<br />SELECT id,name<br />FROM a;<br /><font color="#ff0000">[Q]如何实现行列转换</font><br />[A]1、固定列数的行列转换<br />如<br />student subject grade<br />---------------------------<br />student1 语文 80<br />student1 数学 70<br />student1 英语 60<br />student2 语文 90<br />student2 数学 80<br />student2 英语 100<br />……<br />转换为 <br />语文 数学 英语<br />student1 80 70 60<br />student2 90 80 100<br />……<br />语句如下：<br />select student,sum(decode(subject,'语文', grade,null)) "语文",<br />sum(decode(subject,'数学', grade,null)) "数学",<br />sum(decode(subject,'英语', grade,null)) "英语"<br />from table<br />group by student<br />2、不定列行列转换<br />如<br />c1 c2<br />--------------<br />1 我<br />1 是<br />1 谁</font>
				</font>
		</div>
<img src ="http://www.blogjava.net/kemi/aggbug/52344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-06-13 09:33 <a href="http://www.blogjava.net/kemi/archive/2006/06/13/52344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>群里一位大侠帮我解决的双表关联，整理</title><link>http://www.blogjava.net/kemi/archive/2006/06/01/49409.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Thu, 01 Jun 2006 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/06/01/49409.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/49409.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/06/01/49409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/49409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/49409.html</trackback:ping><description><![CDATA[
		<font face="Arial" size="2">条件是A,B两表，A中有ID，同一ID有两值，以它更新时间为区别，现在要取的是最新的ID那个值，并且关联到B中的一属性。SQL不太好，留在这里以后继续学习<br /><br />SELECT  Distinct tab1.CUSTOMER_ID, ACV.LAST_NAME,tab1.maxla<br />   FROM AR_CONTACTS_V ACV,<br />        (SELECT RC.CUSTOMER_ID CUSTOMER_ID, MAX(ACV.LAST_UPDATE_DATE) MAXLA<br />           FROM AR_CONTACTS_V ACV, RA_CUSTOMERS RC<br />          WHERE ACV.CUSTOMER_ID(+) = RC.CUSTOMER_ID<br />          GROUP BY RC.CUSTOMER_ID) TAB1<br />  WHERE ACV.CUSTOMER_ID(+) = TAB1.CUSTOMER_ID<br />    AND ACV.LAST_UPDATE_DATE(+) = TAB1.MAXLA<br /><br /><br /></font>
<img src ="http://www.blogjava.net/kemi/aggbug/49409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-06-01 09:38 <a href="http://www.blogjava.net/kemi/archive/2006/06/01/49409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 存储过程调用java class 体会</title><link>http://www.blogjava.net/kemi/archive/2006/05/29/48704.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Mon, 29 May 2006 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/05/29/48704.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/48704.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/05/29/48704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/48704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/48704.html</trackback:ping><description><![CDATA[1.PL/SQL Developer下直接粘贴入JAVA SOURCE；<br />2.建立调用的存储过程<br />create or replace procedure SendMailP as<br />language java<br />name 'KemiClass.send()';<br />3.注意程序体里的文件路径，可以在调试的时候通过操作表来检测。<br />以上方法个人感觉等同于loadjava命令，请指教<img src ="http://www.blogjava.net/kemi/aggbug/48704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-05-29 11:37 <a href="http://www.blogjava.net/kemi/archive/2006/05/29/48704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 LDAP</title><link>http://www.blogjava.net/kemi/archive/2006/05/09/45224.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Tue, 09 May 2006 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/05/09/45224.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/45224.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/05/09/45224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/45224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/45224.html</trackback:ping><description><![CDATA[
		<div class="box_l_c">
				<h1>
						<font face="Arial" color="#0000ff" size="2">LDAP的详细介绍 </font>
				</h1>
				<h1>
						<br />
						<font face="Arial" color="#0000ff" size="2">如果你在计算机行业工作，那么对LDAP可能早有耳闻了。想深入地了解LDAP吗？那么可以好好地读一下这篇文章。这篇介绍性的文章是一系列介绍如何在企业中设计、实现和集成LDAP环境的文章的头一篇。主要是先让你熟悉一下LDAP的基本概念，那些比较困难的细节问题将放到以后讨论。在这篇文章中我们将要介绍： <br /><br />什么是LDAP? <br /><br />什么时候该用LDAP存储数据？ <br /><br />LDAP目录树的结构 <br /><br />单独的LDAP记录 <br /><br />作为例子的一个单独的数据项 <br /><br />LDAP复制 <br /><br />安全和访问控制 <br /><br />现在LDAP技术不仅发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据：电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表，等等。通过把LDAP目录作为系统集成中的一个重要环节，可以简化员工在企业内部查询信息的步骤，甚至连主要的数据源都可以放在任何地方。如果Oracle、Sybase、Informix或Microsoft SQL数据库中已经存储了类似的数据，那么LDAP和这些数据库到底有什么不同呢？是什么让它更具优势？请继续读下去吧！ <br /><br />什么是LDAP? <br />LDAP的英文全称是Lightweight Directory Access Protocol，一般都简称为LDAP。它是基于X.500标准的，但是简单多了并且可以根据需要定制。与X.500不同，LDAP支持TCP/IP，这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义，所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。 <br /><br />怎么使用LDAP这个术语呢？ <br />在日常交谈中，你可能会听到有些人这么说：“我们要把那些东西存在LDAP中吗？”，或者“从LDAP数据库中取出那些数据！”，又或者“我们怎么把LDAP和关系型数据库集成在一起？”。严格地说，LDAP根本不是数据库而是用来访问存储在信息目录（也就是LDAP目录）中的信息的协议。更为确切和正式的说法应该是象这样的：“通过使用LDAP，可以在信息目录的正确位置读取（或存储）数据”。但是，也没有必要吹毛求疵，尽管表达得不够准确，我们也都知道对方在说什么。 <br /><br />LDAP目录是数据库吗？ <br />就象Sybase、Oracle、Informix或Microsoft的数据库管理系统（DBMS）是用于处理查询和更新关系型数据库那样，LDAP服务器也是用来处理查询和更新LDAP目录的。换句话来说LDAP目录也是一种类型的数据库，但是不是关系型数据库。不象被设计成每分钟需要处理成百上千条数据变化的数据库，例如：在电子商务中经常用到的在线交易处理（OLTP）系统，LDAP主要是优化数据读取的性能。 <br /><br />LDAP目录的优势 <br />现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。我在这里说的不过是一些基本的原因，请你注意一下这不过是一小部分原因。 <br /><br />可能LDAP最大的优势是：可以在任何计算机平台上，用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易定制应用程序为它加上LDAP的支持。 <br /><br />LDAP协议是跨平台的和标准的协议，因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上，LDAP得到了业界的广泛认可，因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持，因为他们根本不用考虑另一端（客户端或服务端）是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器（或者还可能是具有LDAP界面的关系型数据库），因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。与LDAP不同的是，如果软件产商想在软件产品中集成对DBMS的支持，那么通常都要对每一个数据库服务器单独定制。 <br /><br />不象很多商用的关系型数据库，你不必为LDAP的每一个客户端连接或许可协议付费。 <br /><br />大多数的LDAP服务器安装起来很简单，也容易维护和优化。 <br /><br />LDAP服务器可以用“推”或“拉”的方法复制部分或全部数据，例如：可以把数据“推”到远程的办公室，以增加数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配置。如果要在DBMS中使用相同的复制功能，数据库产商就会要你支付额外的费用，而且也很难管理。 <br /><br />LDAP允许你根据需要使用ACI（一般都称为ACL或者访问控制列表）控制对数据读和写的权限。例如，设备管理员可以有权改变员工的工作地点和办公室号码，但是不允许改变记录中其它的域。ACI可以根据谁访问数据、访问什么数据、数据存在什么地方以及其它对数据进行访问控制。因为这些都是由LDAP目录服务器完成的，所以不用担心在客户端的应用程序上是否要进行安全检查。 <br /><br />LDAP对于这样存储这样的信息最为有用，也就是数据需要从不同的地点读取，但是不需要经常更新。例如，这些信息存储在LDAP目录中是十分有效的： <br /><br />l 公司员工的电话号码簿和组织结构图 <br /><br />l 客户的联系信息 <br /><br />l 计算机管理需要的信息，包括NIS映射、email假名，等等 <br /><br />l 软件包的配置信息 <br /><br />l 公用证书和安全密匙 <br /><br />什么时候该用LDAP存储数据？ <br />大多数的LDAP服务器都为读密集型的操作进行专门的优化。因此，当从LDAP服务器中读取数据的时候会比从专门为OLTP优化的关系型数据库中读取数据快一个数量级。也是因为专门为读的性能进行优化，大多数的LDAP目录服务器并不适合存储需要需要经常改变的数据。例如，用LDAP服务器来存储电话号码是一个很好的选择，但是它不能作为电子商务站点的数据库服务器。 <br /><br />如果下面每一个问题的答案都是“是”，那么把数据存在LDAP中就是一个好主意。 <br /><br />l 需要在任何平台上都能读取数据吗？ <br /><br />l 每一个单独的记录项是不是每一天都只有很少的改变？ <br /><br />l 可以把数据存在平面数据库（flat database）而不是关系型数据库中吗？换句话来说，也就是不管什么范式不范式的，把所有东西都存在一个记录中（差不多只要满足第一范式）。 <br /><br />最后一个问题可能会唬住一些人，其实用平面数据库去存储一些关系型的数据也是很一般的。例如，一条公司员工的记录就可以包含经理的登录名。用LDAP来存储这类信息是很方便的。一个简单的判断方法：如果可以把保数据存在一张张的卡片里，就可以很容易地把它存在LDAP目录里。 <br /><br />LDAP目录树的结构 <br />LDAP目录以树状的层次结构来存储数据。如果你对自顶向下的DNS树或UNIX文件的目录树比较熟悉，也就很容易掌握LDAP目录树这个概念了。就象DNS的主机名那样，LDAP目录记录的标识名（Distinguished Name，简称DN）是用来读取单个记录，以及回溯到树的顶部。后面会做详细地介绍。 <br /><br />为什么要用层次结构来组织数据呢？原因是多方面的。下面是可能遇到的一些情况： <br /><br />l 如果你想把所有的美国客户的联系信息都“推”到位于到西雅图办公室（负责营销）的LDAP服务器上，但是你不想把公司的资产管理信息“推”到那里。 <br /><br />l 你可能想根据目录树的结构给予不同的员工组不同的权限。在下面的例子里，资产管理组对“asset-mgmt”部分有完全的访问权限，但是不能访问其它地方。 <br /><br />l 把LDAP存储和复制功能结合起来，可以定制目录树的结构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每分钟更新的美国销售状况的信息，但是欧洲的销售情况就只要每小时更新一次就行了。 <br /><br />刨根问底：基准DN <br />LDAP目录树的最顶部就是根，也就是所谓的“基准DN”。基准DN通常使用下面列出的三种格式之一。假定我在名为FooBar的电子商务公司工作，这家公司在Internet上的名字是foobar.com。 <br /><br />o="FooBar, Inc.", c=US <br /><br />（以X.500格式表示的基准DN） <br /><br />在这个例子中，o=FooBar, Inc. 表示组织名，在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前，一般都用这种方式来表示基准DN。但是事物总是在不断变化的，现在所有的公司都已经（或计划）上Internet上。随着Internet的全球化，在基准DN中使用国家代码很容易让人产生混淆。现在，X.500格式发展成下面列出的两种格式。 <br /><br />o=foobar.com <br /><br />（用公司的Internet地址表示的基准DN） <br /><br />这种格式很直观，用公司的域名作为基准DN。这也是现在最常用的格式。 <br /><br />dc=foobar, dc=com <br /><br />（用DNS域名的不同部分组成的基准DN） <br /><br />就象上面那一种格式，这种格式也是以DNS域名为基础的，但是上面那种格式不改变域名（也就更易读），而这种格式把域名：foobar.com分成两部分 dc=foobar, dc=com。在理论上，这种格式可能会更灵活一点，但是对于最终用户来说也更难记忆一点。考虑一下foobar.com这个例子。当foobar.com和gizmo.com合并之后，可以简单的把“dc=com”当作基准DN。把新的记录放到已经存在的dc=gizmo, dc=com目录下，这样就简化了很多工作（当然，如果foobar.com和wocket.edu合并，这个方法就不能用了）。如果LDAP服务器是新安装的，我建议你使用这种格式。再请注意一下，如果你打算使用活动目录（Actrive Directory），Microsoft已经限制你必须使用这种格式。 <br /><br />更上一层楼：在目录树中怎么组织数据 <br />在UNIX文件系统中，最顶层是根目录（root）。在根目录的下面有很多的文件和目录。象上面介绍的那样，LDAP目录也是用同样的方法组织起来的。 <br /><br />在根目录下，要把数据从逻辑上区分开。因为历史上（X.500）的原因，大多数LDAP目录用OU从逻辑上把数据分开来。OU表示“Organization Unit”，在X.500协议中是用来表示公司内部的机构：销售部、财务部，等等。现在LDAP还保留ou=这样的命名规则，但是扩展了分类的范围，可以分类为：ou=people, ou=groups, ou=devices，等等。更低一级的OU有时用来做更细的归类。例如：LDAP目录树（不包括单独的记录）可能会是这样的： <br /><br />dc=foobar, dc=com <br /><br />ou=customers <br /><br />ou=asia <br /><br />ou=europe <br /><br />ou=usa <br /><br />ou=employees <br /><br />ou=rooms <br /><br />ou=groups <br /><br />ou=assets-mgmt <br /><br />ou=nisgroups <br /><br />ou=recipes <br /><br />单独的LDAP记录 <br />DN是LDAP记录项的名字 <br />在LDAP目录中的所有记录项都有一个唯一的“Distinguished Name”，也就是DN。每一个LDAP记录项的DN是由两个部分组成的：相对DN（RDN）和记录在LDAP目录中的位置。 <br /><br />RDN是DN中与目录树的结构无关的部分。在LDAP目录中存储的记录项都要有一个名字，这个名字通常存在cn（Common Name）这个属性里。因为几乎所有的东西都有一个名字，在LDAP中存储的对象都用它们的cn值作为RDN的基础。如果我把最喜欢的吃燕麦粥食谱存为一个记录，我就会用cn=Oatmeal Deluxe作为记录项的RDN。 <br /><br />l 我的LDAP目录的基准DN是dc=foobar,dc=com <br /><br />l 我把自己的食谱作为LDAP的记录项存在ou=recipes <br /><br />l 我的LDAP记录项的RDN设为cn=Oatmeal Deluxe <br /><br />上面这些构成了燕麦粥食谱的LDAP记录的完整DN。记住，DN的读法和DNS主机名类似。下面就是完整的DN： <br /><br />cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com <br /><br />举一个实际的例子来说明DN <br />现在为公司的员工设置一个DN。可以用基于cn或uid（User ID），作为典型的用户帐号。例如，FooBar的员工Fran Smith（登录名：fsmith）的DN可以为下面两种格式： <br /><br />uid=fsmith,ou=employees,dc=foobar,dc=com <br /><br />（基于登录名） <br /><br />LDAP（以及X.500）用uid表示“User ID”，不要把它和UNIX的uid号混淆了。大多数公司都会给每一个员工唯一的登录名，因此用这个办法可以很好地保存员工的信息。你不用担心以后还会有一个叫Fran Smith的加入公司，如果Fran改变了她的名字（结婚？离婚？或宗教原因？），也用不着改变LDAP记录项的DN。 <br /><br />cn=Fran Smith,ou=employees,dc=foobar,dc=com <br /><br />（基于姓名） <br /><br />可以看到这种格式使用了Common Name（CN）。可以把Common Name当成一个人的全名。这种格式有一个很明显的缺点就是：如果名字改变了，LDAP的记录就要从一个DN转移到另一个DN。但是，我们应该尽可能地避免改变一个记录项的DN。 <br /><br />定制目录的对象类型 <br />你可以用LDAP存储各种类型的数据对象，只要这些对象可以用属性来表示，下面这些是可以在LDAP中存储的一些信息： <br /><br />l 员工信息：员工的姓名、登录名、口令、员工号、他的经理的登录名，邮件服务器，等等。 <br /><br />l 物品跟踪信息：计算机名、IP地址、标签、型号、所在位置，等等。 <br /><br />l 客户联系列表：客户的公司名、主要联系人的电话、传真和电子邮件，等等。 <br /><br />l 会议厅信息：会议厅的名字、位置、可以坐多少人、电话号码、是否有投影机。 <br /><br />l 食谱信息：菜的名字、配料、烹调方法以及准备方法。 <br /><br />因为LDAP目录可以定制成存储任何文本或二进制数据，到底存什么要由你自己决定。LDAP目录用对象类型（object classes）的概念来定义运行哪一类的对象使用什么属性。在几乎所有的LDAP服务器中，你都要根据自己的需要扩展基本的LDAP目录的功能，创建新的对象类型或者扩展现存的对象类型。 <br /><br />LDAP目录以一系列“属性对”的形式来存储记录项，每一个记录项包括属性类型和属性值（这与关系型数据库用行和列来存取数据有根本的不同）。下面是我存在LDAP目录中的一部分食谱记录： <br /><br />dn: cn=Oatmeal Deluxe, ou=recipes, dc=foobar, dc=com <br /><br />cn: Instant Oatmeal Deluxe <br /><br />recipeCuisine: breakfast <br /><br />recipeIngredient: 1 packet instant oatmeal <br /><br />recipeIngredient: 1 cup water <br /><br />recipeIngredient: 1 pinch salt <br /><br />recipeIngredient: 1 tsp brown sugar <br /><br />recipeIngredient: 1/4 apple, any type <br /><br />请注意上面每一种配料都作为属性recipeIngredient值。LDAP目录被设计成象上面那样为一个属性保存多个值的，而不是在每一个属性的后面用逗号把一系列值分开。 <br /><br />因为用这样的方式存储数据，所以数据库就有很大的灵活性，不必为加入一些新的数据就重新创建表和索引。更重要的是，LDAP目录不必花费内存或硬盘空间处理“空”域，也就是说，实际上不使用可选择的域也不会花费你任何资源。 <br /><br />作为例子的一个单独的数据项 <br />让我们看看下面这个例子。我们用Foobar, Inc.的员工Fran Smith的LDAP记录。这个记录项的格式是LDIF，用来导入和导出LDAP目录的记录项。 <br /><br />dn: uid=fsmith, ou=employees, dc=foobar, dc=com <br /><br />objectclass: person <br /><br />objectclass: organizationalPerson <br /><br />objectclass: inetOrgPerson <br /><br />objectclass: foobarPerson <br /><br />uid: fsmith <br /><br />givenname: Fran <br /><br />sn: Smith <br /><br />cn: Fran Smith <br /><br />cn: Frances Smith <br /><br />telephonenumber: 510-555-1234 <br /><br />roomnumber: 122G <br /><br />o: Foobar, Inc. <br /><br />mailRoutingAddress: </font>
						<a href="mailto:fsmith@foobar.com">
								<font face="Arial" color="#0000ff" size="2">fsmith@foobar.com </font>
						</a>
						<br />
						<br />
						<font face="Arial" color="#0000ff" size="2">mailhost: mail.foobar.com <br /><br />userpassword: {crypt}3x1231v76T89N <br /><br />uidnumber: 1234 <br /><br />gidnumber: 1200 <br /><br />homedirectory: /home/fsmith <br /><br />loginshell: /usr/local/bin/bash <br /><br />属性的值在保存的时候是保留大小写的，但是在默认情况下搜索的时候是不区分大小写的。某些特殊的属性（例如，password）在搜索的时候需要区分大小写。 <br /><br />让我们一点一点地分析上面的记录项。 <br /><br />dn: uid=fsmith, ou=employees, dc=foobar, dc=com <br /><br />这是Fran的LDAP记录项的完整DN，包括在目录树中的完整路径。LDAP（和X.500）使用uid（User ID），不要把它和UNIX的uid号混淆了。 <br /><br />objectclass: person <br /><br />objectclass: organizationalPerson <br /><br />objectclass: inetOrgPerson <br /><br />objectclass: foobarPerson <br /><br />可以为任何一个对象根据需要分配多个对象类型。person对象类型要求cn（common name）和sn（surname）这两个域不能为空。persion对象类型允许有其它的可选域，包括givenname、telephonenumber，等等。organizational Person给person加入更多的可选域，inetOrgPerson又加入更多的可选域（包括电子邮件信息）。最后，foobarPerson是为Foobar定制的对象类型，加入了很多定制的属性。 <br /><br />uid: fsmith <br /><br />givenname: Fran <br /><br />sn: Smith <br /><br />cn: Fran Smith <br /><br />cn: Frances Smith <br /><br />telephonenumber: 510-555-1234 <br /><br />roomnumber: 122G <br /><br />o: Foobar, Inc. <br /><br />以前说过了，uid表示User ID。当看到uid的时候，就在脑袋里想一想“login”。 <br /><br />请注意CN有多个值。就象上面介绍的，LDAP允许某些属性有多个值。为什么允许有多个值呢？假定你在用公司的LDAP服务器查找Fran的电话号码。你可能只知道她的名字叫Fran，但是对人力资源处的人来说她的正式名字叫做Frances。因为保存了她的两个名字，所以用任何一个名字检索都可以找到Fran的电话号码、电子邮件和办公房间号，等等。 <br /><br />mailRoutingAddress: </font>
						<a href="mailto:fsmith@foobar.com">
								<font face="Arial" color="#0000ff" size="2">fsmith@foobar.com </font>
						</a>
						<br />
						<br />
						<font size="2">
								<font color="#0000ff">
										<font face="Arial">mailhost: mail.foobar.com <br /><br />就象现在大多数的公司都上网了，Foobar用Sendmail发送邮件和处理外部邮件路由信息。Foobar把所有用户的邮件信息都存在LDAP中。最新版本的Sendmail支持这项功能。 <br /><br />Userpassword: {crypt}3x1231v76T89N <br /><br />uidnumber: 1234 <br /><br />gidnumber: 1200 <br /><br />gecos: Frances Smith <br /><br />homedirectory: /home/fsmith <br /><br />loginshell: /usr/local/bin/bash <br /><br />注意，Foobar的系统管理员把所有用户的口令映射信息也都存在LDAP中。FoobarPerson类型的对象具有这种能力。再注意一下，用户口令是用UNIX的口令加密格式存储的。UNIX的uid在这里为uidnumber。提醒你一下，关于如何在LDAP中保存NIS信息，有完整的一份RFC。在以后的文章中我会谈一谈NIS的集成。 <br /><br />LDAP复制 <br />LDAP服务器可以使用基于“推”或者“拉”的技术，用简单或基于安全证书的安全验证，复制一部分或者所有的数据。 <br /><br />例如，Foobar有一个“公用的”LDAP服务器，地址为ldap.foobar.com，端口为389。Netscape Communicator的电子邮件查询功能、UNIX的“ph”命令要用到这个服务器，用户也可以在任何地方查询这个服务器上的员工和客户联系信息。公司的主LDAP服务器运行在相同的计算机上，不过端口号是1389。 <br /><br />你可能即不想让员工查询资产管理或食谱的信息，又不想让信息技术人员看到整个公司的LDAP目录。为了解决这个问题，Foobar有选择地把子目录树从主LDAP服务器复制到“公用”LDAP服务器上，不复制需要隐藏的信息。为了保持数据始终是最新的，主目录服务器被设置成即时“推”同步。这些种方法主要是为了方便，而不是安全，因为如果有权限的用户想查询所有的数据，可以用另一个LDAP端口。 <br /><br />假定Foobar通过从奥克兰到欧洲的低带宽数据的连接用LDAP管理客户联系信息。可以建立从ldap.foobar.com:1389到munich-ldap.foobar.com:389的数据复制，象下面这样： <br /><br />periodic pull: ou=asia,ou=customers,o=sendmail.com <br /><br />periodic pull: ou=us,ou=customers,o=sendmail.com <br /><br />immediate push: ou=europe,ou=customers,o=sendmail.com <br /><br />“拉”连接每15分钟同步一次，在上面假定的情况下足够了。“推”连接保证任何欧洲的联系信息发生了变化就立即被“推”到Munich。 <br /><br />用上面的复制模式，用户为了访问数据需要连接到哪一台服务器呢？在Munich的用户可以简单地连接到本地服务器。如果他们改变了数据，本地的LDAP服务器就会把这些变化传到主LDAP服务器。然后，主LDAP服务器把这些变化“推”回本地的“公用”LDAP服务器保持数据的同步。这对本地的用户有很大的好处，因为所有的查询（大多数是读）都在本地的服务器上进行，速度非常快。当需要改变信息的时候，最终用户不需要重新配置客户端的软件，因为LDAP目录服务器为他们完成了所有的数据交换工作。 <br /><br />安全和访问控制 <br />LDAP提供很复杂的不同层次的访问控制或者ACI。因这些访问可以在服务器端控制，这比用客户端的软件保证数据的安全可安全多了。 <br /><br />用LDAP的ACI，可以完成： <br /><br />l 给予用户改变他们自己的电话号码和家庭地址的权限，但是限制他们对其它数据（如，职务名称，经理的登录名，等等）只有“只读”权限。 <br /><br />l 给予“HR-admins”组中的所有人权限以改变下面这些用户的信息：经理、工作名称、员工号、部门名称和部门号。但是对其它域没有写权限。 <br /><br />l 禁止任何人查询LDAP服务器上的用户口令，但是可以允许用户改变他或她自己的口令。 <br /><br />l 给予经理访问他们上级的家庭电话的只读权限，但是禁止其他人有这个权限。 <br /><br />l 给予“host-admins”组中的任何人创建、删除和编辑所有保存在LDAP服务器中的与计算机主机有关的信息 <br /><br />l 通过Web，允许“foobar-sales”组中的成员有选择地给予或禁止他们自己读取一部分客户联系数据的读权限。这将允许他们把客户联系信息下载到本地的笔记本电脑或个人数字助理（PDA）上。（如果销售人员的软件都支持LDAP，这将非常有用） <br /><br />l 通过Web，允许组的所有者删除或添加他们拥有的组的成员。例如：可以允许销售经理给予或禁止销售人员改变Web页的权限。也可以允许邮件假名（mail aliase）的所有者不经过IT技术人员就直接从邮件假名中删除或添加用户。“公用”的邮件列表应该允许用户从邮件假名中添加或删除自己（但是只能是自己）。也可以对IP地址或主机名加以限制。例如，某些域只允许用户IP地址以192.168.200.*开头的有读的权限，或者用户反向查找DNS得到的主机名必须为*.foobar.com。 <br /><br /> </font>
										<font face="Arial">
										</font>
								</font>
						</font>
				</h1>
		</div>
<img src ="http://www.blogjava.net/kemi/aggbug/45224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-05-09 15:48 <a href="http://www.blogjava.net/kemi/archive/2006/05/09/45224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OLAP 小记</title><link>http://www.blogjava.net/kemi/archive/2006/05/07/44890.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Sun, 07 May 2006 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/05/07/44890.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/44890.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/05/07/44890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/44890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/44890.html</trackback:ping><description><![CDATA[
		<table class="htb wr" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<div class="box2 p14">
												<font face="Arial">
														<font size="2">
																<b>OLAP</b>，英文全称为<b>On-Line Analysis Processing</b>，中文名称为<b>联机分析处理</b>，也称为<b>在线<br />分析处理</b>。<br /><br />随着数据库技术的发展和应用，数据库存储的数据量从20世纪80年代的兆（M）字节及千兆（G）<br />字节过渡到现在的兆兆（T）字节和千兆兆（P）字节，同时，用户的查询需求也越来越复杂，涉<br />及的已不仅是查询或操纵一张关系表中的一条或几条记录，而且要对多张表中千万条记录的数据<br />进行数据分析和信息综合，关系数据库系统已不能全部满足这一要求。操作型应用和分析型应用，<br />特别是在性能上难以两全，人们常常在关系数据库中放宽了对冗余的限制，引入了统计及综合数<br />据，但这些统计综合数据的应用逻辑是分散而杂乱的、非系统化的，因此分析功能有限，不灵活，<br />维护困难。在国外，不少软件厂商采取了发展其前端产品来弥补关系数据库管理系统支持的不足，<br />他们通过专门的数据综合引擎，辅之以更加直观的数据访问界面，力图统一分散的公共应用逻辑，<br />在短时间内响应非数据处理专业人员的复杂查询要求。1993年，E.F.Codd（关系数据库之父）将<br />这类技术定义为“OLAP”。<br /><br />OLAP是共享多维信息的、针对特定问题的联机数据访问和分析的快速软件技术。它通过对信息的<br />多种可能的观察形式进行快速、稳定一致和交互性的存取，允许管理决策人员对数据进行深入观察<br />。决策数据是多维数据，多维数据就是决策的主要内容。OLAP专门设计用于支持复杂的分析操作，<br />侧重对决策人员和高层管理人员的决策支持，可以根据分析人员的要求快速、灵活地进行大数据量<br />的复杂查询处理，并且以一种直观而易懂的形式将查询结果提供给决策人员，以便他们准确掌握企<br />业（公司）的经营状况，了解对象的需求，制定正确的方案。<br /><br />OLAP具有灵活的分析功能、直观的数据操作和分析结果可视化表示等突出优点，从而使用户对基<br />于大量复杂数据的分析变得轻松而高效，以利于迅速做出正确判断。它可用于证实人们提出的复杂<br />的假设，其结果是以图形或者表格的形式来表示的对信息的总结。它并不将异常信息标记出来，是<br />一种知识证实的方法。 </font>
												</font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/kemi/aggbug/44890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-05-07 17:32 <a href="http://www.blogjava.net/kemi/archive/2006/05/07/44890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE  成长：ORACLE JOBS 参数</title><link>http://www.blogjava.net/kemi/archive/2006/04/21/42317.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Fri, 21 Apr 2006 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/04/21/42317.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/42317.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/04/21/42317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/42317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/42317.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" size="2">DBA_JOBS<br />＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />字段（列）          类型                 描述 <br />JOB                NUMBER          任务的唯一标示号 <br />LOG_USER           VARCHAR2(30)    提交任务的用户 <br />PRIV_USER          VARCHAR2(30)    赋予任务权限的用户 <br />SCHEMA_USER        VARCHAR2(30)    对任务作语法分析的用户模式 <br />LAST_DATE          DATE            最后一次成功运行任务的时间 <br />LAST_SEC           VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小时，分钟和秒 <br />THIS_DATE     DATE            正在运行任务的开始时间，如果没有运行任务则为null <br />THIS_SEC     VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小时，分钟和秒 <br />NEXT_DATE          DATE            下一次定时运行任务的时间 <br />NEXT_SEC           VARCHAR2(8)     如HH24:MM:SS格式的next_date日期的小时，分钟和秒 <br />TOTAL_TIME         NUMBER          该任务运行所需要的总时间，单位为秒 <br />BROKEN             VARCHAR2(1)     标志参数，Y标示任务中断，以后不会运行 <br />INTERVAL           VARCHAR2(200)   用于计算下一运行时间的表达式 <br />FAILURES    NUMBER     任务运行连续没有成功的次数 <br />WHAT               VARCHAR2(2000)  执行任务的PL/SQL块 <br />CURRENT_SESSION_LABEL RAW          MLSLABEL 该任务的信任Oracle会话符 <br />CLEARANCE_HI      RAW MLSLABEL     该任务可信任的Oracle最大间隙 <br />CLEARANCE_LO      RAW              MLSLABEL 该任务可信任的Oracle最小间隙 <br />NLS_ENV           VARCHAR2(2000)   任务运行的NLS会话设置 <br />MISC_ENV          RAW(32)          任务运行的其他一些会话参数 </font>
		</p>
		<p>
				<font face="Arial" size="2">
				</font>
		</p>
		<p>
				<br />
				<font face="Arial" size="2">描述                    INTERVAL参数值 <br />每天午夜12点            'TRUNC(SYSDATE + 1)' <br />每天早上8点30分         'TRUNC(SYSDATE + 1) + （8*60+30）/(24*60)' <br />每星期二中午12点         'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' <br />每个月第一天的午夜12点    'TRUNC(LAST_DAY(SYSDATE ) + 1)' <br />每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' <br />每星期六和日早上6点10分    'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + （6×60+10）/（24×60）' </font>
		</p>
<img src ="http://www.blogjava.net/kemi/aggbug/42317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-04-21 14:58 <a href="http://www.blogjava.net/kemi/archive/2006/04/21/42317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE成长 ：一个动态SQL</title><link>http://www.blogjava.net/kemi/archive/2006/04/20/42197.html</link><dc:creator>Kimi</dc:creator><author>Kimi</author><pubDate>Thu, 20 Apr 2006 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/kemi/archive/2006/04/20/42197.html</guid><wfw:comment>http://www.blogjava.net/kemi/comments/42197.html</wfw:comment><comments>http://www.blogjava.net/kemi/archive/2006/04/20/42197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kemi/comments/commentRss/42197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kemi/services/trackbacks/42197.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Garamond">
						<font size="2">CREATE OR REPLACE Procedure Filldpb(Username1 In Varchar2) Is</font>
				</font>
		</p>
		<p>
				<font face="Garamond">
						<font size="2"> Str_Sql Varchar2(1000);<br /> v_Customer_Cc1 Constant Varchar2(20) := 'DP';<br /> v_Customer_Cc2 Constant Varchar2(20) := 'mm';<br /> v_Customer_Cc3 Constant Varchar2(20) := 'yyyy';<br /> Logid Number(20);</font>
				</font>
		</p>
		<p>
				<font face="Garamond">
						<font size="2">Begin<br /> Logid := 0;<br /> Select Decode((Select Nvl(Menologyid, 0)<br />         From Dpdt.Menology Ec<br />         Where Ec.Brand = 'DP' And Ec.Branch = Username1 And Ec.Yearid = To_Char(Sysdate, 'yyyy') And<br />            Ec.Monthid = To_Char(Sysdate, 'mm')), Null, 0, 1)<br /> Into Logid<br /> From Dual;</font>
				</font>
		</p>
		<p>
				<font face="Garamond" size="2"> If (Logid &lt;&gt; 0) Then<br />  Str_Sql := 'Update dpdt.menology w Set w.sumsale=(Select Nvl(Sum(Sprc), 0) From  ' || Username1 ||<br />        '.Zsale T1 Where To_Char(T1.Sdate,' || '''' || v_Customer_Cc2 || '''' || ') Like To_Char(Sysdate,' || '''' ||<br />        v_Customer_Cc2 || '''' || '))';<br /> Else<br />  Str_Sql := 'Insert into dpdt.menology values(Portsequence.Nextval, ' || '''' || v_Customer_Cc1 || '''' || ', ' || '''' ||<br />        Username1 || '''' || ', To_Char(Sysdate, ' || '''' || v_Customer_Cc3 || '''' || '), To_Char(Sysdate, ' || '''' ||<br />        v_Customer_Cc2 || '''' || '),(Select Nvl(Sum(Sprc), 0) From ' || Username1 ||<br />        ' .Zsale T1 Where To_Char(T1.Sdate, ' || '''' || v_Customer_Cc2 || '''' || ') Like To_Char(Sysdate, ' || '''' ||<br />        v_Customer_Cc2 || '''' || ')))';<br /> <br />  /*Str_Sql := ' Merge Into Dpdt.Menology Using (Select * From Dpdt.Menology Ec Where Ec.Brand = ' || '''' ||<br />            v_Customer_Cc1 || '''' || ' And Ec.Branch = ' || '''' || Username || '''' ||<br />            ' And Ec.Yearid = To_Char(Sysdate, ' || '''' || v_Customer_Cc3 || '''' ||<br />            ') And Ec.Monthid = To_Char(Sysdate, ' || '''' || v_Customer_Cc2 || '''' ||<br />            ')) Cc On (Cc.Menologyid Is Not Null) When Matched Then Update Set Sumsale = (Select Nvl(Sum(Sprc), 0) From ' || Username || ' .Zsale T1 Where To_Char(T1.Sdate, ' || '''' || v_Customer_Cc2 || '''' || ') Like To_Char(Sysdate, ' || '''' ||<br />            v_Customer_Cc2 || '''' || '))<br />    <br />    When Not Matched Then Insert(Menologyid, Brand, Branch, Yearid, Monthid, Sumsale) Values(Portsequence.Nextval, ' || '''' || v_Customer_Cc1 || '''' || ', ' || '''' || Username || '''' ||<br />            ', To_Char(Sysdate, ' || '''' || v_Customer_Cc3 || '''' || '), To_Char(Sysdate, ' || '''' || v_Customer_Cc2 || '''' ||<br />            '),(Select Nvl(Sum(Sprc), 0) From ' || Username || ' .Zsale T1 Where To_Char(T1.Sdate, ' || '''' || v_Customer_Cc2 || '''' || ') Like To_Char(Sysdate, ' || '''' ||<br />            v_Customer_Cc2 || '''' || ')) ';*/<br /> End If;<br /> Execute Immediate Str_Sql; --动态执行DDL语句<br /> Commit;<br />Exception<br /> When Others Then<br />  Dbms_Output.Put_Line(Sqlerrm);<br />  Rollback;<br />End Filldpb;<br /></font>
		</p>
<img src ="http://www.blogjava.net/kemi/aggbug/42197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kemi/" target="_blank">Kimi</a> 2006-04-20 17:13 <a href="http://www.blogjava.net/kemi/archive/2006/04/20/42197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>