﻿<?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-&lt;h2&gt;&lt;font color="green"&gt;生命科学领域的专业信息解决方案！&lt;/font&gt;&lt;/h2&gt;-随笔分类-Oracle</title><link>http://www.blogjava.net/rain1102/category/37648.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;化学结构搜索，化学信息学，生物信息学，实验室信息学等
。&lt;/font&gt;&lt;br/&gt;&lt;font color="#3C1435"&gt;以高科技的生物、化学信息技术实现生命科学领域中专业数据的计算和管理、提高研发能力、增强在科研和成本效率方面的国际竞争力，为生物、化学、医药和学术机构提供一流的解决方案和技术咨询。&lt;/font&gt;&lt;br/&gt;
&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;&lt;br/&gt;
</description><language>zh-cn</language><lastBuildDate>Wed, 22 Jun 2011 07:54:39 GMT</lastBuildDate><pubDate>Wed, 22 Jun 2011 07:54:39 GMT</pubDate><ttl>60</ttl><item><title>在SQLPlus中执行用Java编写的Oracle存储过程[转载]</title><link>http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 22 Jun 2011 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/352799.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/352799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/352799.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #6f6f6f; font-family: Arial; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">首先在PL/Sql中分别执行：</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace and compile java source named TestJava1 as&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">public class TestJava1&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">{&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; public static void test()&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; {&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp; System.out.println("Hello");&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; }&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">}</span></p><p style="line-height: normal; "><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace procedure testJava1 as language java name 'TestJava1.test()';</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">---------------------------------------------------------------------------------------------------------</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">在SQLPlus中</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">C:\Windows\System32&gt;sqlplus nc5520110105/nc5520110105@192.168.10.87</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 1 14:06:02 2011</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">Copyright (c) 1982, 2010, Oracle.&nbsp; All rights reserved.</span></p><p style="line-height: normal; "><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">Connected to:</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">With the Partitioning, OLAP and Data Mining options</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; set serveroutput on;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; show serveroutput;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; call dbms_java.set_output(2000);</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">Call completed.</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; show serveroutput;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; exec testJava1();</span><br style="line-height: normal; " /><strong style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">Hello</span></strong></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">PL/SQL procedure successfully completed.</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt;</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">---------------------------------------------------------------------------------------------------------</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">再看一个例子：</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">在PL/Sql中执行：</span></p><span style="line-height: normal; font-size: 24px; "><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">--用Java编写Oracle存储过程。</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace and compile java source named test as</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">public class MyTest</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">{</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; public static void myProc(int a,int b,int[] ret){</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret[0]=a+b;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; }</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; public static int myFunc(int a,int b){</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a+b;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; }</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">}</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">--创建存储过程</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace procedure myProc(a in number, b in number, ret out number) as</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">language java name 'MyTest.myProc(int,int,int[])';</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">--创建函数</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace function myFunc(a in number, b in number) return number is</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">language java name 'MyTest.myFunc(int,int) return int';</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">然后在SqlPlus中测试存储过程&#8212;&#8212;</span></p><p style="line-height: normal; "></p></span><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; set serveroutput on</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; DECLARE a INTEGER;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 2&nbsp; BEGIN</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 3&nbsp; myProc(1, 2, a);</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 4&nbsp; DBMS_OUTPUT.PUT_LINE(a);</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 5&nbsp; END;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 6&nbsp; /</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">3</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">PL/SQL procedure successfully completed.</span></p><p style="line-height: normal; ">&nbsp;</p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; select myFunc(1,2) from dual;</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">MYFUNC(1,2)</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">-----------</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt;</span></p></span><img src ="http://www.blogjava.net/rain1102/aggbug/352799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-06-22 12:38 <a href="http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Four steps to start oracle in ubuntu</title><link>http://www.blogjava.net/rain1102/archive/2010/05/25/321783.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 25 May 2010 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/05/25/321783.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/321783.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/05/25/321783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/321783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/321783.html</trackback:ping><description><![CDATA[<div><br />
</div>
<div>The steps of start|stop db server as follows:</div>
<div><br />
</div>
<div>1.start lisening</div>
<div><br />
</div>
<div>$lsnrctl start | stop</div>
<div><br />
</div>
<div>2.start or stop &nbsp;datebase</div>
<div><br />
</div>
<div>$sqlplus /nolog</div>
<div><br />
</div>
<div>sql&gt;connect /as sysdba</div>
<div><br />
</div>
<div>sql&gt;startup | shutdown immediate</div>
<div><br />
</div>
<div><br />
</div>
<div>3.start or stop dbconsole</div>
<div><br />
</div>
<div>$emctl start | stop &nbsp;dbconsole</div>
<div><br />
</div>
<div>4.start or stop iSQL*Plus</div>
<div><br />
</div>
<div>$isqlplusctl start | stop</div>
<div><br />
</div><img src ="http://www.blogjava.net/rain1102/aggbug/321783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-05-25 08:44 <a href="http://www.blogjava.net/rain1102/archive/2010/05/25/321783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>9.04安装Oracle的详细步骤[转载]</title><link>http://www.blogjava.net/rain1102/archive/2010/04/09/317868.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 09 Apr 2010 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/04/09/317868.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/317868.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/04/09/317868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/317868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/317868.html</trackback:ping><description><![CDATA[我刚在一台服务器上装了个。大体步骤如下：<br />
----------------------------服务器环境：<br />
服务器型号：LENOVO R525 G2<br />
CPU：至强4核支持EMT64位<br />
内存：4*4GB<br />
存储：4*300 raid5<br />
swap分区大小：内存*2=16*=32GB<br />
其他分区大小根据需要自行设定。<br />
IP地址：手动指定(DHCP会导致oracle自检不通过)<br />
----------------------------操作系统安装<br />
介质：ubuntu-9.10-desktop-amd64.iso<br />
基本系统安装完毕后，<br />
sudo apt-get update，更新系统到最新，<br />
出现磁盘无法挂载的问题，sudo fsck后解决。<br />
-----------------------------oracle数据库安装<br />
---------准备介质<br />
下载安装介质：10201_database_linux_x86_64.cpio.gz<br />
解压：gzip -d 10201_database_linux_x86_64.cpio.gz<br />
解压：cpio -idmv &lt;10201_database_linux_x86_64.cpio.gz<br />
解压得到：database目录<br />
---------准备安装环境<br />
1、安装compat libraries and 32-bit libraries：<br />
sudo apt-get install gcc libaio1 lesstif2 lesstif2-dev make libc6 libc6-i386 libc6-dev-i386 libstdc++5 lib32stdc++6 lib32z1 ia32-libs<br />
2、修改内核参数<br />
sudo vi /etc/sysctl.conf：<br />
# add for oracle<br />
kernel.shmall = 2097152<br />
kernel.shmmax = 2147483648<br />
kernel.shmmni = 4096<br />
kernel.sem = 250 32000 100 128<br />
fs.file-max = 65536<br />
net.ipv4.ip_local_port_range = 1024 65000<br />
net.core.rmem_default = 262144<br />
net.core.rmem_max = 262144<br />
net.core.wmem_default = 262144<br />
net.core.wmem_max = 262144<br />
vm.swappiness=10<br />
# add for oracle<br />
其中kernel.shmmax = 2147483648 是共享内存大小，此处设置为2GB。<br />
<br />
3、建立ORACLE的用户和用户组：<br />
sudo groupadd nobody<br />
sudo groupadd oinstall<br />
sudo groupadd dba<br />
sudo useradd -s /bin/bash -g oinstall -G dba oracle<br />
sudo passwd oracle<br />
<br />
4、sudo vi /etc/security/limits.conf<br />
在文件末尾加入：<br />
#add for oracle<br />
oracle soft nofile 65536<br />
oracle hard nofile 65536<br />
oracle soft nproc 16384<br />
oracle hard nproc 16384<br />
#add for oracle<br />
5、库文件链接：<br />
sudo ln -s /usr/bin/awk /bin/awk<br />
sudo ln -s /bin/true /bin/rpm<br />
sudo ln -s /usr/bin/basename /bin/basename<br />
sudo ln -s /lib/libgcc_s.so.1 /lib/libgcc_s.so<br />
6、建立oracle目录(此处路径根据需要修改)<br />
sudo mkdir -p /opt/ora10<br />
sudo chown -R oracle:oinstall /opt/ora10<br />
sudo chmod -R 775 /opt/ora10<br />
7、执行sudo sysctl -p 使修改生效。<br />
8、修改oracle用户环境变量<br />
以oracle用户登录，sudo vi .profile<br />
#add for oracle<br />
export CFLAGS='-m32'<br />
export LDFLAGS='-m32'<br />
export ORACLE_BASE=/opt/ora10<br />
export ORACLE_HOME=/opt/ora10<br />
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH<br />
export ORACLE_OWNER=oracle<br />
export ORACLE_SID=tmp<br />
export ORACLE_TERM=xterm<br />
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"<br />
#add for oracle<br />
其中：<br />
BASE和HOME路径需要与上面步骤中建立的目录对应。<br />
SID和NLS_LANG根据需要修改。<br />
<br />
9、oracle系统检查：<br />
sudo vi /etc/redhat-release<br />
添加：<br />
Red Hat Linux release 3.1 (drupal)<br />
10、开始安装<br />
以oracle用户重新登录或者source .profile<br />
执行：<br />
cd database <br />
./runInstaller<br />
开始进行安装。<br />
<br />
-----------------可能会遇到的问题<br />
1、由于某些C++的编译用到了32位库文件，导致至少有一个.mk文件执行不过去，暂时还没找到解决办法。不过貌似不影响oracle使用；<br />
2、安装完毕后，dbca创建数据库的时候报错：ORA-27125:unable to create shared memory segment<br />
如下修改后，问题解决：<br />
linux: # cd $ORACLE_HOME/bin<br />
linux: # mv oracle oracle.bin<br />
<br />
cat &gt;oracle &lt;&lt;"EOF"<br />
#!/bin/bash<br />
<br />
export DISABLE_HUGETLBFS=1<br />
exec $ORACLE_HOME/bin/oracle.bin $@<br />
EOF<br />
<br />
linux: # chmod +x oracle<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/317868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-04-09 16:28 <a href="http://www.blogjava.net/rain1102/archive/2010/04/09/317868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql查询时dynamic performance tables not accessible错误</title><link>http://www.blogjava.net/rain1102/archive/2010/03/25/316498.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 25 Mar 2010 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/03/25/316498.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/316498.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/03/25/316498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/316498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/316498.html</trackback:ping><description><![CDATA[用pl/sql查询时，出现以下错误：
<p>dynamic performance tables not accessible, <br />
automatic statistics disabled for this session <br />
<br />
you can disable statistics in the preference menu,or obtain select <br />
priviliges on the V$session,v$sesstat and v$statname tables <br />
可是已经把系统权限 select any table 给这个用户了</p>
<p>解决方法如下：</p>
<p>grant SELECT ANY DICTIONARY to username;</p>
<p>因为v$开头的属于数据字典，通常称为动态性能视图。</p><img src ="http://www.blogjava.net/rain1102/aggbug/316498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-03-25 09:03 <a href="http://www.blogjava.net/rain1102/archive/2010/03/25/316498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次对dual表的恢复操作(ORA-00980:同义词转换不再有效错误解决方法) </title><link>http://www.blogjava.net/rain1102/archive/2009/11/10/301757.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 10 Nov 2009 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/10/301757.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/301757.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/10/301757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/301757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/301757.html</trackback:ping><description><![CDATA[原文地址：http://blog.csdn.net/alvenz/archive/2008/12/15/3519532.aspx<br />
<p>今天登陆到测试环境,在做日常操作时需要使用到dual表,但是在使用了一个查询语句时(SELECT to_char(current_timestamp) FROM dual)却提示'ORA-00980: 同义词转换不再有效'错误,于是开始了这次的分析和恢复.</p>
<p>一、查找原因</p>
<p>&nbsp;&nbsp;&nbsp; 根据在网上搜索得到的信息判断可能是同义词丢失或者是表被删除，于是进行以下操作以确定问题。</p>
<p>&nbsp;&nbsp;&nbsp; SELECT * FROM Dba_Objects do WHERE&nbsp; do.object_type ='TABLE' AND do.object_name = 'DUAL'</p>
<p>&nbsp;&nbsp;&nbsp; SELECT * FROM Dba_Tables dt WHERE&nbsp; dt.table_name = 'DUAL'</p>
<p>&nbsp;&nbsp;&nbsp; SELECT * FROM Dba_Synonyms ds WHERE ds.table_name = 'DUAL'</p>
<p>&nbsp;&nbsp;&nbsp; 根据以上数据字典反馈的信息确定是表被删除(因为dba_synonyms表中有此记录，表明同义词未被删除)导致此错误，决定重建该表。</p>
<p>二、建表操作</p>
<p>&nbsp;&nbsp;&nbsp; 由于在正式环境中该表存在，故连接到正式环境查看该表结构</p>
<p>&nbsp;&nbsp;&nbsp; SQL&gt; desc dual;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp; Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nullable Default Comments <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----- ----------- -------- ------- -------- <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DUMMY VARCHAR2(1) Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; 查看建表脚本：</p>
<p>&nbsp;&nbsp;&nbsp; -- Create table<br />
&nbsp;&nbsp;&nbsp; create table SYS.DUAL<br />
&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DUMMY VARCHAR2(1)<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp; tablespace SYSTEM<br />
&nbsp;&nbsp; pctfree 10<br />
&nbsp;&nbsp; pctused 40<br />
&nbsp;&nbsp; initrans 1<br />
&nbsp;&nbsp; maxtrans 255<br />
&nbsp;&nbsp; storage<br />
&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp; initial 104<br />
&nbsp;&nbsp;&nbsp; next 104<br />
&nbsp;&nbsp;&nbsp; minextents 1<br />
&nbsp;&nbsp;&nbsp; maxextents 505<br />
&nbsp;&nbsp;&nbsp; pctincrease 100<br />
&nbsp;&nbsp; );<br />
&nbsp;&nbsp; -- Grant/Revoke object privileges <br />
&nbsp; grant select on SYS.DUAL to PUBLIC;</p>
<p>有了以上内容，可以开始建表了，因为同义词后面将重新创建，所以可以在建表前删除，在操作之前使用sys重新登陆</p>
<p>1、DROP PUBLIC SYNONYM dual;&nbsp; --删除同义词</p>
<p>2、create table dual<br />
　(dummy varchar2(1))&nbsp; --创建表</p>
<p>3、INSERT INTO dual VALUES('X')&nbsp; --插入值</p>
<p>4、create public synonym dual for dual&nbsp; --创建同义词</p>
<p>5、grant select on dual to public with grant option&nbsp; --授权,如果不允许其它人可以将自己的权限传递给其他用户，可以去掉with后面的内容</p>
<p>6、退出，使用普通用户登陆，测试dual表是否能正常使用</p>
<p>&nbsp;&nbsp; select sysdate from dual;</p>
<p>7、若测试正常则代表dual表已经被重新建立，至此，一次对dual表的恢复完成。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/alvenz/archive/2008/12/15/3519532.aspx</p><img src ="http://www.blogjava.net/rain1102/aggbug/301757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-11-10 09:08 <a href="http://www.blogjava.net/rain1102/archive/2009/11/10/301757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle调用java</title><link>http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 29 Oct 2009 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/300146.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/300146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/300146.html</trackback:ping><description><![CDATA[<p>前提是数据库上需要安装java虚拟机(JVM),使用下面的语句查看 </p>
<p><span style="color: #008000">select * from dba_registry where comp_id = 'JAVAVM'</span><br />
<br />
为空,则未安装,请执行 $ORACLE_HOME/javavm/install/initjvm.sql安装. <br />
创建函数 </p>
<p><span style="color: #008000">create or replace function fn_oraclecall(mArea in VARCHAR2,mDevID in Number,mPORT in Number)<br />
return varchar2<br />
as<br />
language <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> name 'Caller.call(java.lang.String,Integer,Integer) return <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String';</span><br />
</p>
<p>创建存储过程 </p>
<p><span style="color: #008000">create or replace procedure CHK_SETCAB_NUM<br />
(mArea in VARCHAR2,mDevID in Number,mPORT in Number,v_out out varchar2) is<br />
begin<br />
v_out := fn_oraclecall(mArea,mDevID,mPORT);<br />
end CHK_SETCAB_NUM;</span></p>
<p>loadjava </p>
<p><span style="color: #008000">loadjava -u sys/sys@sid&nbsp; -oci8 -verbose -grant user -synonym -resolve -schema user D:\Caller.jar<br />
</span><br />
--这里也可以是class文件,注意兼容oracle的jre版本</p>
<p><br />
注意编写的java文件里,即Caller.java的call()方法,需要是staic <br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/300146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-29 11:20 <a href="http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Database 11g SQL 开发指南阅读记录</title><link>http://www.blogjava.net/rain1102/archive/2009/09/03/293784.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 03 Sep 2009 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/09/03/293784.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/293784.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/09/03/293784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/293784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/293784.html</trackback:ping><description><![CDATA[SQL语句分为5类<br />
1. 查询语句 SELECT<br />
2. 数据操纵语言（Data Manipulation Language, DML）语句<br />
&nbsp;&nbsp;&nbsp;&nbsp;INSERT<br />
&nbsp;&nbsp;&nbsp;&nbsp;UPDATE<br />
&nbsp;&nbsp;&nbsp;&nbsp;DELETE<br />
3. 数据定义语言（Data Definition Language, DDL）语句<br />
&nbsp;&nbsp;&nbsp;&nbsp;CREATE<br />
&nbsp;&nbsp;&nbsp;&nbsp;ALTER<br />
&nbsp;&nbsp;&nbsp;&nbsp;DROP<br />
&nbsp;&nbsp;&nbsp;&nbsp;RENAME<br />
&nbsp;&nbsp;&nbsp;&nbsp;TRUNCATE<br />
4. 事务控制（Transaction Control, TC）语句<br />
&nbsp;&nbsp;&nbsp;&nbsp;COMMIT<br />
&nbsp;&nbsp;&nbsp;&nbsp;ROLLBACK<br />
&nbsp;&nbsp;&nbsp;&nbsp;SAVEPOINT<br />
5. 数据控制语言（Data Control Language, DCL）语句<br />
&nbsp;&nbsp;&nbsp;&nbsp;GRANT<br />
&nbsp;&nbsp;&nbsp;&nbsp;REVOKE<br />
<br />
SYSDATE<br />
<br />
CREATE USE username IDENTIFIED BY password<br />
GRANT CONNECT, RESOURCE TO username<br />
<br />
id INTEGER CONSTRAINT student_pk PRIMARY KEY<br />
<br />
CONSTRAINT ~~~ REFERENCES product_type(id)<br />
<br />
CONSTRAINT compose_pk PRIMARY KEY (column1, column2)<br />
<br />
TO_DATE('25-JUL-2007')+2&nbsp; =&gt; 27-JUL-2007<br />
<br />
连接操作符(||)<br />
<br />
NVL(phone, 'Unknown phone number')<br />
<br />
ANY = SOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where id &gt; ANY(2, 3, 4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;where id &gt; ALL(2, 3, 4)<br />
<br />
WHERE name LIKE&nbsp; '%\%%' ESCAPE '\'<br />
<br />
LIKE, IN, BETWEEN, IS NULL, IS NAN, IS INFINITE<br />
<br />
USING =&gt; ON&nbsp;&nbsp;&nbsp;&nbsp;(+)<br />
<br />
_(一个)&nbsp; &nbsp;%(任意个)<br />
<br />
AND&nbsp;优先 OR<br />
<br />
GROUP BY 可以不与HAVING字句一起使用，但是HAVING必须必须与GROUP BY字句一起使用。 GROUP BY分组，HAVING过滤。<br />
<br />
SELECT&nbsp;&nbsp;&nbsp;product_type_id, AVG(price) FROM products WHERE price &lt; 15 GROUP BY product_type_id HAVING AVG(price) &gt; 13 ORDER BY AVG(price)<br />
<br />
两种函数：单行函数（字符，数字，转换，日期，正则表达式）和聚合函数<br />
<br />
TO_CHAR(dob, 'MONTH DD, YYYY')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TO_DATE('7.4.07', 'MM.DD.YY')<br />
<br />
ALTER SESSION SET NLS_DATE_FORMAT = 'MONTH-DD-YYYY';<br />
<br />
ADD_MONTHS(x,y)&nbsp;&nbsp;&nbsp; LAST_DAY(x)&nbsp;&nbsp;&nbsp; MONTHS_BETWEEN(x, y)&nbsp;&nbsp;&nbsp; NEXT_DAY(x, day)<br />
<br />
EXTRACT 取出年月日等。。<br />
<br />
EXISTS性能高于IN<br />
<br />
UNION ALL (包括重复的)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNION (不包括重复的)&nbsp; &nbsp;&nbsp;&nbsp;类型必须一样，列数必须一样，名称可以不一样<br />
<br />
INTERSECT&nbsp;&nbsp; MINUS<br />
<br />
TRANSLATE(x, from_string, to_string)<br />
DECODE(value, search_value, result, default_value)&nbsp; =&gt; CASE<br />
<br />
SELECT division_id, SUM(salary) FROM employee GROUP BY ROLLUP(division_id) ORDER BY division_id;<br />
SELECT division_id, SUM(salary) FROM employee GROUP BY ROLLUP(division_id, job_id) ORDER BY division_id;<br />
任何聚合函数都可以和ROLLUP一起使用<br />
<br />
SELECT division_id, SUM(salary) FROM employee GROUP BY CUBE(division_id, job_id) ORDER BY division_id;<br />
<br />
GROUPING只能在使用ROLLUP或CUBE的查询时候使用<br />
SELECT GROUPING(division_id), division_id, SUM(salary) FROM employee GROUP BY ROLLUP(division_id) ORDER BY division_id;<br />
<br />
使用GROUPING SETS子句可以只返回小计记录<br />
<br />
MERGE INTO products p<br />
USING product_changes pc ON (<br />
&nbsp;&nbsp;&nbsp;&nbsp;p.product_id = pc.product_id<br />
)<br />
WHEN MATCHED THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;UPDATE<br />
&nbsp;&nbsp;&nbsp;&nbsp;SET<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.product_type_id = pc.product_type_id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.name = pc.name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.description = pc.description,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.price = pc.price<br />
WHEN NOT MATCHED THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;INSERT (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.product_id, p.product_type_id, p.name, p.description, p.price<br />
&nbsp;&nbsp;&nbsp;&nbsp;) VALUES (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc.product_id, pc.product_type_id, pc.name, pc.description, pc.price<br />
&nbsp;&nbsp;&nbsp;&nbsp;);<br />
<br />
user_tables, user_tab_columns, all_tables, all_tab_columns;<br />
<br />
ALTER TABLE salary_grades<br />
ADD (average_salary AS ((low_salary + high_salary)/2));<br />
<br />
ALTER TABLE order_status<br />
DROP COLUMN modified_by;<br />
<br />
ALTER TABLE order_status<br />
ADD CONSTRAINT order_status_modified_by_fk<br />
modified_by REFERENCES employee(employee_id) ON DELETE CASCADE;<br />
<br />
ALTER TABLE order_status<br />
ADD CONSTRAINT order_status_modified_by_fk<br />
modified_by REFERENCES employee(employee_id) ON DELETE SET NULL;<br />
<br />
ALTER TABLE order_status<br />
ADD CONSTRAINT order_status_status_ck<br />
CHECK (status in ('PLACED', 'PENDING', 'SHIPPED'));<br />
<br />
ALTER TABLE order_status<br />
DISABLE CONSTRAINT order_status_status_ck;<br />
<br />
ALTER TABLE order_status<br />
ENABLE CONSTRAINT order_status_status_ck;<br />
<br />
ALTER TABLE order_status<br />
ENABLE NOVALIDATE CONSTRAINT order_status_status_uq;<br />
<br />
SET SERVEROUTPUT ON<br />
<br />
DECLARE<br />
&nbsp;&nbsp;&nbsp;&nbsp;v_product_id&nbsp; products.product_id%TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;v_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; products.name%TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;v_price&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; products.price%TYPE;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;CURSOR v_product_cursor IS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT product_id, name, price<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM products<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER BY product_id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPEN v_product_cursor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOOP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FETCH v_product_cursor INTO v_product_id, name, price;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXIT WHEN v_product_cursor%NOTFOUND;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBMS_OUTPUT.PUT_LINE(~~)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END LOOP;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOSE v_product_cursor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;END;<br />
/<br />
<br />
SET SERVEROUTPUT ON<br />
<br />
DECLARE<br />
&nbsp;&nbsp;&nbsp;&nbsp;CURSOR v_product_cursor IS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT product_id, name, price<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM products<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER BY product_id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FOR&nbsp;v_product IN v_product_cursor LOOP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBMS_OUTPUT.PUT_LINE(v_product.product_id || v_product.name || v_product.price)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END LOOP;<br />
&nbsp;&nbsp;&nbsp;&nbsp;END;<br />
/<br />
<br />
Oracle预定义系统异常类型<br />
<br />
<table style="margin-left: 10.65pt; border-top-style: none; border-right-style: none; border-left-style: none; border-collapse: collapse; border-bottom-style: none" cellspacing="0" FCK__ShowTableBorders?>
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><strong><span style="font-size: 9pt; line-height: 150%">命名的系统异常</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-width: 1pt; border-left-color: windowtext; padding-bottom: 0cm; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="425">
            <p style="line-height: 150%; text-align: left"><strong><span style="font-size: 9pt; line-height: 150%">产生原因</span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">ACCESS_INTO_NULL </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">未定义对象</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">CASE_NOT_FOUND </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">CASE </span><span style="font-size: 9pt; line-height: 150%">中若未包含相应的</span><span style="font-size: 9pt; line-height: 150%"> WHEN </span><span style="font-size: 9pt; line-height: 150%">，并且没有设置</span><span style="font-size: 9pt; line-height: 150%"> ELSE </span><span style="font-size: 9pt; line-height: 150%">时</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">COLLECTION_IS_NULL </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">集合元素未初始化</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">CURSER_ALREADY_OPEN </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">游标已经打开</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">DUP_VAL_ON_INDEX </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">唯一索引对应的列上有重复的值</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">INVALID_CURSOR </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">在不合法的游标上进行操作</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">INVALID_NUMBER </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">内嵌的</span><span style="font-size: 9pt; line-height: 150%"> SQL </span><span style="font-size: 9pt; line-height: 150%">语句不能将字符转换为数字</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">NO_DATA_FOUND </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">使用</span><span style="font-size: 9pt; line-height: 150%"> select into </span><span style="font-size: 9pt; line-height: 150%">未返回行，或应用索引表未初始化的元素时</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">TOO_MANY_ROWS </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">执行</span><span style="font-size: 9pt; line-height: 150%"> select into </span><span style="font-size: 9pt; line-height: 150%">时，结果集超过一行</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">ZERO_DIVIDE </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">除数为</span><span style="font-size: 9pt; line-height: 150%"> 0 </span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">SUBSCRIPT_BEYOND_COUNT </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">元素下标超过嵌套表或</span><span style="font-size: 9pt; line-height: 150%"> VARRAY </span><span style="font-size: 9pt; line-height: 150%">的最大值</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">SUBSCRIPT_OUTSIDE_LIMIT </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">使用嵌套表或</span><span style="font-size: 9pt; line-height: 150%"> VARRAY </span><span style="font-size: 9pt; line-height: 150%">时，将下标指定为负数</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">VALUE_ERROR </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">赋值时，变量长度不足以容纳实际数据</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">LOGIN_DENIED </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">PL/SQL </span><span style="font-size: 9pt; line-height: 150%">应用程序连接到</span><span style="font-size: 9pt; line-height: 150%"> oracle </span><span style="font-size: 9pt; line-height: 150%">数据库时，提供了不正确的用户名或密码</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">NOT_LOGGED_ON </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">PL/SQL </span><span style="font-size: 9pt; line-height: 150%">应用程序在没有连接</span><span style="font-size: 9pt; line-height: 150%"> oralce </span><span style="font-size: 9pt; line-height: 150%">数据库的情况下访问数据</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">PROGRAM_ERROR </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">PL/SQL </span><span style="font-size: 9pt; line-height: 150%">内部问题，可能需要重装数据字典＆</span><span style="font-size: 9pt; line-height: 150%"> pl./SQL </span><span style="font-size: 9pt; line-height: 150%">系统包</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">ROWTYPE_MISMATCH </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">宿主游标变量与</span><span style="font-size: 9pt; line-height: 150%"> PL/SQL </span><span style="font-size: 9pt; line-height: 150%">游标变量的返回类型不兼容</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">SELF_IS_NULL </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">使用对象类型时，在</span><span style="font-size: 9pt; line-height: 150%"> null </span><span style="font-size: 9pt; line-height: 150%">对象上调用对象方法</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">STORAGE_ERROR </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">运行</span><span style="font-size: 9pt; line-height: 150%"> PL/SQL </span><span style="font-size: 9pt; line-height: 150%">时，超出内存空间</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">SYS_INVALID_ID </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">无效的</span><span style="font-size: 9pt; line-height: 150%"> ROWID </span><span style="font-size: 9pt; line-height: 150%">字符串</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-top-width: 1pt; border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; border-top-color: windowtext; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="210">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">TIMEOUT_ON_RESOURCE </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: windowtext 1pt solid; border-left-style: none" width="425">
            <p style="line-height: 150%; text-align: left"><span style="font-size: 9pt; line-height: 150%">Oracle </span><span style="font-size: 9pt; line-height: 150%">在等待资源时超时</span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
阅读中...<img src ="http://www.blogjava.net/rain1102/aggbug/293784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-09-03 20:00 <a href="http://www.blogjava.net/rain1102/archive/2009/09/03/293784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT执行ORACLE存储过程</title><link>http://www.blogjava.net/rain1102/archive/2009/09/02/293592.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 02 Sep 2009 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/09/02/293592.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/293592.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/09/02/293592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/293592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/293592.html</trackback:ping><description><![CDATA[写个小工具来管理项目中的SQL脚本文件，当主要代码调试成功以后，使用ANT来处理时候遇到个问题，每次执行都会报如下错误：<br />
<span style="color: red">BUILD FAILED<br />
<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.SQLException: ORA-06550: 第 1 行, 第 33 列:<br />
PLS-00103: 出现符号 "end-of-file"在需要下列之一时：<br />
&nbsp;:= . ( @ % ; not</span><br />
明明都是正确的为什么使用ANT就会报错呢，查了一下资料，发现ANT默认使用分号来作为一条SQL语句结束。导致存储过程中的语句被分开执行了。<br />
解决办法设置delimiter为"/":<br />
<br />
&lt;target name="runsqls" depends="init" description="run sql script"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}"&nbsp; <span style="color: #ff0000">delimiter="/"</span>&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;classpath refid="classpath"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;fileset dir="sql-scripts"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="*.sql"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<br />
&nbsp;&nbsp;&lt;/sql&gt;<br />
&lt;/target&gt;<br />
<br />
现在ok了，尽情享受吧。<img src ="http://www.blogjava.net/rain1102/aggbug/293592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-09-02 14:25 <a href="http://www.blogjava.net/rain1102/archive/2009/09/02/293592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目中遇到的性能问题总结</title><link>http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 05 Aug 2009 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/289965.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/289965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/289965.html</trackback:ping><description><![CDATA[<p>最近一直从事的项目中遇到不少性能问题, 虽然表中的数据数量不是太大, 最大也就200万条, 其他基本都是100万左右, 但由于存在一个化合物结构信息的数据使得数据库特别的大, 就dmp文件就达到4G多。而客户对性能要求又比较高。目前遇到问题以及解决方案(并非最佳方案)总结如下:<br />
</p>
1. 多表查询时候速度慢: 为表之间关联列创建索引, 只取需要数据。<br />
2. 多条数据批量更新: 尽量使用原生SQL, 少用Hibernate取了循环再更新。<br />
3. 数据量大查询时候少用upper，lower等类似数据提供的功能函数去转换数据，可以考虑是否在存入数据之前就把所有数据改为大写或者小写，显示时候再按要求格式化内容。<br />
4. 使用Hibernate时候，把关联关系尽量设置成延迟加载，然后使用时候再用fetch取出。<br />
<br />
目前先总结这些， 遇到再加。<img src ="http://www.blogjava.net/rain1102/aggbug/289965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-08-05 16:27 <a href="http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL中同步两个表中的某些字段</title><link>http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 31 Jul 2009 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/289324.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/289324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/289324.html</trackback:ping><description><![CDATA[<p>以前我们在写update的时候往往是使用 update tablename set columnname ＝ value这样的简单语法，而今天遇到一个需求，根据一张表中的数据来更新另外一张表中的某些字段值，比如有个A表和B表，A中有字段id，name，email，phone，cno，这里的cno也是唯一的，B表中有id，othercloumn，email，phone，cno，这时候想通过B中的email和phone值来更新A中的email和phone值。我们可以使用一下语句实现这个功能：<br />
<br />
<span style="color: #008000">update A, B set <br />
A.email= B.email, A.phone= B.phone<br />
where A.cno=B.cno</span></p>
<br />
<span style="color: #ff0000">Oracle</span>中可以如下方式实现：<br />
<span style="color: #ff0000">update A set <br />
(email, phone) = (select B.email, B.phone where B.cno=&nbsp;A.cno)</span><br /><img src ="http://www.blogjava.net/rain1102/aggbug/289324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-31 22:14 <a href="http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.sql.SQLException: ORA-01000: 超出打开游标的最大数</title><link>http://www.blogjava.net/rain1102/archive/2009/07/07/285854.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 07 Jul 2009 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/07/285854.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/285854.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/07/285854.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/285854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/285854.html</trackback:ping><description><![CDATA[<p>Oracle批量插入数据的时候遇到了一个异常：java.sql.SQLException: ORA-01000: 超出打开游标的最大数， 解决办法：<br />
修改Oracle的默认最大游标个数, 执行如下语句：<br />
alter&nbsp;&nbsp; system&nbsp;&nbsp; set&nbsp;&nbsp; open_cursors=1000;</p><img src ="http://www.blogjava.net/rain1102/aggbug/285854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-07 17:59 <a href="http://www.blogjava.net/rain1102/archive/2009/07/07/285854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在MySQL和Oracle中实现行合并</title><link>http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 24 Jun 2009 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/283867.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/283867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/283867.html</trackback:ping><description><![CDATA[我有一个表student, 有id, name, email, 这时候我表里记录有name重复的值, 而email不一样, 我想按照name来group by一下, 把有重复的数据里面的email用逗号分开写在一起.<br />
表结构以及数据如下:<br />
id&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; email <br />
1&nbsp;&nbsp; eric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhourui@founder.com<br />
2&nbsp;&nbsp; maggie&nbsp;&nbsp;&nbsp; maggie@163.com<br />
3&nbsp;&nbsp; scott&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scott@yahoo.com<br />
4&nbsp;&nbsp; eric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eric@163.com<br />
我想的到如下数据<br />
eric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhourui@founder.com,eric@163.com<br />
maggie&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maggie@163.com<br />
scott&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scott@yahoo.com<br />
<br />
如果使用MySQL, 则实现语句如下:<br />
select name , <span style="color: #008000">group_concat(email order by email separator ", ")</span> as email from student group by name<br />
<br />
如果以上效果想在Oracle中显示, 则比较复杂点了, 因为Oracle中没有行合并函数, 则需要使用sys_connect_by_path()来实现, 代码如下:<br />
select name, ltrim(sys_connect_by_path(email,','),',') email from(<br />
select name,email,<br />
row_number() over(partition by name order by email) rn,<br />
count(*) over(partition by name) cnt<br />
from student <br />
) where level = cnt<br />
start with rn = 1<br />
connect by prior name = name and prior rn + 1 = rn<img src ="http://www.blogjava.net/rain1102/aggbug/283867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-24 09:18 <a href="http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 将Clob类型数据转换成字符串类型</title><link>http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 03 Jun 2009 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/279816.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/279816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/279816.html</trackback:ping><description><![CDATA[很多时候会遇到排序或者联合处理clob类型数据, 而clob数据又不支持这两种操作, 所有需要把其转换为字符串来进行处理.<br />
<span style="color: #008000">dbms_lob.substr(clobcloum,2000,1)<br />
</span><br />
select id, name, coden<br />
&nbsp; from cims_supplier<br />
&nbsp;where name like 'A%'<br />
&nbsp;&nbsp; and coden like 'A%'<br />
union<br />
select cdbregno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_lob.substr(supplier_name,2000,1) as name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; coden&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as coden<br />
&nbsp; from acdsupplier_moltable<br />
&nbsp;where supplier_name like 'A%'<br />
&nbsp;&nbsp; and coden like 'A%'<br />
<br />
cims_supplier表中的name是varchar2类型, 而acdsupplier_moltable表中的supplier_name为clob类型, 这样就可以union了.<br />
当然排序也可以了.<br />
select * from t1 order by dbms_lob.substr(clobcloum,2000,1); <br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/279816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-03 15:11 <a href="http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle to Buy Sun Microsystems</title><link>http://www.blogjava.net/rain1102/archive/2009/04/21/266697.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 21 Apr 2009 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/04/21/266697.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/266697.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/04/21/266697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/266697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/266697.html</trackback:ping><description><![CDATA[<h1>Oracle to Buy Sun Microsystems</h1>
<p>Following the collapse of talks with IBM earlier this month Oracle has stepped in to acquire Sun Microsystems for $7.4bn or $9.50 a share in an all cash transaction.&nbsp; This is a substantially higher valuation than IBM&#8217;s rumored price of $6.85bn.&nbsp; In a <a href="http://www.oracle.com/sun/index.html">statement</a> Oracle claims that the boards of both firms have approved the deal which is expected to complete in the summer subject to regulatory approval. Oracle CEO Larry Ellison stated:</p>
<blockquote>
<p>"The acquisition of Sun transforms the IT industry, combining best-in-class enterprise software and mission-critical computing systems. Oracle will be the only company that can engineer an integrated system - applications to disk - where all the pieces fit and work together so customers do not have to do it themselves. Our customers benefit as their systems integration costs go down while system performance, reliability and security go up."</p>
</blockquote>
<p>The deal offers substantial additional revenue to Oracle, according President Safra Catz:</p>
<blockquote>
<p>"We expect this acquisition to be accretive to Oracle's earnings by at least 15 cents on a non-GAAP basis in the first full year after closing. We estimate that the acquired business will contribute over $1.5 billion to Oracle's non-GAAP operating profit in the first year, increasing to over $2 billion in the second year. This would make the Sun acquisition more profitable in per share contribution in the first year than we had planned for the acquisitions of BEA, PeopleSoft and Siebel combined,"</p>
</blockquote>
<p>There is currently very limited information available as to what Oracle plans to do with either the hardware business the drives much of Sun&#8217;s revenue, Sun&#8217;s open source software offerings such as MySQL, GlassFish, NetBeans and JavaFX, or the <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> Community Process which has been central to the way Sun has managed <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>'s evolution, but both Sun Chairman Scott McNealy and Sun's CEO Jonathan Schwartz have issued upbeat statements. Jonathan Schwartz has been quoted as saying:</p>
<blockquote>"This is a fantastic day for Sun's customers, developers, partners and employees across the globe, joining forces with the global leader in enterprise software to drive innovation and value across every aspect of the technology marketplace," said Jonathan Schwartz, Sun's CEO, "From the <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> platform touching nearly every business system on earth, powering billions of consumers on mobile handsets and consumer electronics, to the convergence of storage, networking and computing driven by the Solaris operating system and Sun's SPARC and x64 systems. Together with Oracle, we'll drive the innovation pipeline to create compelling value to our customer base and the marketplace."</blockquote>
<p>Sun is the latest in a number of large scale acquisitions for Oracle.&nbsp; In recent years the enterprise computing giant has also acquired Siebel, PeopleSoft and BEA Systems. If Oracle is able to sell Sun's hardware business on, perhaps to Fujitsu, Oracle will have made an important acquisition as a very low price.</p><img src ="http://www.blogjava.net/rain1102/aggbug/266697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-04-21 10:43 <a href="http://www.blogjava.net/rain1102/archive/2009/04/21/266697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中的应用域索引(domain index)</title><link>http://www.blogjava.net/rain1102/archive/2009/04/09/264676.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 09 Apr 2009 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/04/09/264676.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/264676.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/04/09/264676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/264676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/264676.html</trackback:ping><description><![CDATA[今天由于测试SQL执行速度，不小心删掉了一个索引，然后数据库就不能执行相应的一些function，告诉我说需要创建一个domain index。<br />
问朋友得知这一种索引叫应用域索引,是用户自己建的一索引类型。<br />
让就按照要求写了创建该索引的语句，执行一下创建需要的索引就可以了。<br />
<br />
<span style="color: #008000"><strong>create index acd3d20083.acd1_structure_smiles on acd3d20083.acd1_structure(cd_smiles) indextype is acd3d20083.jc_idxtype; </strong></span><img src ="http://www.blogjava.net/rain1102/aggbug/264676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-04-09 17:20 <a href="http://www.blogjava.net/rain1102/archive/2009/04/09/264676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中计算出两个日期之间的所有日期</title><link>http://www.blogjava.net/rain1102/archive/2009/04/01/263308.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 01 Apr 2009 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/04/01/263308.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/263308.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/04/01/263308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/263308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/263308.html</trackback:ping><description><![CDATA[declare<br />
&nbsp;&nbsp;&nbsp; begin_date date default to_date('2009-02-02','yyyy-mm-dd');<br />
&nbsp;&nbsp;&nbsp; end_date&nbsp;&nbsp; date default to_date('2009-02-10','yyyy-mm-dd');<br />
&nbsp;&nbsp;&nbsp; l_date&nbsp;&nbsp;&nbsp;&nbsp; date;<br />
&nbsp;&nbsp;&nbsp; l_day&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int;<br />
begin<br />
&nbsp;&nbsp;&nbsp; l_day:=end_date-begin_date;<br />
&nbsp;&nbsp;&nbsp; l_date:=begin_date;<br />
&nbsp;&nbsp;&nbsp; for i in 1 .. l_day<br />
&nbsp;&nbsp;&nbsp; loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line('Date : '||to_char(l_date,'yyyy-mm-dd'));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l_date:=l_date+1;<br />
&nbsp;&nbsp;&nbsp; end loop;<br />
end;<br />
<br />
结果为：<br />
Date : 2009-02-02<br />
Date : 2009-02-03<br />
Date : 2009-02-04<br />
Date : 2009-02-05<br />
Date : 2009-02-06<br />
Date : 2009-02-07<br />
Date : 2009-02-08<br />
Date : 2009-02-09<br /><img src ="http://www.blogjava.net/rain1102/aggbug/263308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-04-01 11:48 <a href="http://www.blogjava.net/rain1102/archive/2009/04/01/263308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java调用Oracle的过程和函数</title><link>http://www.blogjava.net/rain1102/archive/2009/03/11/259211.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 11 Mar 2009 13:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/03/11/259211.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/259211.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/03/11/259211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/259211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/259211.html</trackback:ping><description><![CDATA[<p align="left">内容或简介：<br />
/**<br />
调用数据库里的一个函数<br />
一个函数本质上一个返回一个结果的存储过程，这个例子示范了怎么调用有in、out和in/out参数的函数<br />
***********************************/<br />
CallableStatement cs;<br />
try {<br />
// 调用一个没有参数的函数; 函数返回 a VARCHAR<br />
// 预处理callable语句&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs = connection.prepareCall("{? = call myfunc}");<br />
<br />
//&nbsp;注册返回值类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.registerOutParameter(1, i);<br />
<br />
// Execute and retrieve the returned value<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.execute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;String retValue = cs.getString(1);<br />
<br />
// 调用有一个in参数的函数; the function returns a VARCHAR<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs = connection.prepareCall("{? = call myfuncin(?)}");<br />
<br />
// Register the type of the return value<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.registerOutParameter(1, Types.VARCHAR);<br />
<br />
// Set the value for the IN parameter<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.setString(2, "a string");<br />
<br />
// Execute and retrieve the returned value<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.execute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;retValue = cs.getString(1);<br />
<br />
// 调用有一个out参数的函数; the function returns a VARCHAR<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs = connection.prepareCall("{? = call myfuncout(?)}");<br />
<br />
// Register the types of the return value and OUT parameter<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.registerOutParameter(1, Types.VARCHAR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.registerOutParameter(2, Types.VARCHAR);<br />
<br />
// Execute and retrieve the returned values<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.execute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;retValue = cs.getString(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // return value<br />
&nbsp;&nbsp;&nbsp;&nbsp;String outParam = cs.getString(2);&nbsp;&nbsp;&nbsp; // OUT parameter<br />
<br />
// 调用有一个in/out参数的函数; the function returns a VARCHAR<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs = connection.prepareCall("{? = call myfuncinout(?)}");<br />
<br />
// Register the types of the return value and OUT parameter<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.registerOutParameter(1, Types.VARCHAR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.registerOutParameter(2, Types.VARCHAR);<br />
<br />
// Set the value for the IN/OUT parameter<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.setString(2, "a string");<br />
<br />
// Execute and retrieve the returned values<br />
&nbsp;&nbsp;&nbsp;&nbsp;cs.execute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;retValue = cs.getString(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // return value<br />
&nbsp;&nbsp;&nbsp;&nbsp;outParam = cs.getString(2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // IN/OUT parameter<br />
} catch (SQLException e) {<br />
} </p><img src ="http://www.blogjava.net/rain1102/aggbug/259211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-03-11 21:05 <a href="http://www.blogjava.net/rain1102/archive/2009/03/11/259211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据字典</title><link>http://www.blogjava.net/rain1102/archive/2009/03/10/258823.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 10 Mar 2009 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/03/10/258823.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/258823.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/03/10/258823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/258823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/258823.html</trackback:ping><description><![CDATA[<p>ORACLE的数据字典是数据库的重要组成部分之一，它随着数据库的产生而产生, 随着数据库的变化而变化, 体现为sys用户下的一些表和视图。数据字典名称是大写的英文字符。 </p>
<p>　　数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。我们不能手工修改数据字典里的信息。很多时候，一般的ORACLE用户不知道如何有效地利用它。</p>
<p>　　dictionary　　　全部数据字典表的名称和解释，它有一个同义词dict<br />
　　dict_column　　 全部数据字典表里字段名称和解释<br />
&nbsp; <br />
&nbsp;&nbsp; 如果我们想查询跟索引有关的数据字典时，可以用下面这条SQL语句:<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; SQL&gt;select * from dictionary where instr(comments,'index')&gt;0;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 如果我们想知道user_indexes表各字段名称的详细含义，可以用下面这条SQL语句:<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; SQL&gt;select column_name,comments from dict_columns where <br />
table_name='USER_INDEXES';<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 依此类推，就可以轻松知道数据字典的详细名称和解释，不用查看ORACLE的其它文档资料了。<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 一、用户</p>
<p>&nbsp;&nbsp; 查看当前用户的缺省表空间<br />
&nbsp;&nbsp; SQL&gt;select username,default_tablespace from user_users;<br />
&nbsp;&nbsp; 查看当前用户的角色<br />
&nbsp;&nbsp; SQL&gt;select * from user_role_privs;</p>
<p>&nbsp;&nbsp; 查看当前用户的系统权限和表级权限<br />
&nbsp;&nbsp; SQL&gt;select * from user_sys_privs;<br />
&nbsp;&nbsp; SQL&gt;select * from user_tab_privs;</p>
<p>&nbsp;&nbsp; 二、表<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看用户下所有的表<br />
&nbsp;&nbsp; SQL&gt;select * from user_tables;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看名称包含log字符的表<br />
&nbsp;&nbsp; SQL&gt;select object_name,object_id from user_objects where instr(object_name,'LOG')&gt;0;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看某表的创建时间 <br />
&nbsp;&nbsp; SQL&gt;select object_name,created from user_objects where object_name=upper<br />
('&amp;table_name');<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看某表的大小<br />
&nbsp;&nbsp; SQL&gt;select sum(bytes)/(1024*1024) as "size(M)" from user_segments where <br />
segment_name=upper('&amp;table_name');<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看放在ORACLE的内存区里的表&nbsp; <br />
&nbsp;&nbsp; SQL&gt;select table_name,cache from user_tables where instr(cache,'Y')&gt;0;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 三、索引<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看索引个数和类别<br />
&nbsp;&nbsp; SQL&gt;select index_name,index_type,table_name from user_indexes order by table_name;<br />
　 查看索引被索引的字段<br />
&nbsp;&nbsp; SQL&gt;select * from user_ind_columns where index_name=upper('&amp;index_name');<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看索引的大小<br />
&nbsp;&nbsp; SQL&gt;select sum(bytes)/(1024*1024) as "size(M)" from user_segments where <br />
segment_name=upper('&amp;index_name');<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 四、序列号<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看序列号，last_number是当前值<br />
&nbsp;&nbsp; SQL&gt;select * from user_sequences;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 五、视图<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看视图的名称<br />
&nbsp;&nbsp; SQL&gt;select view_name from user_views;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看创建视图的select语句<br />
&nbsp;&nbsp; SQL&gt;select view_name,text_length from user_views;<br />
&nbsp;&nbsp; SQL&gt;set long 2000;说明：可以根据视图的text_length值设定set long 的大小<br />
&nbsp;&nbsp; SQL&gt;select text from user_views where view_name=upper('&amp;view_name');<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 六、同义词<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看同义词的名称<br />
&nbsp;&nbsp; SQL&gt;select * from user_synonyms;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 七、约束条件<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看某表的约束条件<br />
&nbsp;&nbsp; SQL&gt;select constraint_name, constraint_type,search_condition, r_constraint_name from <br />
user_constraints where table_name = upper('&amp;table_name');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; SQL&gt;select c.constraint_name,c.constraint_type,cc.column_name&nbsp; <br />
&nbsp;&nbsp; from user_constraints c,user_cons_columns cc<br />
&nbsp;&nbsp; where c.owner = upper('&amp;table_owner') and c.table_name = upper('&amp;table_name')<br />
&nbsp;&nbsp; and c.owner = cc.owner and c.constraint_name = cc.constraint_name<br />
&nbsp;&nbsp; order by cc.position;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 八、存储函数和过程<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看函数和过程的状态<br />
&nbsp;&nbsp; SQL&gt;select object_name,status from user_objects where object_type='FUNCTION';<br />
&nbsp;&nbsp; SQL&gt;select object_name,status from user_objects where object_type='PROCEDURE';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看函数和过程的源代码<br />
&nbsp;&nbsp; SQL&gt;select text from all_source where owner=user and name=upper('&amp;plsql_name');<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 九、触发器<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 查看触发器<br />
&nbsp;&nbsp; set long 50000;<br />
&nbsp;&nbsp; set heading off;<br />
&nbsp;&nbsp; set pagesize 2000;<br />
&nbsp;&nbsp; select<br />
&nbsp;&nbsp; 'create or replace trigger "' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trigger_name || '"' || chr(10)||<br />
&nbsp;&nbsp;&nbsp; decode( substr( trigger_type, 1, 1 ),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'A', 'AFTER', 'B', 'BEFORE', 'I', 'INSTEAD OF' ) ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chr(10) ||<br />
&nbsp;&nbsp;&nbsp; triggering_event || chr(10) ||<br />
&nbsp;&nbsp;&nbsp; 'ON "' || table_owner || '"."' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table_name || '"' || chr(10) ||<br />
&nbsp;&nbsp;&nbsp; decode( instr( trigger_type, 'EACH ROW' ), 0, null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'FOR EACH ROW' ) || chr(10) ,<br />
&nbsp;&nbsp;&nbsp; trigger_body<br />
&nbsp;&nbsp; from user_triggers; <br />
本贴来自天极网群乐社区--http://q.yesky.com/group/review-17556508.html</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/rain1102/aggbug/258823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-03-10 16:06 <a href="http://www.blogjava.net/rain1102/archive/2009/03/10/258823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 一些命令</title><link>http://www.blogjava.net/rain1102/archive/2009/03/10/258817.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 10 Mar 2009 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/03/10/258817.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/258817.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/03/10/258817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/258817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/258817.html</trackback:ping><description><![CDATA[<p>sqlplus /nolog<br />
SQL&gt;conn /as sys</p>
<p>CREATE USER "TEST"&nbsp; PROFILE "DEFAULT" <br />
IDENTIFIED BY "test" DEFAULT TABLESPACE "TEST" ;</p>
<p>grant connect,resource,dba to "someuser" with admin option;<br />
&nbsp; <br />
查看当前用户的缺省表空间<br />
&nbsp;&nbsp;&nbsp;&nbsp;SQL&gt;select username,default_tablespace from user_users;</p>
<p>查看当前用户的角色<br />
&nbsp;&nbsp;&nbsp;&nbsp;SQL&gt;select * from user_role_privs;</p>
<p>查看当前用户的系统权限和表级权限<br />
&nbsp;&nbsp;&nbsp;&nbsp;SQL&gt;select * from user_sys_privs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;SQL&gt;select * from user_tab_privs;<br />
<br />
查看所有用户<br />
&nbsp;&nbsp;&nbsp;&nbsp;SQL&gt;select &nbsp; username &nbsp; from &nbsp; all_users;</p><img src ="http://www.blogjava.net/rain1102/aggbug/258817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-03-10 15:58 <a href="http://www.blogjava.net/rain1102/archive/2009/03/10/258817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL性能优化〔转贴〕</title><link>http://www.blogjava.net/rain1102/archive/2009/02/25/256703.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 25 Feb 2009 13:42:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/25/256703.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/256703.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/25/256703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/256703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/256703.html</trackback:ping><description><![CDATA[<strong>1. 选择最有效率的表名顺序(只在基于规则的优化器中有效)：<br />
</strong>ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名，FROM子句中写在最后的表(基础表 driving table)将被最先处理，在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.<br />
<strong>2. WHERE子句中的连接顺序：</strong><br />
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.<br />
<strong>3. SELECT子句中避免使用' * '：</strong><br />
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间<br />
<strong>4. &nbsp;减少访问数据库的次数：</strong><br />
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等；<br />
<strong>5. 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200<br />
6. 使用DECODE函数来减少处理时间：</strong><br />
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.<br />
<strong>7. 整合简单,无关联的数据库访问：<br />
</strong>如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)<br />
<strong>8. 删除重复记录：</strong><br />
最高效的删除重复记录方法 ( 因为使用了ROWID)例子：<br />
DELETE&nbsp; FROM&nbsp; EMP E&nbsp; WHERE&nbsp; E.ROWID &gt; (SELECT MIN(X.ROWID) <br />
FROM&nbsp; EMP X&nbsp; WHERE&nbsp; X.EMP_NO = E.EMP_NO);<br />
<strong>9. 用TRUNCATE替代DELETE：<br />
</strong>当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)<br />
<strong>10. 尽量多使用COMMIT：<br />
</strong>只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: <br />
COMMIT所释放的资源: <br />
a. 回滚段上用于恢复数据的信息. <br />
b. 被程序语句获得的锁 <br />
c. redo log buffer 中的空间 <br />
d. ORACLE为管理上述3种资源中的内部花费<br />
<strong>11. 用Where子句替换HAVING子句：<br />
</strong>避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中，on是最先执行，where次之，having最后，因为on是先把不符合条件的记录过滤后才进行统计，它就可以减少中间运算要处理的数据，按理说应该速度是最快的，where也应该比having快点的，因为它过滤数据后才进行sum，在两个表联接时才用on的，所以在一个表的时候，就剩下where跟having比较了。在这单表查询统计的情况下，如果要过滤的条件没有涉及到要计算字段，那它们的结果是一样的，只是where可以使用rushmore技术，而having就不能，在速度上后者要慢如果要涉及到计算的字段，就表示在没计算之前，这个字段的值是不确定的，根据上篇写的工作流程，where的作用时间是在计算之前就完成的，而having就是在计算后才起作用的，所以在这种情况下，两者的结果会不同。在多表联接查询时，on比where更早起作用。系统首先根据各个表之间的联接条件，把多个表合成一个临时表后，再由where进行过滤，然后再计算，计算完后再由having进行过滤。由此可见，要想过滤条件起到正确的作用，首先要明白这个条件应该在什么时候起作用，然后再决定放在那里<br />
<strong>12. 减少对表的查询：<br />
</strong>在含有子查询的SQL语句中,要特别注意减少对表的查询.例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp; SELECT&nbsp; TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT<br />
TAB_NAME,DB_VER FROM&nbsp; TAB_COLUMNS&nbsp; WHERE&nbsp; VERSION = 604)<br />
<strong>13. 通过内部函数提高SQL效率.：</strong><br />
复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的<br />
<strong>14. 使用表的别名(Alias)：</strong><br />
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.<br />
<strong>15. 用EXISTS替代IN、用NOT EXISTS替代NOT IN：</strong><br />
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.<br />
例子：<br />
（高效）SELECT * FROM&nbsp; EMP (基础表)&nbsp; WHERE&nbsp; EMPNO &gt; 0&nbsp; AND&nbsp; EXISTS (SELECT &#8216;X'&nbsp; FROM DEPT&nbsp; WHERE&nbsp; DEPT.DEPTNO = EMP.DEPTNO&nbsp; AND&nbsp; LOC = &#8216;MELB')<br />
&nbsp; (低效)SELECT&nbsp; * FROM&nbsp; EMP (基础表)&nbsp; WHERE&nbsp; EMPNO &gt; 0&nbsp; AND&nbsp; DEPTNO IN(SELECT DEPTNO&nbsp; FROM&nbsp; DEPT&nbsp; WHERE&nbsp; LOC = &#8216;MELB')<br />
<strong>16. 识别'低效执行'的SQL语句</strong>：<br />
虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法：<br />
SELECT&nbsp; EXECUTIONS , DISK_READS, BUFFER_GETS, <br />
ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, <br />
ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, <br />
SQL_TEXT <br />
FROM&nbsp; V$SQLAREA <br />
WHERE&nbsp; EXECUTIONS&gt;0 <br />
AND&nbsp; BUFFER_GETS &gt; 0 <br />
AND&nbsp; (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8 <br />
ORDER BY&nbsp; 4 DESC;<br />
<strong>17. 用索引提高效率：<br />
</strong>索引是表的一个概念部分,用来提高检索数据的效率，ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.：<br />
ALTER&nbsp; INDEX &lt;indexname&gt;&lt;/indexname&gt;REBUILD &lt;tablespacename&gt; &lt;/tablespacename&gt; <br />
<strong>18. 用EXISTS替换DISTINCT：<br />
</strong>当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (低效): <br />
SELECT&nbsp; DISTINCT&nbsp; DEPT_NO,DEPT_NAME&nbsp; FROM&nbsp; DEPT D , EMP E <br />
WHERE&nbsp; D.DEPT_NO = E.DEPT_NO <br />
(高效): <br />
SELECT&nbsp; DEPT_NO,DEPT_NAME&nbsp; FROM&nbsp; DEPT D&nbsp; WHERE&nbsp; EXISTS ( SELECT &#8216;X' <br />
FROM&nbsp; EMP E&nbsp; WHERE E.DEPT_NO = D.DEPT_NO);<br />
<strong>19. sql语句用大写的；因为oracle总是先解析sql语句，把小写的字母转换成大写的再执行<br />
20. 在java代码中尽量少用连接符&#8220;＋&#8221;连接字符串！<br />
21. 避免在索引列上使用NOT 通常，</strong>　<br />
我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE&#8221;遇到&#8221;NOT,他就会停止使用索引转而执行全表扫描.<br />
<strong>22. 避免在索引列上使用计算．</strong><br />
WHERE子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描． <br />
举例: <br />
低效： <br />
SELECT &#8230; FROM&nbsp; DEPT&nbsp; WHERE SAL * 12 &gt; 25000; <br />
高效: <br />
SELECT &#8230; FROM DEPT WHERE SAL &gt; 25000/12;<br />
<strong>23. 用&gt;=替代&gt;</strong><br />
高效: <br />
SELECT * FROM&nbsp; EMP&nbsp; WHERE&nbsp; DEPTNO &gt;=4 <br />
低效: <br />
SELECT * FROM EMP WHERE DEPTNO &gt;3 <br />
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.<br />
<strong>24. 用UNION替换OR (适用于索引列)</strong><br />
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. <br />
高效: <br />
SELECT LOC_ID , LOC_DESC , REGION <br />
FROM LOCATION <br />
WHERE LOC_ID = 10 <br />
UNION <br />
SELECT LOC_ID , LOC_DESC , REGION <br />
FROM LOCATION <br />
WHERE REGION = &#8220;MELBOURNE&#8221; <br />
低效: <br />
SELECT LOC_ID , LOC_DESC , REGION <br />
FROM LOCATION <br />
WHERE LOC_ID = 10 OR REGION = &#8220;MELBOURNE&#8221; <br />
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.<br />
<strong>25. 用IN来替换OR&nbsp; <br />
</strong>这是一条简单易记的规则，但是实际的执行效果还须检验，在ORACLE8i下，两者的执行路径似乎是相同的．　<br />
低效: <br />
SELECT&#8230;. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 <br />
高效 <br />
SELECT&#8230; FROM LOCATION WHERE LOC_IN&nbsp; IN (10,20,30);<br />
<strong>26. 避免在索引列上使用IS NULL和IS NOT NULL</strong><br />
避免在索引中使用任何可以为空的列，ORACLE将无法使用该索引．对于单列索引，如果列包含空值，索引中将不存在此记录. 对于复合索引，如果每个列都为空，索引中同样不存在此记录.　如果至少有一个列不为空，则记录存在于索引中．举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值（123,null）的记录(插入). 然而如果所有的索引列都为空，ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.<br />
低效: (索引失效) <br />
SELECT &#8230; FROM&nbsp; DEPARTMENT&nbsp; WHERE&nbsp; DEPT_CODE IS NOT NULL; <br />
高效: (索引有效) <br />
SELECT &#8230; FROM&nbsp; DEPARTMENT&nbsp; WHERE&nbsp; DEPT_CODE &gt;=0;<br />
<strong>27. 总是使用索引的第一个列：<br />
</strong>如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则，当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引<br />
<strong>28. 用UNION-ALL 替换UNION ( 如果有可能的话)：</strong><br />
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是，UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量<br />
低效： <br />
SELECT&nbsp; ACCT_NUM, BALANCE_AMT <br />
FROM&nbsp; DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95' <br />
UNION <br />
SELECT ACCT_NUM, BALANCE_AMT <br />
FROM DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95' <br />
高效: <br />
SELECT ACCT_NUM, BALANCE_AMT <br />
FROM DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95' <br />
UNION ALL <br />
SELECT ACCT_NUM, BALANCE_AMT <br />
FROM DEBIT_TRANSACTIONS <br />
WHERE TRAN_DATE = '31-DEC-95'<br />
<strong>29. 用WHERE替代ORDER BY：<br />
</strong>ORDER BY 子句只在两种严格的条件下使用索引. <br />
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. <br />
ORDER BY中所有的列必须定义为非空. <br />
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.<br />
例如: <br />
表DEPT包含以下列: <br />
DEPT_CODE PK NOT NULL <br />
DEPT_DESC NOT NULL <br />
DEPT_TYPE NULL<br />
低效: (索引不被使用) <br />
SELECT DEPT_CODE FROM&nbsp; DEPT&nbsp; ORDER BY&nbsp; DEPT_TYPE <br />
高效: (使用索引) <br />
SELECT DEPT_CODE&nbsp; FROM&nbsp; DEPT&nbsp; WHERE&nbsp; DEPT_TYPE &gt; 0<br />
<strong>30. 避免改变索引列的类型.:</strong><br />
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. <br />
假设 EMPNO是一个数值类型的索引列. <br />
SELECT &#8230;&nbsp; FROM EMP&nbsp; WHERE&nbsp; EMPNO = &#8216;123' <br />
实际上,经过ORACLE类型转换, 语句转化为: <br />
SELECT &#8230;&nbsp; FROM EMP&nbsp; WHERE&nbsp; EMPNO = TO_NUMBER(&#8216;123') <br />
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. <br />
现在,假设EMP_TYPE是一个字符类型的索引列. <br />
SELECT &#8230;&nbsp; FROM EMP&nbsp; WHERE EMP_TYPE = 123 <br />
这个语句被ORACLE转换为: <br />
SELECT &#8230;&nbsp; FROM EMP&nbsp; WHERETO_NUMBER(EMP_TYPE)=123 <br />
因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型<br />
<strong>31. 需要当心的WHERE子句:</strong><br />
某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. <br />
在下面的例子里, (1)&#8216;!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) &#8216;||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) &#8216;+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.<br />
<strong>32<br />
a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高. <br />
b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!</strong><br />
<strong>33. 避免使用耗费资源的操作:</strong><br />
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 <br />
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强<br />
<strong>34. 优化GROUP BY:</strong><br />
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.<br />
低效: <br />
SELECT JOB , AVG(SAL) <br />
FROM EMP <br />
GROUP JOB <br />
HAVING JOB = &#8216;PRESIDENT' <br />
OR JOB = &#8216;MANAGER' <br />
高效: <br />
SELECT JOB , AVG(SAL) <br />
FROM EMP <br />
WHERE JOB = &#8216;PRESIDENT' <br />
OR JOB = &#8216;MANAGER' <br />
GROUP JOB<br /><img src ="http://www.blogjava.net/rain1102/aggbug/256703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-02-25 21:42 <a href="http://www.blogjava.net/rain1102/archive/2009/02/25/256703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle清空TEMP01.DBF文件</title><link>http://www.blogjava.net/rain1102/archive/2009/02/24/256495.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 24 Feb 2009 11:24:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/24/256495.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/256495.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/24/256495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/256495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/256495.html</trackback:ping><description><![CDATA[两步<br />
1、先关掉自动增长 <br />
2、resize文件 <br />
<span style="color: #0000ff">alter</span><span style="color: #000000"> </span><span style="color: #0000ff">database</span><span style="color: #000000"> tempfile </span><span style="color: #ff0000">'</span><span style="color: #ff0000">D:\oracle\product\10.2.0\oradata\TEMP01.DBF</span><span style="color: #ff0000">'</span><span style="color: #000000"> autoextend </span><span style="color: #0000ff">off</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">alter</span><span style="color: #000000"> </span><span style="color: #0000ff">database</span><span style="color: #000000"> tempfile </span><span style="color: #ff0000">'</span><span style="color: #ff0000">D:\oracle\product\10.2.0\oradata\TEMP01.DBF</span><span style="color: #ff0000">'</span><span style="color: #000000"> resize 300M;</span><img src ="http://www.blogjava.net/rain1102/aggbug/256495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-02-24 19:24 <a href="http://www.blogjava.net/rain1102/archive/2009/02/24/256495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在本地计算机无法启动OracleDBConsoleorcl服务解决</title><link>http://www.blogjava.net/rain1102/archive/2009/02/24/256479.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 24 Feb 2009 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/24/256479.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/256479.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/24/256479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/256479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/256479.html</trackback:ping><description><![CDATA[在控制面板里启动oracle的服务，其中启动OracleDBConsoleorcl服务时出错，提示：在本地计算机无法启动OracleDBConsoleorcl服务。错误：1053：服务没有及时相应启动或控制请求。重启电脑之后依然如故。<br />
<br />
解决方法：<br />
<br />
在命令行输入<br />
$ emca &#8211;config dbcontrol db <br />
　　输入以下信息：<br />
<br />
　　SID：XXXX <br />
　　Listener port number: 1521<br />
　　Sys 口令：******<br />
　　&#8230;&#8230;<br />
<br />
<p>C:\Documents and Settings\Administrator&gt;emca -config dbcontrol db</p>
<p>EMCA 开始于 2009-2-24 17:04:05<br />
EM Configuration Assistant 10.2.0.1.0 正式版<br />
版权所有 (c) 2003, 2005, Oracle。保留所有权利。</p>
<p>输入以下信息:<br />
数据库 SID: orcl<br />
已为数据库 orcl 配置了 Database Control<br />
您已选择配置 Database Control, 以便管理数据库 orcl<br />
此操作将移去现有配置和默认设置, 并重新执行配置<br />
是否继续? [yes(Y)/no(N)]: y<br />
监听程序端口号: 1521<br />
SYS 用户的口令:<br />
DBSNMP 用户的口令:<br />
SYSMAN 用户的口令:<br />
SYSMAN 用户的口令: 通知的电子邮件地址 (可选): vipzhour@163.com<br />
通知的发件 (SMTP) 服务器 (可选):<br />
-----------------------------------------------------------------</p>
<p>已指定以下设置</p>
<p>数据库 ORACLE_HOME ................ D:\oracle\product\10.2.0\db_1</p>
<p>数据库主机名 ................ cst-server<br />
监听程序端口号 ................ 1521<br />
数据库 SID ................ orcl<br />
通知的电子邮件地址 ............... vipzhour@163.com<br />
通知的发件 (SMTP) 服务器 ...............</p>
<p>-----------------------------------------------------------------<br />
是否继续? [yes(Y)/no(N)]: y<br />
2009-2-24 17:06:50 oracle.sysman.emcp.EMConfig perform<br />
信息: 正在将此操作记录到 D:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\orcl\emc<br />
a_2009-02-24_05-04-05-下午.log。<br />
2009-2-24 17:06:57 oracle.sysman.emcp.util.DBControlUtil stopOMS<br />
信息: 正在停止 Database Control (此操作可能需要一段时间)...<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/256479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-02-24 17:22 <a href="http://www.blogjava.net/rain1102/archive/2009/02/24/256479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看oracle版本命令</title><link>http://www.blogjava.net/rain1102/archive/2009/02/11/254272.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 11 Feb 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/11/254272.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/254272.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/11/254272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/254272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/254272.html</trackback:ping><description><![CDATA[<p>1 &nbsp;查看oracle的版本信息</p>
<p>（1）用客户端连接到数据库，执行select * from v$instance<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查看version项</p>
<p>（2）select * from product_component_version</p>
<p>（3）或查询V$VERSION查看组件级信息</p><img src ="http://www.blogjava.net/rain1102/aggbug/254272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-02-11 16:24 <a href="http://www.blogjava.net/rain1102/archive/2009/02/11/254272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORA-29857: 表空间中存在域索引和/或次级对象</title><link>http://www.blogjava.net/rain1102/archive/2009/01/21/252208.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 21 Jan 2009 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/01/21/252208.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/252208.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/01/21/252208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/252208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/252208.html</trackback:ping><description><![CDATA[select owner,segment_name, segment_type from dba_segments where tablespace_name = 'EXAMPLE'; <br />
<br />
select distinct owner,segment_name, segment_type from dba_extents where tablespace_name='EXAMPLE'; <br />
<br />
查看哪些objects存储在EXAMPLE表空间，将其drop或者move，然后再drop tablespace <br />
<br />
drop tablespace tablespace_name including contents; 命令删除表空间</cn> <br /><img src ="http://www.blogjava.net/rain1102/aggbug/252208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-01-21 14:19 <a href="http://www.blogjava.net/rain1102/archive/2009/01/21/252208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SEQUENCE的简单介绍</title><link>http://www.blogjava.net/rain1102/archive/2009/01/19/251955.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 19 Jan 2009 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/01/19/251955.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/251955.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/01/19/251955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/251955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/251955.html</trackback:ping><description><![CDATA[在oracle中sequence就是所谓的序列号，每次取的时候它会自动增加，一般用在需要按序列号排序的地方。&nbsp; <br />
1、Create&nbsp;Sequence&nbsp; <br />
你首先要有CREATE&nbsp;SEQUENCE或者CREATE&nbsp;ANY&nbsp;SEQUENCE权限，&nbsp; <br />
CREATE&nbsp;SEQUENCE&nbsp;emp_sequence&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;INCREMENT&nbsp;BY&nbsp;1&nbsp;&nbsp;--&nbsp;每次加几个&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;START&nbsp;WITH&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;从1开始计数&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NOMAXVALUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;不设置最大值&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NOCYCLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;一直累加，不循环&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;CACHE&nbsp;10;&nbsp; <br />
<br />
一旦定义了emp_sequence，你就可以用CURRVAL，NEXTVAL&nbsp; <br />
&nbsp;CURRVAL=返回&nbsp;sequence的当前值&nbsp; <br />
&nbsp;NEXTVAL=增加sequence的值，然后返回&nbsp;sequence&nbsp;值&nbsp; <br />
比如：&nbsp; <br />
&nbsp;&nbsp;emp_sequence.CURRVAL&nbsp; <br />
&nbsp;&nbsp;emp_sequence.NEXTVAL&nbsp; <br />
<br />
可以使用sequence的地方：&nbsp; <br />
-&nbsp;不包含子查询、snapshot、VIEW的&nbsp;SELECT&nbsp;语句&nbsp; <br />
-&nbsp;INSERT语句的子查询中&nbsp; <br />
-&nbsp;NSERT语句的VALUES中&nbsp; <br />
-&nbsp;UPDATE&nbsp;的&nbsp;SET中&nbsp;&nbsp;&nbsp; <br />
<br />
可以看如下例子：&nbsp; <br />
INSERT&nbsp;INTO&nbsp;emp&nbsp;VALUES&nbsp;&nbsp; <br />
(empseq.nextval,&nbsp;'LEWIS',&nbsp;'CLERK',7902,&nbsp;SYSDATE,&nbsp;1200,&nbsp;NULL,&nbsp;20);&nbsp; <br />
<br />
SELECT&nbsp;empseq.currval&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;DUAL;&nbsp; <br />
<br />
但是要注意的是：&nbsp; <br />
-&nbsp;第一次NEXTVAL返回的是初始值；随后的NEXTVAL会自动增加你定义的INCREMENT&nbsp;BY值，然后返回增加后的值。CURRVAL&nbsp;总是返回当前SEQUENCE的值，但是在第一次NEXTVAL初始化之后才能使用CURRVAL，否则会出错。一次NEXTVAL会增加一次SEQUENCE的值，所以如果你在同一个语句里面使用多个NEXTVAL，其值就是不一样的。明白？&nbsp; <br />
<br />
-&nbsp;如果指定CACHE值，ORACLE就可以预先在内存里面放置一些sequence，这样存取的快些。cache里面的取完后，oracle自动再取一组到cache。&nbsp;使用cache或许会跳号，&nbsp;比如数据库突然不正常down掉（shutdown&nbsp;abort),cache中的sequence就会丢失.&nbsp;所以可以在create&nbsp;sequence的时候用nocache防止这种情况。&nbsp; <br />
<br />
2、Alter&nbsp;Sequence&nbsp; <br />
你或者是该sequence的owner，或者有ALTER&nbsp;ANY&nbsp;SEQUENCE&nbsp;权限才能改动sequence.&nbsp;可以alter除start至以外的所有sequence参数.如果想要改变start值，必须&nbsp;drop&nbsp;&nbsp;sequence&nbsp;再&nbsp;re-create&nbsp;.&nbsp; <br />
Alter&nbsp;sequence&nbsp;的例子&nbsp; <br />
ALTER&nbsp;SEQUENCE&nbsp;emp_sequence&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;INCREMENT&nbsp;BY&nbsp;10&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;MAXVALUE&nbsp;10000&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;CYCLE&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;到10000后从头开始&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NOCACHE&nbsp;;&nbsp; <br />
<br />
<br />
影响Sequence的初始化参数：&nbsp; <br />
SEQUENCE_CACHE_ENTRIES&nbsp;=设置能同时被cache的sequence数目。&nbsp;&nbsp; <br />
<br />
可以很简单的Drop&nbsp;Sequence&nbsp; <br />
DROP&nbsp;SEQUENCE&nbsp;order_seq;&nbsp;<img src ="http://www.blogjava.net/rain1102/aggbug/251955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-01-19 21:35 <a href="http://www.blogjava.net/rain1102/archive/2009/01/19/251955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle触发器介绍</title><link>http://www.blogjava.net/rain1102/archive/2009/01/19/251954.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 19 Jan 2009 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/01/19/251954.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/251954.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/01/19/251954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/251954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/251954.html</trackback:ping><description><![CDATA[一 触发器介绍<br />
<br />
触发器是一种特殊的存储过程，它在插入，删除或修改特定表中的数据时触发执行，它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下的作用：<br />
<br />
* 安全性。可以基于数据库的值使用户具有操作数据库的某种权利。<br />
<br />
# 可以基于时间限制用户的操作，例如不允许下班后和节假日修改数据库数据。<br />
<br />
# 可以基于数据库中的数据限制用户的操作，例如不允许股票的价格的升幅一次超过10%。<br />
<br />
* 审计。可以跟踪用户对数据库的操作。<br />
<br />
# 审计用户操作数据库的语句。<br />
<br />
# 把用户对数据库的更新写入审计表。<br />
<br />
* 实现复杂的数据完整性规则。<br />
<br />
# 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同，触发器可以引用列或数据库对象。例如，触发器可回退任何企图吃进超过自己保证金的期货。<br />
<br />
# 提供可变的缺省值。<br />
<br />
* 实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。例如，在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。<br />
<br />
# 在修改或删除时级联修改或删除其它表中的与之匹配的行。<br />
<br />
# 在修改或删除时把其它表中的与之匹配的行设成NULL值。<br />
<br />
# 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。<br />
<br />
# 触发器能够拒绝或回退那些破坏相关完整性的变化，取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时，这种触发器会起作用。例如，可以在 books.author_code列上生成一个插入触发器，如果新值与auths.author_code列中的某值不匹配时，插入被回退。<br />
<br />
* 同步实时地复制表中的数据。<br />
<br />
* 自动计算数据值，如果数据的值达到了一定的要求，则进行特定的处理。例如，如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。<br />
<br />
ORACLE与SYBASE数据库的触发器有一定的区别，下面将分别讲述这两种数据库触发器的作用和写法。<br />
<br />
二 ORACLE 触发器<br />
<br />
ORACLE产生数据库触发器的语法为：<br />
<br />
create [or replace] trigger 触发器名 触发时间 触发事件<br />
<br />
on 表名<br />
<br />
[for each row]<br />
<br />
pl/sql 语句<br />
<br />
其中：<br />
<br />
触发器名：触发器对象的名称。由于触发器是数据库自动执行的，因此该名称只是一个名称，没有实质的用途。<br />
<br />
触发时间：指明触发器何时执行，该值可取：<br />
<br />
before---表示在数据库动作之前触发器执行；<br />
<br />
after---表示在数据库动作之后出发器执行。<br />
<br />
触发事件：指明哪些数据库动作会触发此触发器：<br />
<br />
insert：数据库插入会触发此触发器；<br />
<br />
update：数据库修改会触发此触发器；<br />
<br />
delete：数据库删除会触发此触发器。<br />
<br />
表 名：数据库触发器所在的表。<br />
<br />
for each row：对表的每一行触发器执行一次。如果没有这一选项，则只对整个表执行一次。<br />
<br />
举例：下面的触发器在更新表auths之前触发，目的是不允许在周末修改表：<br />
<br />
create trigger auth_secure<br />
<br />
before insert or update or delete //对整表更新前触发<br />
<br />
on auths<br />
<br />
begin<br />
<br />
if(to_char(sysdate,'DY')='SUN'<br />
<br />
RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');<br />
<br />
end if;<br />
<br />
end<br />
<br />
三 SYBASE数据库触发器<br />
<br />
SYBASE数据库触发器的作用与ORACLE非常类似，仅有较小的差异。<br />
<br />
SYBASE产生触发器的语法为：<br />
<br />
CREATE TRIGGER 触发器名<br />
<br />
ON 表名<br />
<br />
FOR INSERT，UPDATE，DELETE<br />
<br />
AS<br />
<br />
SQL_statement |<br />
<br />
FOR INSERT，UPDATE<br />
<br />
AS<br />
<br />
IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...<br />
<br />
SQL_statements<br />
<br />
上面FOR子句用来指定在触发器上的哪些数据更新命令可激活该触发器。IF UPDATE子句检查对指定列的操作类型，在IF UPDATE子句中可指定多个列。<br />
<br />
与ORACLE不同，对于每条SQL语句，触发器只执行一次。触发器在数据更新语句完成以后立即执行。触发器和启动它的语句被当作一个事务处理，事务可以在触发器中回退。<br />
<br />
下面举例说明SYBASE触发器的写法。<br />
<br />
create trigger forinsert_books<br />
<br />
on books<br />
<br />
for insert<br />
<br />
as<br />
<br />
if(select count(*) from auths,inserted<br />
<br />
where auths.author_code=insert.author_code)!=@@rowcount<br />
<br />
begin<br />
<br />
rollback transaction<br />
<br />
print "books 表中 author_code 列的值在auths 表中不存在。"<br />
<br />
end<br /><img src ="http://www.blogjava.net/rain1102/aggbug/251954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-01-19 21:13 <a href="http://www.blogjava.net/rain1102/archive/2009/01/19/251954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA完全控制Oracle中BLOB、CLOB说明 [转]</title><link>http://www.blogjava.net/rain1102/archive/2009/01/15/251466.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 15 Jan 2009 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/01/15/251466.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/251466.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/01/15/251466.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/251466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/251466.html</trackback:ping><description><![CDATA[网络上很多关于JAVA对Oracle中BLOB、CLOB类型字段的操作说明，有的不够全面，有的不够准确，甚至有的简直就是胡说八道。最近的项目正巧用到了这方面的知识，在这里做个总结。<br />
环境：<br />
Database: Oracle 9i<br />
App Server: BEA Weblogic 8.14<br />
表结构：<br />
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), BLOBATTR Blob)<br />
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), CLOBATTR Clob)<br />
<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 可以通过JDBC，也可以通过JNDI访问并操作数据库，这两种方式的具体操作存在着一些差异，由于通过App Server的数据库连接池JNDI获得的数据库连接提供的java.sql.Blob和java.sql.Clob实现类与JDBC方式提供的不同，因此在入库操作的时候需要分别对待；出库操作没有这种差异，因此不用单独对待。<br />
<br />
一、BLOB操作<br />
1、入库<br />
（1）JDBC方式<br />
<br />
//通过JDBC获得数据库连接<br />
Class.forName("oracle.jdbc.driver.OracleDriver");<br />
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");<br />
con.setAutoCommit(false);<br />
Statement st = con.createStatement();<br />
//插入一个空对象empty_blob()<br />
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");<br />
//锁定数据行进行更新，注意&#8220;for update&#8221;语句<br />
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");<br />
if (rs.next())<br />
{<br />
//得到java.sql.Blob对象后强制转换为oracle.sql.BLOB<br />
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");<br />
OutputStream outStream = blob.getBinaryOutputStream();<br />
//data是传入的byte数组，定义：byte[] data<br />
outStream.write(data, 0, data.length);<br />
}<br />
outStream.flush();<br />
outStream.close();<br />
con.commit();<br />
con.close();<br />
<br />
<br />
<br />
（2）JNDI方式<br />
<br />
//通过JNDI获得数据库连接<br />
Context context = new InitialContext();<br />
ds = (DataSource) context.lookup("ORA_JNDI");<br />
Connection con = ds.getConnection();<br />
con.setAutoCommit(false);<br />
Statement st = con.createStatement();<br />
//插入一个空对象empty_blob()<br />
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");<br />
//锁定数据行进行更新，注意&#8220;for update&#8221;语句<br />
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");<br />
if (rs.next())<br />
{<br />
//得到java.sql.Blob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinBlob（不同的App Server对应的可能会不同）<br />
weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");<br />
OutputStream outStream = blob.getBinaryOutputStream();<br />
//data是传入的byte数组，定义：byte[] data<br />
outStream.write(data, 0, data.length);<br />
}<br />
outStream.flush();<br />
outStream.close();<br />
con.commit();<br />
con.close();<br />
<br />
<br />
<br />
2、出库<br />
<br />
//获得数据库连接<br />
Connection con = ConnectionFactory.getConnection();<br />
con.setAutoCommit(false);<br />
Statement st = con.createStatement();<br />
//不需要&#8220;for update&#8221;<br />
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");<br />
if (rs.next())<br />
{<br />
<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.Blob blob = rs.getBlob("BLOBATTR");<br />
InputStream inStream = blob.getBinaryStream();<br />
//data是读出并需要返回的数据，类型是byte[]<br />
data = new byte[input.available()];<br />
inStream.read(data);<br />
inStream.close();<br />
}<br />
inStream.close();<br />
con.commit();<br />
con.close();<br />
<br />
<br />
<br />
二、CLOB操作<br />
1、入库<br />
（1）JDBC方式<br />
<br />
//通过JDBC获得数据库连接<br />
Class.forName("oracle.jdbc.driver.OracleDriver");<br />
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");<br />
con.setAutoCommit(false);<br />
Statement st = con.createStatement();<br />
//插入一个空对象empty_clob()<br />
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");<br />
//锁定数据行进行更新，注意&#8220;for update&#8221;语句<br />
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");<br />
if (rs.next())<br />
{<br />
//得到java.sql.Clob对象后强制转换为oracle.sql.CLOB<br />
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");<br />
Writer outStream = clob.getCharacterOutputStream();<br />
//data是传入的字符串，定义：String data<br />
char[] c = data.toCharArray();<br />
outStream.write(c, 0, c.length);<br />
}<br />
outStream.flush();<br />
outStream.close();<br />
con.commit();<br />
con.close();<br />
<br />
<br />
<br />
（2）JNDI方式<br />
<br />
//通过JNDI获得数据库连接<br />
Context context = new InitialContext();<br />
ds = (DataSource) context.lookup("ORA_JNDI");<br />
Connection con = ds.getConnection();<br />
con.setAutoCommit(false);<br />
Statement st = con.createStatement();<br />
//插入一个空对象empty_clob()<br />
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");<br />
//锁定数据行进行更新，注意&#8220;for update&#8221;语句<br />
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");<br />
if (rs.next())<br />
{<br />
//得到java.sql.Clob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinClob（不同的App Server对应的可能会不同）<br />
weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");<br />
Writer outStream = clob.getCharacterOutputStream();<br />
//data是传入的字符串，定义：String data<br />
char[] c = data.toCharArray();<br />
outStream.write(c, 0, c.length);<br />
}<br />
outStream.flush();<br />
outStream.close();<br />
con.commit();<br />
con.close();<br />
<br />
<br />
<br />
2、出库<br />
<br />
//获得数据库连接<br />
Connection con = ConnectionFactory.getConnection();<br />
con.setAutoCommit(false);<br />
Statement st = con.createStatement();<br />
//不需要&#8220;for update&#8221;<br />
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");<br />
if (rs.next())<br />
{<br />
<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.Clob clob = rs.getClob("CLOBATTR");<br />
Reader inStream = clob.getCharacterStream();<br />
char[] c = new char[(int) clob.length()];<br />
inStream.read(c);<br />
//data是读出并需要返回的数据，类型是String<br />
data = new String(c);<br />
inStream.close();<br />
}<br />
inStream.close();<br />
con.commit();<br />
con.close();<br />
<br />
<br />
<br />
需要注意的地方：<br />
1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob几种类型的区别<br />
2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob几种类型的区别<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/251466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-01-15 16:51 <a href="http://www.blogjava.net/rain1102/archive/2009/01/15/251466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORA-01659: 无法分配超出 7 的 MINEXTENTS</title><link>http://www.blogjava.net/rain1102/archive/2009/01/14/251330.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 14 Jan 2009 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/01/14/251330.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/251330.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/01/14/251330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/251330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/251330.html</trackback:ping><description><![CDATA[<p><font color="#ff0000">ORA-01659: 无法分配超出 7 的 MINEXTENTS (在表空间 PERFSTAT 中)</font></p>
<p>主要原因是表空间不够,将其设置为自动扩展即可。</p>
<p>alter database datafile 'D:\oracle\product\10.2.0\oradata\oracle\perfstat.dbf' autoextend on;</p>
<p>或者可以在创建perfstat表空间的时候进行设置：</p>
<p>create tablespace perfstat</p>
<p>datafile 'D:\oracle\product\10.2.0\oradata\oracle\perfstat.dbf' size 100m autoextend on</p>
<p>extend management local;</p>
<br />
当然也可以从Oracle Enterprise Manager Console中设置：<br />
存储－》表空间－》你的表空间名称－》数据库文件<br />
然后选择你的数据文件，并选择右面的&#8220;存储&#8221;选项，勾选数据文件满后自动扩展并设置增量值。<img src ="http://www.blogjava.net/rain1102/aggbug/251330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-01-14 18:16 <a href="http://www.blogjava.net/rain1102/archive/2009/01/14/251330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下Oracle 10G Client安装 </title><link>http://www.blogjava.net/rain1102/archive/2008/12/09/245275.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 09 Dec 2008 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/12/09/245275.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/245275.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/12/09/245275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/245275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/245275.html</trackback:ping><description><![CDATA[1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: SimSun">在</span>Oracle<span style="font-family: SimSun">官方网站</span><a href="http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html">http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html</a><a name="ic_basic_win32_10203_20061115"><span style="font-family: SimSun">下载</span></a><a href="http://download.oracle.com/otn/nt/instantclient/instantclient-basic-win32-10.2.0.3-20061115.zip">instantclient-basic-win32-10.2.0.3-20061115.zip</a> (34,469,920 bytes)<br />
2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: SimSun">解压到</span>C:\oraclient<span style="font-family: SimSun">目录下</span>,<span style="font-family: SimSun">包括以下几个文件</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp; classes12.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp; ocijdbc10.dll<br />
&nbsp;&nbsp;&nbsp;&nbsp; ojdbc14.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp; oraocci10.dll<br />
&nbsp;&nbsp;&nbsp;&nbsp; oci.dll<br />
&nbsp;&nbsp;&nbsp;&nbsp; ociw32.dll<br />
&nbsp;&nbsp;&nbsp;&nbsp; orannzsbb10.dll<br />
&nbsp;&nbsp;&nbsp;&nbsp; oraociei10.dll<br />
3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: SimSun">建立</span>C:\oraclien\network\admin<span style="font-family: SimSun">目录</span>,<span style="font-family: SimSun">在</span>C:\oraclien\network\admin<span style="font-family: SimSun">目录下建立</span>tnsnames.ora<span style="font-family: SimSun">文件<br />
</span>4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: SimSun">在环境参数</span>Path<span style="font-family: SimSun">增加</span>C:\oraclien;<span style="font-family: SimSun"><span style="color: #ff0000"><span style="font-family: SimSun">注意</span>, C:\oraclien;<span style="font-family: SimSun">一定要是在</span>Path<span style="font-family: SimSun">环境参数的最前面</span>,<span style="font-family: SimSun">如果不是</span>,<span style="font-family: SimSun">当应用程序连接</span>oracle<span style="font-family: SimSun">时将报找不到</span>oci.dll<span style="font-family: SimSun">的错误</span>.</span></span><br />
5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: SimSun">安装完成<br />
</span><span style="font-family: SimSun">注</span>: <span style="font-family: SimSun">您也可以在以下路经下载完整版的</span>Oracle 10G Client&nbsp;<span style="font-family: SimSun">安装文件<br />
</span><a href="http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip">http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip</a><img src ="http://www.blogjava.net/rain1102/aggbug/245275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-12-09 15:51 <a href="http://www.blogjava.net/rain1102/archive/2008/12/09/245275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中Case的使用方法(下篇) (转载)</title><link>http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 24 Sep 2008 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/230840.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/230840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/230840.html</trackback:ping><description><![CDATA[<strong>四，根据条件有选择的UPDATE。</strong> <br />
<br />
例，有如下更新条件
<ol>
    <li>工资5000以上的职员，工资减少10%
    <li>工资在2000到4600之间的职员，工资增加15% </li>
</ol>
很容易考虑的是选择执行两次UPDATE语句，如下所示 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #800080">--条件1</span>
<span style="color: #0000ff">UPDATE</span> Personnel
<span style="color: #0000ff">SET</span> salary = salary * 0.9
<span style="color: #0000ff">WHERE</span> salary &gt;= 5000;
<span style="color: #800080">--条件2</span>
<span style="color: #0000ff">UPDATE</span> Personnel
<span style="color: #0000ff">SET</span> salary = salary * 1.15
<span style="color: #0000ff">WHERE</span> salary &gt;= 2000 <span style="color: #0000ff">AND</span> salary &lt; 4600;
</pre>
<br />
但是事情没有想象得那么简单，假设有个人工资5000块。首先，按照条件1，工资减少10%，变成工资4500。接下来运行第二个SQL时候，因为这个人的工资是4500在2000到4600的范围之内， 需增加15%，最后这个人的工资结果是5175,不但没有减少，反而增加了。如果要是反过来执行，那么工资4600的人相反会变成减少工资。暂且不管这个规章是多么荒诞，如果想要一个SQL 语句实现这个功能的话，我们需要用到Case函数。代码如下: <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">UPDATE</span> Personnel
<span style="color: #0000ff">SET</span> salary = <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> salary &gt;= 5000
　            <span style="color: #0000ff">THEN</span> salary * 0.9
<span style="color: #0000ff">WHEN</span> salary &gt;= 2000 <span style="color: #0000ff">AND</span> salary &lt; 4600
<span style="color: #0000ff">THEN</span> salary * 1.15
<span style="color: #0000ff">ELSE</span> salary <span style="color: #0000ff">END</span>;
</pre>
<br />
这里要注意一点，最后一行的ELSE salary是必需的，要是没有这行，不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL，这点是需要注意的地方。 <br />
这种方法还可以在很多地方使用，比如说变更主键这种累活。 <br />
一般情况下，要想把两条数据的Primary key,a和b交换，需要经过临时存储，拷贝，读回数据的三个过程，要是使用Case函数的话，一切都变得简单多了。 <br />
<table style="border-right: #1e7ab4 1px solid; padding-right: 0px; border-top: #1e7ab4 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: #1e7ab4 1px solid; padding-top: 0px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse" width="300">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">p_key</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">col_1</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">col_2</td>
        </tr>
        <tr>
            <td align="center">a</td>
            <td align="center">1</td>
            <td align="center">张三</td>
        </tr>
        <tr>
            <td align="center">b</td>
            <td align="center">2</td>
            <td align="center">李四</td>
        </tr>
        <tr>
            <td align="center">c</td>
            <td align="center">3</td>
            <td align="center">王五</td>
        </tr>
    </tbody>
</table>
<br />
<br />
假设有如上数据，需要把主键<code>a</code>和<code>b</code>相互交换。用Case函数来实现的话，代码如下 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">UPDATE</span> SomeTable
<span style="color: #0000ff">SET</span> p_key = <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> p_key = <span style="color: #800080">'a'</span>
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'b'</span>
<span style="color: #0000ff">WHEN</span> p_key = <span style="color: #800080">'b'</span>
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'a'</span>
<span style="color: #0000ff">ELSE</span> p_key <span style="color: #0000ff">END</span>
<span style="color: #0000ff">WHERE</span> p_key <span style="color: #0000ff">IN</span> (<span style="color: #800080">'a'</span>, <span style="color: #800080">'b'</span>);
</pre>
<br />
同样的也可以交换两个Unique key。需要注意的是，如果有需要交换主键的情况发生，多半是当初对这个表的设计进行得不够到位，建议检查表的设计是否妥当。 <br />
<br />
<strong>五，两个表数据是否一致的检查。</strong> <br />
<br />
Case函数不同于DECODE函数。在Case函数中，可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS，可以进行子查询，从而 实现更多的功能。 <br />
下面具个例子来说明，有两个表，tbl_A,tbl_B，两个表中都有keyCol列。现在我们对两个表进行比较，tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到， 返回结果'Matched',如果没有找到，返回结果'Unmatched'。 <br />
要实现下面这个功能，可以使用下面两条语句 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--使用IN的时候</span>
<span style="color: #0000ff">SELECT</span> keyCol,
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> keyCol <span style="color: #0000ff">IN</span> ( <span style="color: #0000ff">SELECT</span> keyCol <span style="color: #0000ff">FROM</span> tbl_B )
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'Matched'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'Unmatched'</span> <span style="color: #0000ff">END</span> Label
<span style="color: #0000ff">FROM</span> tbl_A;
<span style="color: #008000">--使用EXISTS的时候</span>
<span style="color: #0000ff">SELECT</span> keyCol,
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> EXISTS ( <span style="color: #0000ff">SELECT</span> * <span style="color: #0000ff">FROM</span> tbl_B
<span style="color: #0000ff">WHERE</span> tbl_A.keyCol = tbl_B.keyCol )
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'Matched'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'Unmatched'</span> <span style="color: #0000ff">END</span> Label
<span style="color: #0000ff">FROM</span> tbl_A;
</pre>
<br />
使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS，但是这个时候要注意NULL的情况。 <br />
<br />
<strong>六，在Case函数中使用合计函数</strong> <br />
<br />
假设有下面一个表<br />
<table style="border-right: #1e7ab4 1px solid; padding-right: 1px; border-top: #1e7ab4 1px solid; padding-left: 1px; padding-bottom: 1px; border-left: #1e7ab4 1px solid; padding-top: 1px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">学号(std_id)</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">课程ID(class_id)</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">课程名(class_name)</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">主修flag（main_class_flg)</td>
        </tr>
        <tr>
            <td align="center">100</td>
            <td align="center">1</td>
            <td align="center">经济学</td>
            <td align="center">Y</td>
        </tr>
        <tr>
            <td align="center">100</td>
            <td align="center">2</td>
            <td align="center">历史学</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">200</td>
            <td align="center">2</td>
            <td align="center">历史学</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">200</td>
            <td align="center">3</td>
            <td align="center">考古学</td>
            <td align="center">Y</td>
        </tr>
        <tr>
            <td align="center">200</td>
            <td align="center">4</td>
            <td align="center">计算机</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">300</td>
            <td align="center">4</td>
            <td align="center">计算机</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">400</td>
            <td align="center">5</td>
            <td align="center">化学</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">500</td>
            <td align="center">6</td>
            <td align="center">数学</td>
            <td align="center">N</td>
        </tr>
    </tbody>
</table>
<br />
有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生，要选择一门课程作为主修，主修flag里面写入 Y。只选择一门课程的学生，主修flag为N(实际上要是写入Y的话，就没有下面的麻烦事了，为了举例子，还请多多包含)。 <br />
现在我们要按照下面两个条件对这个表进行查询
<ol>
    <li>只选修一门课程的人，返回那门课程的ID
    <li>选修多门课程的人，返回所选的主课程ID </li>
</ol>
<br />
简单的想法就是，执行两条不同的SQL语句进行查询。 <br />
条件1 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--条件1：只选择了一门课程的学生</span>
<span style="color: #0000ff">SELECT</span> std_id, MAX(class_id) <span style="color: #0000ff">AS</span> main_class
<span style="color: #0000ff">FROM</span> Studentclass
<span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> std_id
<span style="color: #0000ff">HAVING</span> COUNT(*) = 1;
</pre>
<br />
执行结果1 <br />
<pre class="src">STD_ID   MAIN_class
<span style="color: #008000">------   ----------</span>
300      4
400      5
500      6
</pre>
<br />
条件2 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--条件2：选择多门课程的学生</span>
<span style="color: #0000ff">SELECT</span> std_id, class_id <span style="color: #0000ff">AS</span> main_class
<span style="color: #0000ff">FROM</span> Studentclass
<span style="color: #0000ff">WHERE</span> main_class_flg = <span style="color: #800080">'Y'</span> ;
</pre>
<br />
执行结果2 <br />
<pre style="line-height: 109%; background-color: #fff7d6">STD_ID  MAIN_class
<span style="color: #008000">------  ----------</span>
100     1
200     3
</pre>
<br />
如果使用Case函数，我们只要一条SQL语句就可以解决问题，具体如下所示 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">SELECT</span>  std_id,
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> COUNT(*) = 1  <span style="color: #008000">--只选择一门课程的学生的情况</span>
<span style="color: #0000ff">THEN</span> MAX(class_id)
<span style="color: #0000ff">ELSE</span> MAX(<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> main_class_flg = <span style="color: #800080">'Y'</span>
<span style="color: #0000ff">THEN</span> class_id
<span style="color: #0000ff">ELSE</span> <span style="color: #0000ff">NULL</span> <span style="color: #0000ff">END</span>
)
<span style="color: #0000ff">END</span> <span style="color: #0000ff">AS</span> main_class
<span style="color: #0000ff">FROM</span> Studentclass
<span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> std_id;
</pre>
<br />
运行结果 <br />
<pre style="line-height: 109%; background-color: #fff7d6">STD_ID   MAIN_class
<span style="color: #008000">------   ----------</span>
100      1
200      3
300      4
400      5
500      6
</pre>
<br />
通过在Case函数中嵌套Case函数，在合计函数中使用Case函数等方法，我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。 <br />
最后提醒一下使用Case函数的新手注意不要犯下面的错误 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">CASE</span> col_1
<span style="color: #0000ff">WHEN</span> 1    　   <span style="color: #0000ff">THEN</span> <span style="color: #800080">'Right'</span>
<span style="color: #0000ff">WHEN</span> <strong class="more">NULL</strong>  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'Wrong'</span>
<span style="color: #0000ff">END</span>
</pre>
<br />
在这个语句中When Null这一行总是返回unknown，所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL，这是一个错误的用法，这个时候我们应该选择用WHEN col_1 IS NULL。<img src ="http://www.blogjava.net/rain1102/aggbug/230840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-09-24 11:29 <a href="http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>