﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-黑咖啡-随笔分类-ORACLE</title><link>http://www.blogjava.net/kyleYang/category/42932.html</link><description>孩儿立志出乡关，学不成名誓不还。
风华正茂乾坤地，人生无处不青山。
光阴如同流水去，珍惜时光最宝贵。
鹏程万里靠自己，飞黄腾达青少年。
</description><language>zh-cn</language><lastBuildDate>Thu, 12 Aug 2010 12:28:23 GMT</lastBuildDate><pubDate>Thu, 12 Aug 2010 12:28:23 GMT</pubDate><ttl>60</ttl><item><title>oracle中显式游标和隐式游标比较</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Tue, 10 Aug 2010 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/328420.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/328420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/328420.html</trackback:ping><description><![CDATA[
		<div>
				<font style="FONT-SIZE: 12px" face="宋体" color="#000080" size="3">   在数据库中，游标是一个十分重要的概念，游标提供了一种灵活手段，可以对表中检索出的数据进行操作。就本质而言，游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。<br />   游标由结果集和结果集中指向特定记录的游标位置组成，游标充当指针的作用。尽管游标能够遍历查询结果中的所有行，但它一次只能指向一行。<br />   使用数据游标可以选择一组数据，可以在记录集上滚动游标，并检查游标指向的每一行数据。可以用局部变量和游标的组合来分别检查每个记录，并在转移到下一个记录之前，进行所需的任何外部操作。游标的另一个常见用途是保存查询结果，以便以后使用。游标的结果集是由select语句产生，如果处理过程需要重复使用一个记录集，那么创建一次游标而重复使用若干次，比重复查询数据库要快得多。<br />    显式游标</font>
		</div>
		<div>
				<font style="FONT-SIZE: 12px" face="宋体" color="#000080" size="3">    在大多数时候我们在设计程序的时候都遵循下面的步骤:<br />　　　1、打开游标<br />　　　2、开始循环<br />　　　3、从游标中取值<br />　　  4、检查那一行被返回<br />　　  5、处理<br />　　  6、关闭循环<br />　　  7、关闭游标<br />但还有一种游标与这种不相同，这就是FOR循环，用于FOR循环的游标按照正常的声明方式声明，它的优点在于不需要显式的打开、关闭、取数据，测试数据的存在、定义存放数据的变量等等。</font>
		</div>
<img src ="http://www.blogjava.net/kyleYang/aggbug/328420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-10 15:29 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Exception</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Tue, 03 Aug 2010 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/327806.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/327806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/327806.html</trackback:ping><description><![CDATA[1) 基本结构<br />  BEGIN<br />    ... --语句<br />  EXCEPTION -- 例外处理 <br />    WHEN ...<br />    ...<br />    WHEN OTHERS<br />      ...<br />  END;
<p>  2) 常用预定义例外<br />  EXCEPTION <br />    WHEN CURSOR_ALREADY_OPEN THEN -- ORA-06511 SQLCODE = -6511 游标已经打开<br />      ...<br />    WHEN DUP_VAL_ON_INDEX THEN -- ORA-00001 SQLCODE = -1 向唯一索引中插入重复数据<br />      ...<br />    WHEN INVALID_CURSOR THEN -- ORA-01001 SQLCODE = -1001 非法游标操作<br />      ...<br />    WHEN INVALID_NUMBER THEN -- ORA-01722 SQLCODE = -1722 字符向数字转换失败<br />      ...<br />    WHEN LOGIN_DENIED THEN -- ORA-01017 SQLCODE = -1017 <br />      ...<br />    WHEN NO_DATA_FOUND THEN -- ORA-01403 SQLCODE = +100 没有找到数据<br />      ...<br />    WHEN NOT_LOGGED_ON THEN -- ORA-01012 SQLCODE = -1012 <br />      ...<br />    WHEN PROGRAM_ERROR THEN -- ORA-06501 SQLCODE = -6501 程序错误<br />      ...<br />    WHEN STORAGE_ERROR THEN -- ORA-06500 SQLCODE = -6500 <br />      ...<br />    WHEN TIMEOUT_ON_RESOURCE THEN -- ORA-00051 SQLCODE = -51<br />      ...<br />    WHEN TOO_MANY_ROWS THEN -- ORA-01422 SQLCODE = -1422 返回多行<br />      ...<br />    WHEN TRANSACTION_BACKED_OUT THEN -- ORA-00061 SQLCODE = -61<br />      ...<br />    WHEN VALUE_ERROR THEN -- ORA-06502 SQLCODE = -6502 数值转换错误<br />      ...<br />    WHEN ZERO_DIVIDE THEN -- ORA-01476 SQLCODE = -1476 被零除<br />      ...<br />    WHEN OTHERS THEN -- 其它任何错误的处理<br />      ...<br />  END;</p><p>  3) 用户定义的例外<br />  DECLARE<br />    FIND_DATA_EMP    EXCEPTION;<br />  BEGIN<br />    IF ... THEN<br />      RAISE FIND_DATA_EMP;<br />    END IF;<br />  EXCEPTION<br />    WHEN LOB_NO_LOCKED THEN<br />      ...<br />  END;<br />  4) EXCEPTION_INIT的使用<br />  PRAGMA EXCEPTION_INIT(例外名, ORACLE错误号);<br />  注：PRAGMA 是一个编译器命令，可以认为是对编译器的一个注释。<br />  例：<br />  DECLARE<br />    ZERO_DIVIDE1    EXCEPTION;<br />    PRAGMA EXCEPTION_INIT(ZERO_DIVIDE1, -1476);<br />  BEGIN<br />    ...<br />  EXCEPTION<br />    WHEN ZERO_DIVIDE1 THEN<br />      ...<br />  END;</p><img src ="http://www.blogjava.net/kyleYang/aggbug/327806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-03 11:32 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle索引的5种使用模式</title><link>http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Sun, 25 Jul 2010 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/327107.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/327107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/327107.html</trackback:ping><description><![CDATA[索引的使用对数据库的性能有巨大的影响。 <br />共有五类不同的使用模式。 <br /><br />1。INDEX UNIQUE SCAN    效率最高，主键或唯一索引 <br />2。INDEX FULL SCAN      有顺序的输出，不能并行读索引 <br />3。INDEX FAST FULL SCAN  读的最块，可以并行访问索引，但输出不按顺序 <br />4。INDEX RANGE SCAN      给定的区间查询 <br />5。INDEX SKIP SCAN       联合索引，不同值越少的列，越要放在前面 <br /><br />--实验后的总论。 <br />能用唯一索引，一定用唯一索引 <br />能加非空，就加非空约束 <br />一定要统计表的信息，索引的信息，柱状图的信息。 <br />联合索引的顺序不同，影响索引的选择，尽量将值少的放在前面 <br />只有做到以上四点，数据库才会正确的选择执行计划。 <br />conn system/manager <br />grant select any dictionary to scott; <br /><br />conn scott/tiger <br />drop table t1 purge; <br />create table t1 as select * from dba_objects; <br />analyze table t1 compute statistics; <br />create index it1 on t1(object_type); <br />set autot traceonly <br /><br />select distinct object_type from t1; <br />将是全表扫描，为什么不使用索引呢？因为索引中不能含有null值， <br />如果使用索引就可能产生不正确的结果。 <br /><br />--增加非空约束 <br />alter table t1 modify (object_type not null); <br />select distinct object_type from t1  ; <br />使用INDEX FAST FULL SCAN方式查找数据 <br /><br />-- <br />select  object_type from t1; <br />使用INDEX FAST FULL SCAN，因为不需要排序 <br /><br />select  object_type from t1 order by 1; <br />使用INDEX FULL SCAN,因为要按照顺序输出 <br /><br />select  object_type from t1 where object_type='TABLE'; <br />使用INDEX RANGE SCAN <br /><br />--使用非唯一索引 <br />create index i2t1 on t1(object_id); <br />select * from t1 where object_id=3762; <br />使用INDEX RANGE SCAN,因为数据库不知道是否唯一 <br /><br />--使用唯一索引 <br />drop index i2t1; <br />create unique index i2t1 on t1(object_id); <br />使用INDEX UNIQUE SCAN,因为数据库知道是唯一的 <br /><br />--跳跃的扫描索引 <br />create index i3t1 on t1(object_type,object_name); <br />select * from t1 where object_name='EMP'; <br />select object_name from t1 where object_name='EMP'; <br />使用INDEX SKIP SCAN，因为数据库知道可以跳过object_type,虽然object_name在第二个列。 <br /><br />--联合索引的顺序不同，影响索引的选择，尽量将值少的放在前面 <br />drop index i3t1; <br />drop index it1; <br />create index i3t1 on t1(object_name,object_type); <br />select * from t1 where object_type='TABLE'; <br />计划为全表扫描。 <img src ="http://www.blogjava.net/kyleYang/aggbug/327107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-07-26 00:28 <a href="http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>递归写法 -- DB2</title><link>http://www.blogjava.net/kyleYang/archive/2010/03/26/316649.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Fri, 26 Mar 2010 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/03/26/316649.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/316649.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/03/26/316649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/316649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/316649.html</trackback:ping><description><![CDATA[WITH TROOT (ROW_ID,PARENT_MODULE_ID,MENU_NAME) <br />AS (<br />         SELECT ROW_ID,PARENT_MODULE_ID,MENU_NAME FROM          ad_program <br />         WHERE row_id=50<br />         UNION ALL<br />         SELECT A.ROW_ID,A.PARENT_MODULE_ID,A.MENU_NAME<br />         FROM ad_program A,TROOT B <br />         WHERE  A.PARENT_MODULE_ID=B.ROW_ID<br />)<br />SELECT * FROM TROOT<img src ="http://www.blogjava.net/kyleYang/aggbug/316649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-03-26 16:16 <a href="http://www.blogjava.net/kyleYang/archive/2010/03/26/316649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oralce 在防火墙后的访问</title><link>http://www.blogjava.net/kyleYang/archive/2010/02/02/311603.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Tue, 02 Feb 2010 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/02/02/311603.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/311603.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/02/02/311603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/311603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/311603.html</trackback:ping><description><![CDATA[在注册表：<br />HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0<br />上新建一个字符串值：<br />USE_SHARED_SOCKET=<span class="java-keyword">true</span>。<img src ="http://www.blogjava.net/kyleYang/aggbug/311603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-02-02 09:25 <a href="http://www.blogjava.net/kyleYang/archive/2010/02/02/311603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 用户数据字典 以及 查询表字段</title><link>http://www.blogjava.net/kyleYang/archive/2010/02/02/311599.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Tue, 02 Feb 2010 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/02/02/311599.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/311599.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/02/02/311599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/311599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/311599.html</trackback:ping><description><![CDATA[
		<span style="COLOR: #ff0000">查看当前用户的缺省表空间<br />SQL&gt;select username,default_tablespace from user_users;<br /><br />查看当前用户的角色<br />SQL&gt;select * from user_role_privs;<br /><br />查看当前用户的系统权限和表级权限<br />SQL&gt;select * from user_sys_privs;<br />SQL&gt;select * from user_tab_privs;<br /><br />查看用户下所有的表<br />SQL&gt;select * from user_tables;<br /><br />显示用户信息(所属表空间)<br />select default_tablespace,temporary_tablespace<br />from dba_users where username='GAME';<br /><br />1、用户<br /><br />查看当前用户的缺省表空间<br />SQL&gt;select username,default_tablespace from user_users;<br /><br />查看当前用户的角色<br />SQL&gt;select * from user_role_privs;<br /><br />查看当前用户的系统权限和表级权限<br />SQL&gt;select * from user_sys_privs;<br />SQL&gt;select * from user_tab_privs;<br /><br />显示当前会话所具有的权限<br />SQL&gt;select * from session_privs;<br /><br />显示指定用户所具有的系统权限<br />SQL&gt;select * from dba_sys_privs where grantee='GAME';<br /><br />显示特权用户<br />select * from v$pwfile_users;<br /><br />显示用户信息(所属表空间)<br />select default_tablespace,temporary_tablespace<br />from dba_users where username='GAME';<br /><br />显示用户的PROFILE<br />select profile from dba_users where username='GAME';<br /><br /><br />2、表<br /><br />查看用户下所有的表<br />SQL&gt;select * from user_tables;<br /><br />查看名称包含log字符的表<br />SQL&gt;select object_name,object_id from user_objects<br />where instr(object_name,'LOG')&gt;0;<br /><br />查看某表的创建时间<br />SQL&gt;select object_name,created from user_objects where object_name=upper('&amp;table_name');<br /><br />查看某表的大小<br />SQL&gt;select sum(bytes)/(1024*1024) as "size(M)" from user_segments<br />where segment_name=upper('&amp;table_name');<br /><br />查看放在ORACLE的内存区里的表<br />SQL&gt;select table_name,cache from user_tables where instr(cache,'Y')&gt;0;<br /><br />3、索引<br /><br />查看索引个数和类别<br />SQL&gt;select index_name,index_type,table_name from user_indexes order by table_name;<br /><br />查看索引被索引的字段<br />SQL&gt;select * from user_ind_columns where index_name=upper('&amp;index_name');<br /><br />查看索引的大小<br />SQL&gt;select sum(bytes)/(1024*1024) as "size(M)" from user_segments<br />where segment_name=upper('&amp;index_name');<br /><br />4、序列号<br /><br />查看序列号，last_number是当前值<br />SQL&gt;select * from user_sequences;<br /><br />5、视图<br /><br />查看视图的名称<br />SQL&gt;select view_name from user_views;<br /><br />查看创建视图的select语句<br />SQL&gt;set view_name,text_length from user_views;<br />SQL&gt;set long 2000; 说明：可以根据视图的text_length值设定set long 的大小<br />SQL&gt;select text from user_views where view_name=upper('&amp;view_name');<br /><br />6、同义词<br /><br />查看同义词的名称<br />SQL&gt;select * from user_synonyms;<br /><br />7、约束条件<br /><br />查看某表的约束条件<br />SQL&gt;select constraint_name, constraint_type,search_condition, r_constraint_name<br />from user_constraints where table_name = upper('&amp;table_name');<br /><br />SQL&gt;select c.constraint_name,c.constraint_type,cc.column_name<br />from user_constraints c,user_cons_columns cc<br />where c.owner = upper('&amp;table_owner') and c.table_name = upper('&amp;table_name')<br />and c.owner = cc.owner and c.constraint_name = cc.constraint_name<br />order by cc.position;<br /><br />8、存储函数和过程<br /><br />查看函数和过程的状态<br />SQL&gt;select object_name,status from user_objects where object_type='FUNCTION';<br />SQL&gt;select object_name,status from user_objects where object_type='PROCEDURE';<br /><br />查看函数和过程的源代码<br />SQL&gt;select text from all_source where owner=user and name=upper('&amp;plsql_name');<br /></span>--------------------------------------------------oracle 查询 表字段 以及字段 数据类型 -----------------------------------------<br /><br /><p>第一种</p><p>select cname from col where tname='EMP';</p><p>第二种</p><p><span style="COLOR: #003366">select column_name from user_tab_columns where table_name='EMP';</span></p><p><span style="COLOR: #003366">介绍  如果查询数据的  字段数据类型</span></p><p><span style="COLOR: #003366">select data_type from user_tab_columns where table_name='EMP';</span></p><p><span style="COLOR: #003366">两个一起查</span></p><p><span style="COLOR: #003366">select data_type,column_name from user_tab_columns where table_name='EMP';<br /></span><br />--------------------------------------------查询 字段注释---------------------------------------------<br /><br />select * from user_col_comments ;//所有的注释<br />select * from user_col_comments where table_name='你的表(emp)' ;//指定表的注释<br /></p><img src ="http://www.blogjava.net/kyleYang/aggbug/311599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-02-02 09:20 <a href="http://www.blogjava.net/kyleYang/archive/2010/02/02/311599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽样表扫描</title><link>http://www.blogjava.net/kyleYang/archive/2010/02/01/311505.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Mon, 01 Feb 2010 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/02/01/311505.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/311505.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/02/01/311505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/311505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/311505.html</trackback:ping><description><![CDATA[抽样表扫描（sample table scan）只读取一个表的部分数据。其实我们只选择表的部分数据的话，可以用rownum来限制也很方便。但是考虑如下情况：<br />A表和B表join，我只想A表的部分数据去连接B表，此时用sample就方便的多。如果用rownum就需要用一个subquery。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008080">--</span><span style="COLOR: #008080">用Sample：</span><span style="COLOR: #008080"><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> A.id,A.name </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> A sample block(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">),B <br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> A.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">B.id<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">用Rownum：</span><span style="COLOR: #008080"><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> A.id,A.name </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> a.id,a.name </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> a </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> rownum</span><span style="COLOR: #808080">&lt;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span><span style="COLOR: #000000">) A,B <br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> A.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">B.id</span></div><p>抽样表扫描有两种形式，一种是抽样表中行数的一个百分比，一个是抽样表中块数的一个百分比。注意都是百分比。语法如下：</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> employees SAMPLE (</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">);</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">返回行数乘以1%</span><span style="COLOR: #008080"><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> employees SAMPLE BLOCK (</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">);</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">返回块数乘以1%</span></div><p>也可以在视图上使用SAMPLE。<br /></p><img src ="http://www.blogjava.net/kyleYang/aggbug/311505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-02-01 14:32 <a href="http://www.blogjava.net/kyleYang/archive/2010/02/01/311505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中，当误删了数据时，如何恢复这些数据</title><link>http://www.blogjava.net/kyleYang/archive/2010/01/17/309864.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Sun, 17 Jan 2010 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/01/17/309864.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/309864.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/01/17/309864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/309864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/309864.html</trackback:ping><description><![CDATA[
		<p>当你不小心误删了Oracle数据时，怎么办，应该如何恢复这些数据？</p>
		<p>--好像只能恢复当日删除的数据<br />create table t_hjhb_hbjcjl2 as <br />select * from t_hjhb_hbjcjl as of timestamp to_timestamp('2009-06-10 10:28:00','YYYY-MM-DD HH24:MI:SS');</p>
		<p>
				<br />查找要恢复的数据记录；然后再导入t_hjhb_hbjcjl表里<br />insert into t_hjhb_hbjcjl select * from t_hjhb_hbjcjl2</p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/309864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-01-17 17:14 <a href="http://www.blogjava.net/kyleYang/archive/2010/01/17/309864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2用一张表更新其他表的数据</title><link>http://www.blogjava.net/kyleYang/archive/2010/01/12/309160.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Tue, 12 Jan 2010 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/01/12/309160.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/309160.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/01/12/309160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/309160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/309160.html</trackback:ping><description><![CDATA[
		<p>表结构：<br />CREATE TABLE ATEST<br /> (ID    INTEGER,<br />  NAME  VARCHAR(256),<br />  CODE  INTEGER,<br />  NAME2 VARCHAR(256)<br /> )<br /><br />CREATE TABLE BTEST<br /> (ID    INTEGER,<br />  CODE  INTEGER<br /> )<br /><br />CREATE TABLE CTEST<br /> (ID    INTEGER,<br />  NAME  VARCHAR(256),<br />  NAME2 VARCHAR(256)<br /> )<br /><br />SQL语句：<br />一张表更新另一张表的字段：<br />update atest<br />set atest.name=(select ctest.name from ctest where atest.id = ctest.id)<br />where atest.id in  (select ctest.id from ctest);</p>
		<p>两张表关联更新另一张表的字段：<br />update atest<br />set (name,name2) = (SELECT CASE WHEN CTEST.NAME IS NULL THEN ATEST.NAME ELSE CTEST.NAME END, CASE WHEN CTEST.NAME2 IS NULL THEN ATEST.NAME2 ELSE CTEST.NAME2 END FROM BTEST LEFT JOIN CTEST on BTEST.ID = CTEST.ID  WHERE atest.CODE = BTEST.CODE)<br />WHERE atest.CODE IN (SELECT BTEST.CODE FROM BTEST);<br /><br /><br /><span style="FONT-SIZE: small">另外一个: <a href="http://blog.csdn.net/Bobwu/archive/2009/01/13/3768636.aspx1.declare">http://blog.csdn.net/Bobwu/archive/2009/01/13/3768636.aspx<br /></a></span>1.<br />declare<br />cursor t1 is select * from tablename;<br />begin<br />for rec in t1 loop<br />update tablename t set t.detail=rec.jieshao where t.objectid=rec.objid;<br />end loop;<br />end; </p>
		<p>2.</p>
		<p>
				<font color="#0000ff">update   student   set   (name,id   )=   <br />  (select   name   ,id     from   (select   student.rowid   rd,student1.name,student1.id   from   student1,student   where   student1.int_id   =student.int_id)   tmp   <br />  where   student.rowid=tmp.rd);   <br />  commit;</font>
		</p>
		<p>3.</p>
		<p>update test_a a set (a.name,a.age)=<br />(select b.name,b.age from test_b b where a.id = b.id) where exists<br />(select * from test_b c where c.id=a.id)</p>
		<p>4.</p>
		<p>UPDATE   t_A   SET   Djrq=     <br />  (   <br />          SELECT   djrq   FROM   t_B   WHERE   t_A.ID   =   T_B.ID     <br />          WHERE   ROWNUM   =   1     <br />  )   <br />  WHERE   t_A.ID   IN     <br />  (   <br />          SELECT   ID   FROM   t_B   WHERE   jwh='XX村'   <br />  ) </p>
		<p>5.</p>
		<p>update tbl1 a<br />   set (a.col1, a.col2) = (select b.col1, b.col2<br />                              from tbl2 b<br />                              where a.key = b.key)<br />   where a.key in(select key from tbl2)</p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/309160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-01-12 16:09 <a href="http://www.blogjava.net/kyleYang/archive/2010/01/12/309160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle PL/SQL游标的学习</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/03/304709.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 03 Dec 2009 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/03/304709.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304709.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/03/304709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304709.html</trackback:ping><description><![CDATA[<strong>一 游标是什么</strong> <br />
<br />
游标字面理解就是游动的光标。 <br />
<br />
用数据库语言来描述：游标是映射在结果集中一行数据上的位置实体，有了游标，用户就可以访问结果集中的任意一行数据了，将游标放置到某行后，即可对该行数据进行操作，例如提取当前行的数据等。 <br />
<br />
<strong>二 游标的分类</strong> <br />
<br />
显式游标和隐式游标 <br />
<br />
显式游标的使用需要4步： <br />
<br />
1. 声明游标 <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>CURSOR mycur(vartype number) is
            select emp_no,emp_zc from cus_emp_basic
            where com_no = vartype;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
2. 打开游标 <br />
<br />
open mycur(000627) <br />
<br />
注：000627是参数 <br />
<br />
3. 读取数据 <br />
<br />
fetch mycur into varno, varprice; <br />
<br />
4. 关闭游标 <br />
<br />
close mycur; <br />
<br />
<strong>三 游标的属性</strong> <br />
<br />
oracle 游标有4个属性：%ISOPEN，%FOUND，%NOTFOUND，%ROWCOUNT。 <br />
<br />
%ISOPEN判断游标是否被打开，如果打开%ISOPEN等于true,否则等于false； <br />
<br />
%FOUND %NOTFOUND判断游标所在的行是否有效，如果有效，则%FOUNDD等于true，否则等于false； <br />
<br />
%ROWCOUNT返回当前位置为止游标读取的记录行数。 <br />
<br />
<strong>四 示例</strong> <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>set serveroutput on;
            declare
            varno varchar2(20);
            varprice varchar2(20);
            CURSOR mycur(vartype number) is
            select emp_no,emp_zc from cus_emp_basic
            where com_no = vartype;
            begin
            if mycur%isopen = false then
            open mycur(000627);
            end if;
            fetch mycur into varno,varprice;
            while mycur%found
            loop
            dbms_output.put_line(varno||','||varprice);
            if mycur%rowcount=2 then
            exit;
            end if;
            fetch mycur into varno,varprice;
            end loop;
            close mycur;
            end;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
PL/SQL记录的结构和C语言中的结构体类似，是由一组数据项构成的逻辑单元。 <br />
<br />
PL/SQL记录并不保存在数据库中，它与变量一样，保存在内存空间中，在使用记录时候，要首先定义记录结构，然后声明记录变量。可以把PL/SQL记录看作是一个用户自定义的数据类型。 <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>set serveroutput on;
            declare
            type person is record
            (
            empno cus_emp_basic.emp_no%type,
            empzc cus_emp_basic.emp_zc%type);
            person1 person;
            cursor mycur(vartype number)is
            select emp_no,emp_zc from cus_emp_basic
            where com_no=vartype;
            begin
            if mycur%isopen = false then
            open mycur(000627);
            end if;
            loop
            fetch mycur into person1;
            exit when mycur%notfound;
            dbms_output.put_line('雇员编号:'||person1.empno||',地址:'||person1.empzc);
            end loop;
            close mycur;
            end;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
典型游标for 循环 <br />
<br />
游标for循环示显示游标的一种快捷使用方式，它使用for循环依次读取结果集中的行数据，当form循环开始时，游标自动打开（不需要open），每循环一次系统自动读取游标当前行的数据（不需要fetch)，当退出for循环时，游标被自动关闭（不需要使用close）。使用游标for循环的时候不能使用open语句，fetch语句和close语句，否则会产生错误。 <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>set serveroutput on;
            declare
            cursor mycur(vartype number)is
            select emp_no,emp_zc from cus_emp_basic
            where com_no=vartype;
            begin
            for person in mycur(000627) loop
            dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);
            end loop;
            end;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<img src ="http://www.blogjava.net/kyleYang/aggbug/304709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-03 22:45 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/03/304709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TRUNCATE和DELETE的用法比较</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/03/304708.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 03 Dec 2009 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/03/304708.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304708.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/03/304708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304708.html</trackback:ping><description><![CDATA[<div class="title">使用 TRUNCATE TABLE 删除所有行<!----></div>
<p align="right"><!--content type: DocStudio. Transform: devdiv2mtps.xslt.--></p>
<div id="mainSection">
<div id="mainBody">
<p><!----></p>
<p>若要删除表中的所有行，则 TRUNCATE TABLE 语句是一种快速、有效的方法。TRUNCATE TABLE 与不含 WHERE 子句的 DELETE 语句类似。但是，TRUNCATE TABLE 速度更快，并且使用更少的系统资源和事务日志资源。</p>
<p>与 DELETE 语句相比，TRUNCATE TABLE 具有以下优点：</p>
<ul>
    <li>所用的事务日志空间较少。<br />
    DELETE 语句每次删除一行，并在事务日志中为所删除的每行记录一个项。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据，并且在事务日志中只记录页释放。<br />
    <li>使用的锁通常较少。<br />
    当使用行锁执行 DELETE 语句时，将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页，而不是锁定各行。<br />
    <li>如无例外，在表中不会留有任何页。<br />
    执行 DELETE 语句后，表仍会包含空页。例如，必须至少使用一个排他 (LCK_M_X) 表锁，才能释放堆中的空表。如果执行删除操作时没有使用表锁，表（堆）中将包含许多空页。对于索引，删除操作会留下一些空页，尽管这些页会通过后台清除进程迅速释放。<br />
    </li>
</ul>
<p>与 DELETE 语句相同，使用 TRUNCATE TABLE 清空的表的定义与其索引和其他关联对象一起保留在数据库中。如果表中包含标识列，该列的计数器将重置为该列定义的种子值。如果未定义种子，则使用默认值 1。若要保留标识计数器，请使用 DELETE。</p>
</div>
</div>
<img src ="http://www.blogjava.net/kyleYang/aggbug/304708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-03 22:44 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/03/304708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE函数大全</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/03/304706.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 03 Dec 2009 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/03/304706.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304706.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/03/304706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304706.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: oracle的函數很多﹐特整理出來﹕abs(m)&nbsp;&nbsp;m的绝对值mod(m,n)&nbsp;m被n除后的余数power(m,n)&nbsp;m的n次方round(m[,n])&nbsp;m四舍五入至小数点后n位的值（n缺省为0）trunc(m[,n])&nbsp;m截断n位小数位的值（n缺省为0）字符函数：initcap(st)&nbsp;返回st将每...&nbsp;&nbsp;<a href='http://www.blogjava.net/kyleYang/archive/2009/12/03/304706.html'>阅读全文</a><img src ="http://www.blogjava.net/kyleYang/aggbug/304706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-03 22:42 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/03/304706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EXECUTE IMMEDIATE用法</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/03/304705.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 03 Dec 2009 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/03/304705.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304705.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/03/304705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304705.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304705.html</trackback:ping><description><![CDATA[EXECUTE IMMEDIATE 代替了以前Oracle8i中DBMS_SQL package包.<br />
它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前，EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能，较之以前它相当容易编码.尽管DBMS_SQL仍然可用，但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 <br />
<br />
-- 使用技巧<br />
<br />
1. EXECUTE IMMEDIATE将不会提交一个DML事务执行，应该显式提交<br />
如果通过EXECUTE IMMEDIATE处理DML命令，<br />
那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分.<br />
如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据<br />
<br />
2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.<br />
<br />
3. 当执行SQL语句时，不要用分号，当执行PL/SQL块时，在其尾部用分号.<br />
<br />
4. 在Oracle手册中，未详细覆盖这些功能。<br />
下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.<br />
<br />
5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中，Forms 6i不能使用此功能.<br />
<br />
EXECUTE IMMEDIATE -- 用法例子<br />
<br />
1. 在PL/SQL运行DDL语句<br />
begin<br />
&nbsp;&nbsp; execute immediate 'set role all';<br />
end;<br />
<br />
2. 给动态语句传值(USING 子句)<br />
declare<br />
&nbsp;&nbsp; l_depnam varchar2(20) := 'testing';<br />
&nbsp;&nbsp; l_loc&nbsp;&nbsp;&nbsp;&nbsp; varchar2(10) := 'Dubai';<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp; execute immediate 'insert into dept values&nbsp;&nbsp; (:1, :2, :3)'<br />
&nbsp;&nbsp;&nbsp;&nbsp; using 50, l_depnam, l_loc;<br />
&nbsp;&nbsp; commit;<br />
end;<br />
<br />
3. 从动态语句检索值(INTO子句)<br />
declare<br />
&nbsp;&nbsp; l_cnt&nbsp;&nbsp;&nbsp;&nbsp; varchar2(20);<br />
begin<br />
&nbsp;&nbsp; execute immediate 'select count(1) from emp'<br />
&nbsp;&nbsp;&nbsp;&nbsp; into l_cnt;<br />
&nbsp;&nbsp; dbms_output.put_line(l_cnt);<br />
end;<br />
<br />
4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.<br />
黓认为IN类型,其它类型必须显式指定<br />
<br />
declare<br />
&nbsp;&nbsp; l_routin&nbsp;&nbsp;&nbsp; varchar2(100) := 'gen2161.get_rowcnt';<br />
&nbsp;&nbsp; l_tblnam&nbsp;&nbsp;&nbsp; varchar2(20) := 'emp';<br />
&nbsp;&nbsp; l_cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;<br />
&nbsp;&nbsp; l_status&nbsp;&nbsp;&nbsp; varchar2(200);<br />
begin<br />
&nbsp;&nbsp; execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'<br />
&nbsp;&nbsp;&nbsp;&nbsp; using in l_tblnam, out l_cnt, in out l_status;<br />
<br />
&nbsp;&nbsp; if l_status != 'OK' then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line('error');<br />
&nbsp;&nbsp; end if;<br />
end;<br />
<br />
5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量<br />
declare<br />
&nbsp;&nbsp; type empdtlrec is record (empno&nbsp;&nbsp; number(4),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ename&nbsp;&nbsp; varchar2(20),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deptno&nbsp;&nbsp; number(2));<br />
&nbsp;&nbsp; empdtl empdtlrec;<br />
begin<br />
&nbsp;&nbsp; execute immediate 'select empno, ename, deptno ' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'from emp where empno = 7934'<br />
&nbsp;&nbsp;&nbsp;&nbsp; into empdtl;<br />
end;<br />
<br />
6. 传递并检索值.INTO子句用在USING子句前<br />
declare<br />
&nbsp;&nbsp; l_dept&nbsp;&nbsp;&nbsp;&nbsp; pls_integer := 20;<br />
&nbsp;&nbsp; l_nam&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(20);<br />
&nbsp;&nbsp; l_loc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(20);<br />
begin<br />
&nbsp;&nbsp; execute immediate 'select dname, loc from dept where deptno = :1'<br />
&nbsp;&nbsp;&nbsp;&nbsp; into l_nam, l_loc<br />
&nbsp;&nbsp;&nbsp;&nbsp; using l_dept ;<br />
end;<br />
<br />
7. 多行查询选项.对此选项用insert语句填充临时表，<br />
用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.<br />
<br />
declare<br />
&nbsp;&nbsp; l_sal&nbsp;&nbsp;&nbsp; pls_integer := 2000;<br />
begin<br />
&nbsp;&nbsp; execute immediate 'insert into temp(empno, ename) ' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select empno, ename from emp ' ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where&nbsp;&nbsp; sal &gt; :1'<br />
&nbsp;&nbsp;&nbsp;&nbsp; using l_sal;<br />
&nbsp;&nbsp; commit;<br />
end;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于处理动态语句,EXECUTE IMMEDIATE 比以前可能用到的更容易并且更高效.<br />
当意图执行动态语句时，适当地处理异常更加重要.应该关注于捕获所有可能的异常.
<img src ="http://www.blogjava.net/kyleYang/aggbug/304705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-03 22:37 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/03/304705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>over partition by与group by 的区别 </title><link>http://www.blogjava.net/kyleYang/archive/2009/12/03/304704.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 03 Dec 2009 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/03/304704.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304704.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/03/304704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304704.html</trackback:ping><description><![CDATA[over partition by 与 group by 都是与统计类函数用，这两个有什么区别呢？<br />
目前我只知道一个这样的区别：<br />
比如有一张表saraly:CREATE TABLE SALARY AS SELECT 'A' NAME,10 DEPT,1000 SALARY FROM DUAL UNION ALL SELECT 'B',10,2000 FROM DUAL UNION ALL SELECT 'C' ,20,1500 FROM DUAL UNION ALL SELECT 'D',20,3000 FROM DUAL UNION ALL<br />
SELECT 'E',10,1000 FROM DUAL;<br />
NAME DEPT SALARY<br />
A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;10&nbsp; &nbsp;&nbsp;&nbsp;1000<br />
B&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;10&nbsp; &nbsp;&nbsp;&nbsp;2000<br />
C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;20&nbsp; &nbsp;&nbsp;&nbsp;1500<br />
D&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;20&nbsp; &nbsp;&nbsp;&nbsp;3000<br />
E&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;10&nbsp; &nbsp;&nbsp;&nbsp;1000&nbsp; &nbsp;<br />
用over partition by 我就可以查询到每位员工本来的具体信息和它所在部门的总工资：<br />
select name,dept,salary,sum(salary) over (partition by dept) total_salary from salary;&nbsp;&nbsp;<br />
name&nbsp; &nbsp;&nbsp; &nbsp; dept&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;salary&nbsp; &nbsp;&nbsp; &nbsp;tatal_salary<br />
A&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; &nbsp; &nbsp; 1000&nbsp; &nbsp; &nbsp; &nbsp; 4000<br />
B&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; &nbsp; &nbsp; 2000&nbsp; &nbsp; &nbsp; &nbsp; 4000<br />
E&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; &nbsp; &nbsp; 1000&nbsp; &nbsp; &nbsp; &nbsp; 4000<br />
C&nbsp; &nbsp; &nbsp; &nbsp; 20&nbsp; &nbsp; &nbsp; &nbsp; 1500&nbsp; &nbsp; &nbsp; &nbsp; 4500<br />
D&nbsp; &nbsp; &nbsp; &nbsp; 20&nbsp; &nbsp; &nbsp; &nbsp; 3000&nbsp; &nbsp; &nbsp; &nbsp; 4500<br />
<br />
用goup by 就没办法做到这点，只能查询到每个部门的总工资：<br />
select dept,sum(salary) total_salary from salary group by dept<br />
dept&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;total_salary<br />
10&nbsp; &nbsp; &nbsp; &nbsp; 4000<br />
20&nbsp; &nbsp; &nbsp; &nbsp; 4500<br />
另外over partion by 还可以做到查询每位员工占部门总工资的百分比：<br />
select name,dept,salary,salary*100/sum(salary) over (partition by dept) percent from salary;<br />
<br />
name&nbsp; &nbsp;&nbsp; &nbsp; dept&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;salary&nbsp; &nbsp;&nbsp;&nbsp;percent<br />
A&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; &nbsp; &nbsp; 1000&nbsp; &nbsp; &nbsp; &nbsp; 25<br />
B&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; &nbsp; &nbsp; 2000&nbsp; &nbsp; &nbsp; &nbsp; 50<br />
E&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; &nbsp; &nbsp; 1000&nbsp; &nbsp; &nbsp; &nbsp; 25<br />
C&nbsp; &nbsp; &nbsp; &nbsp; 20&nbsp; &nbsp; &nbsp; &nbsp; 1500&nbsp; &nbsp; &nbsp; &nbsp; 33.3333333333333<br />
D&nbsp; &nbsp; &nbsp; &nbsp; 20&nbsp; &nbsp; &nbsp; &nbsp; 3000&nbsp; &nbsp; &nbsp; &nbsp; 66.6666666666667<br />
<img src ="http://www.blogjava.net/kyleYang/aggbug/304704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-03 22:34 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/03/304704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>递归查询--经典</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/03/304702.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 03 Dec 2009 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/03/304702.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304702.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/03/304702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304702.html</trackback:ping><description><![CDATA[1.表结构：<br />
CREATE TABLE TEST.AREATB<br />
(<br />
&nbsp;&nbsp;&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(6,0) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; AREANAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(256),<br />
&nbsp;&nbsp;&nbsp; PARENTAREAID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(6,0)<br />
)<br />
<br />
2.数据：<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>1</td>
            <td>中国</td>
            <td>&nbsp;-1</td>
        </tr>
        <tr>
            <td>2</td>
            <td>北京</td>
            <td>&nbsp;1</td>
        </tr>
        <tr>
            <td>3</td>
            <td>安徽</td>
            <td>1</td>
        </tr>
        <tr>
            <td>4</td>
            <td>合肥</td>
            <td>3</td>
        </tr>
        <tr>
            <td>5</td>
            <td>宣武区</td>
            <td>2</td>
        </tr>
    </tbody>
</table>
<br />
3.SQL：语句<br />
select id, areaname, substr(sys_connect_by_path(areaname,','),2)<br />
from AREATB bb<br />
start with parentareaid = -1<br />
connect by parentareaid=prior id&nbsp;<br />
<br />
4.结果：<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>1</td>
            <td>中国</td>
            <td>中国</td>
        </tr>
        <tr>
            <td>2</td>
            <td>北京</td>
            <td>中国,北京</td>
        </tr>
        <tr>
            <td>5</td>
            <td>宣武区</td>
            <td>中国,北京,宣武区</td>
        </tr>
        <tr>
            <td>3</td>
            <td>安徽</td>
            <td>中国,安徽</td>
        </tr>
        <tr>
            <td style="width: 36px; height: 25px">4</td>
            <td>合肥</td>
            <td>中国,安徽,合肥</td>
        </tr>
    </tbody>
</table>
<br />
<br />
5.函数解释：<br />
sys_connect_by_path 函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分，然后连接在一个列中显示
<img src ="http://www.blogjava.net/kyleYang/aggbug/304702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-03 22:28 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/03/304702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/02/304528.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 02 Dec 2009 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/02/304528.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304528.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/02/304528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304528.html</trackback:ping><description><![CDATA[<p>1.EXCEPTION:<br />
DECLARE<br />
&nbsp;&nbsp; numerator&nbsp;&nbsp; NUMBER;<br />
&nbsp;&nbsp; denominator NUMBER;<br />
&nbsp;&nbsp; the_ratio&nbsp;&nbsp; NUMBER;<br />
&nbsp;&nbsp; lower_limit CONSTANT NUMBER := 0.72;<br />
&nbsp;&nbsp; samp_num&nbsp;&nbsp;&nbsp; CONSTANT NUMBER := 132;<br />
BEGIN<br />
&nbsp;&nbsp; SELECT x, y INTO numerator, denominator FROM result_table<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE sample_id = samp_num;<br />
&nbsp;&nbsp; the_ratio := numerator/denominator;</p>
<p>&nbsp;&nbsp; IF the_ratio &gt; lower_limit THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO ratio VALUES (samp_num, the_ratio);<br />
&nbsp;&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO ratio VALUES (samp_num, -1);<br />
&nbsp;&nbsp; END IF;<br />
&nbsp;&nbsp; COMMIT;<br />
EXCEPTION<br />
&nbsp;&nbsp; WHEN ZERO_DIVIDE THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO ratio VALUES (samp_num, 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMIT;<br />
&nbsp;&nbsp; WHEN OTHERS THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK;<br />
END;</p>
<p>2.<br />
CREATE OR REPLACE PROCEDURE<br />
&nbsp;&nbsp;&nbsp; get_student_major<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (v_student_id&nbsp; IN&nbsp; students.student_id%TYPE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUT students.student_name%TYPE) IS<br />
BEGIN<br />
&nbsp;&nbsp;&nbsp; SELECT student_name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTO v_name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM students<br />
&nbsp;&nbsp;&nbsp;&nbsp; WHERE student_id = v_student_id;<br />
exception<br />
&nbsp;&nbsp;&nbsp; WHEN TOO_MANY_ROWS THEN dbms_output.put_line('TMR error'); -- 行数 &gt; 1<br />
&nbsp;&nbsp;&nbsp; WHEN NO_DATA_FOUND THEN dbms_output.put_line('NDF error'); -- 行数为 0<br />
END;</p>
<p><br />
3.<br />
CREATE OR REPLACE FUNCTION<br />
&nbsp;&nbsp;&nbsp; update_salaries(new_sal IN professors.salary%TYPE) -- %TYPE 某一字段的类型作为类型<br />
&nbsp;&nbsp;&nbsp; RETURN NATURAL IS<br />
BEGIN<br />
&nbsp;&nbsp;&nbsp; UPDATE professors2 SET salary = new_sal;<br />
&nbsp;&nbsp;&nbsp; RETURN SQL%ROWCOUNT; -- 判断更新的行数<br />
END update_salaries;</p>
<p>4.<br />
CREATE OR REPLACE PROCEDURE<br />
&nbsp;&nbsp;&nbsp; add_student(rec IN OUT students%ROWTYPE) IS -- students%ROWTYPE作为表的某一行作为变量类型<br />
BEGIN<br />
&nbsp;&nbsp;&nbsp; SELECT 'A'||students_pk_seq.nextval<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTO rec.student_id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM dual;</p>
<p>&nbsp;&nbsp;&nbsp; INSERT INTO students (student_id, student_name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; college_major, status, state, license_no)<br />
&nbsp;&nbsp;&nbsp; VALUES (rec.student_id, rec.student_name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rec.college_major, rec.status,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rec.state, rec.license_no);<br />
END add_student;</p>
<p><br />
5.<br />
DECLARE<br />
&nbsp;&nbsp; dept_rec1 dept%ROWTYPE;&nbsp; --dept是表名,则dept_rec1 和 dept_rec2 可以相互赋值<br />
&nbsp;&nbsp; dept_rec2 dept%ROWTYPE; </p>
<p>&nbsp;&nbsp; CURSOR c1 IS SELECT deptno, dname, loc FROM dept;<br />
&nbsp;&nbsp; dept_rec3 c1%ROWTYPE;<br />
BEGIN<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; dept_rec1 := dept_rec2;</p>
<p>However, because dept_rec2 is based on a table and dept_rec3 is based on a cursor, the following assignment is illegal: <br />
dept_rec2 := dept_rec3;&nbsp; -- illegal</p>
<p><br />
6.<br />
DECLARE<br />
&nbsp;&nbsp; CURSOR my_cursor IS <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT sal + NVL(comm, 0) wages, ename FROM emp;<br />
&nbsp;&nbsp; my_rec&nbsp; my_cursor%ROWTYPE;<br />
BEGIN<br />
&nbsp;&nbsp; OPEN my_cursor;<br />
&nbsp;&nbsp; LOOP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FETCH my_cursor INTO my_rec;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXIT WHEN my_cursor%NOTFOUND;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF my_rec.wages &gt; 2000 THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO temp VALUES (NULL, my_rec.wages, my_rec.ename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;<br />
&nbsp;&nbsp; END LOOP;<br />
&nbsp;&nbsp; CLOSE my_cursor;<br />
END;</p>
<p><br />
7. *****<br />
-- 包，函数，存储过程<br />
CREATE OR REPLACE PACKAGE BODY students_pkg IS</p>
<p>&nbsp;&nbsp;&nbsp; FUNCTION add_student(rec IN students%ROWTYPE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN students.student_id%TYPE<br />
&nbsp;&nbsp;&nbsp; IS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID students.student_id%TYPE;<br />
&nbsp;&nbsp;&nbsp; BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT 'A'||students_pk_seq.nextval INTO ID FROM dual;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO students (student_id, student_name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; college_major, status, state, license_no)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES (ID, rec.student_name, rec.college_major,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rec.status, rec.state, rec.license_no);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN ID;<br />
&nbsp;&nbsp;&nbsp; END add_student;</p>
<p>&nbsp;&nbsp;&nbsp; PROCEDURE add_vehicle(rec IN student_vehicles%ROWTYPE) IS<br />
&nbsp;&nbsp;&nbsp; BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO student_vehicles (state, tag_no,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vehicle_desc, student_id, parking_sticker)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES (rec.state, rec.tag_no,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rec.vehicle_desc, rec.student_id, rec.parking_sticker);<br />
&nbsp;&nbsp;&nbsp; END add_vehicle;<br />
END students_pkg;</p>
<p>-- 执行<br />
DECLARE<br />
&nbsp;&nbsp;&nbsp; student students%ROWTYPE;<br />
&nbsp;&nbsp;&nbsp; vehicle student_vehicles%ROWTYPE;<br />
BEGIN<br />
&nbsp;&nbsp;&nbsp; student.student_name&nbsp; := 'Jack';<br />
&nbsp;&nbsp;&nbsp; student.college_major := 'HI';<br />
&nbsp;&nbsp;&nbsp; student.status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := 'Degree';<br />
&nbsp;&nbsp;&nbsp; student.state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := 'CA';<br />
&nbsp;&nbsp;&nbsp; student.license_no&nbsp;&nbsp;&nbsp; := 'MV-232-14';</p>
<p>&nbsp;&nbsp;&nbsp; student.student_id := students_pkg.add_student(student);</p>
<p>&nbsp;&nbsp;&nbsp; vehicle.state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := 'CA';<br />
&nbsp;&nbsp;&nbsp; vehicle.tag_no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := 'CA-1234';<br />
&nbsp;&nbsp;&nbsp; vehicle.vehicle_desc&nbsp;&nbsp;&nbsp; := 'Mustang';<br />
&nbsp;&nbsp;&nbsp; vehicle.parking_sticker := 'A-101';</p>
<p>&nbsp;&nbsp;&nbsp; vehicle.student_id := student.student_id;</p>
<p>&nbsp;&nbsp;&nbsp; students_pkg.add_vehicle(vehicle);<br />
END;</p>
<p>&nbsp;<br />
</p>
<div>8.<a class="singleposttitle" id="viewpost1_TitleUrl" href="http://www.blogjava.net/lingy/archive/2009/06/18/283045.html">怎样从一个过程返回一个结果集</a> <br />
create or replace procedure p_stu_lst(result out sys_refcursor) is<br />
BEGIN<br />
&nbsp; &nbsp;OPEN RESULT FOR SELECT * FROM test;<br />
end p_stu_lst;<br />
SQL&gt; select * from test;<br />
<br />
NAME&nbsp; &nbsp;&nbsp; &nbsp; KM&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CJ<br />
---------- ---------- ----------<br />
张三&nbsp; &nbsp;&nbsp; &nbsp; 语文&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;80<br />
张三&nbsp; &nbsp;&nbsp; &nbsp; 数学&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;86<br />
张三&nbsp; &nbsp;&nbsp; &nbsp; 英语&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;75<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 语文&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;78<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 数学&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;85<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 英语&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;78<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 物理&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;90<br />
<br />
已选择7行。<br />
<br />
SQL&gt; exec p_stu_lst(:aaa);<br />
<br />
PL/SQL 过程已成功完成。<br />
<br />
SQL&gt; print aaa<br />
<br />
NAME&nbsp; &nbsp;&nbsp; &nbsp; KM&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CJ<br />
---------- ---------- ----------<br />
张三&nbsp; &nbsp;&nbsp; &nbsp; 语文&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;80<br />
张三&nbsp; &nbsp;&nbsp; &nbsp; 数学&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;86<br />
张三&nbsp; &nbsp;&nbsp; &nbsp; 英语&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;75<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 语文&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;78<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 数学&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;85<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 英语&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;78<br />
李四&nbsp; &nbsp;&nbsp; &nbsp; 物理&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;90<br />
<br />
已选择7行。</div>
<p><script type="text/javascript">
//<![cdata[ Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]&gt;
</script></p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/304528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-02 16:39 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/02/304528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交叉报表</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/02/304527.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 02 Dec 2009 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/02/304527.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304527.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/02/304527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304527.html</trackback:ping><description><![CDATA[<p>1.表：<br />
id&nbsp;&nbsp; name&nbsp;&nbsp; kechen&nbsp;&nbsp; fengshu <br />
1&nbsp;&nbsp;&nbsp; 张三&nbsp;&nbsp;&nbsp;&nbsp; 数学&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 56<br />
2&nbsp;&nbsp;&nbsp; 张三&nbsp;&nbsp;&nbsp;&nbsp; 语文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 67<br />
3&nbsp;&nbsp;&nbsp; 张三&nbsp;&nbsp;&nbsp;&nbsp; 化学&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 87<br />
4&nbsp;&nbsp;&nbsp; 李四&nbsp;&nbsp;&nbsp;&nbsp; 语文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24<br />
5&nbsp;&nbsp;&nbsp; 王五&nbsp;&nbsp;&nbsp;&nbsp; 化学&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 54<br />
通过select 语句得到 下面的结果<br />
name&nbsp; 数学&nbsp; 语文&nbsp; 化学<br />
张三&nbsp;&nbsp;&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 87<br />
李四&nbsp;&nbsp;&nbsp; null&nbsp;&nbsp; 24&nbsp;&nbsp;&nbsp;&nbsp; null<br />
王五&nbsp;&nbsp;&nbsp; null&nbsp;&nbsp; null&nbsp;&nbsp;&nbsp; 54 </p>
<p>2.答案如下：<br />
select name,sum(yuwen) yuwen,sum(shuxue)&nbsp; shuxue,sum(huaxue)&nbsp; huaxue <br />
from(<br />
&nbsp;&nbsp;&nbsp; select name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case kechen when '语文' then fengshu end yuwen,<br />
&nbsp;&nbsp;&nbsp; case kechen when '数学' then fengshu end shuxue,<br />
&nbsp;&nbsp;&nbsp; case kechen when '化学' then fengshu end huaxue<br />
&nbsp;&nbsp;&nbsp; from table<br />
&nbsp;)as t1<br />
group by name</p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/304527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-02 16:37 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/02/304527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL重复记录查询</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/02/304526.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 02 Dec 2009 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/02/304526.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/304526.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/02/304526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/304526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/304526.html</trackback:ping><description><![CDATA[1、查找表中多余的重复记录，重复记录是根据单个字段（peopleId）来判断<br />select * from people<br />where peopleId in (select   peopleId from   people group by   peopleId having count (peopleId) &gt; 1) 
<p>2、删除表中多余的重复记录，重复记录是根据单个字段（peopleId）来判断，只留有rowid最小的记录<br />delete from people <br />where peopleId in (select   peopleId from people group by   peopleId   having count (peopleId) &gt; 1)<br />and rowid not in (select min(rowid) from   people group by peopleId having count(peopleId )&gt;1)</p><p>3、查找表中多余的重复记录（多个字段） <br />select * from vitae a<br />where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having</p><p>count(*) &gt; 1)</p><p>4、删除表中多余的重复记录（多个字段），只留有rowid最小的记录<br />delete from vitae a<br />where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having count(*) &gt; 1)<br />and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)&gt;1)</p><p>5、查找表中多余的重复记录（多个字段），不包含rowid最小的记录<br />select * from vitae a<br />where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having</p><p>count(*) &gt; 1)<br />and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)&gt;1)<br /><br /></p><p>(二)<br />比方说<br />在A表中存在一个字段“name”，<br />而且不同记录之间的“name”值有可能会相同，<br />现在就是需要查询出在该表中的各记录之间，“name”值存在重复的项；<br />Select Name,Count(*) From A Group By Name Having Count(*) &gt; 1<br />如果还查性别也相同大则如下:<br />Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) &gt; 1<br /><br /></p><p>(三)<br />方法一<br /><span style="BACKGROUND: silver">declare @max integer,@id integer<br />declare cur_rows cursor local for select </span>主字段,count(*) from 表名 group by 主字段 having</p><p>count(*) &gt;； 1<br />open cur_rows<br />fetch cur_rows into @id,@max<br />while @@fetch_status=0<br />begin<br />select @max = @max -1<br />set rowcount @max<br />delete from 表名 where 主字段 = @id<br />fetch cur_rows into @id,@max<br />end<br />close cur_rows<br />set rowcount 0</p><p>方法二</p><p style="TEXT-INDENT: 24pt">有两个意义上的重复记录，一是完全重复的记录，也即所有字段均重复的记录，</p><p style="TEXT-INDENT: 24pt">二是部分关键字段重复的记录，比如Name字段重复，而其他字段不一定重复或都重复可以忽略。</p><p>　　1、对于第一种重复，比较容易解决，使用<br />select distinct * from tableName</p><p>　　就可以得到无重复记录的结果集。</p><p>　　如果该表需要删除重复的记录（重复记录保留1条），可以按以下方法删除<br />select distinct * into #Tmp from tableName<br />drop table tableName<br />select * into tableName from #Tmp<br />drop table #Tmp</p><p>　　发生这种重复的原因是表设计不周产生的，增加唯一索引列即可解决。</p><p>　　2、这类重复问题通常要求保留重复记录中的第一条记录，操作方法如下</p><p>　　假设有重复的字段为Name,Address，要求得到这两个字段唯一的结果集<br />select identity(int,1,1) as autoID, * into #Tmp from tableName<br />select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID<br /><span style="BACKGROUND: silver">select * from #Tmp where autoID in(select autoID from #tmp2)</span></p><p>　　最后一个select即得到了Name，Address不重复的结果集（但多了一个autoID字段，实际写时可以写</p><p>在select子句中省去此列）</p><p>(四)查询重复<br />select * from tablename </p><p>where id in (select id from tablename group by id having count(id) &gt; 1)<br /><br />(五)删除重复<br />delete from test a where a.rowid !=<br /> ( select max(b.rowid) from test b where a.id = b.id  )<br /><br />(六)删除重复<br /><font style="BACKGROUND-COLOR: #ffff99" face="Arial">方法一：delete from demo a where a.rowid &lt;&gt; (select max(rowid) from demo b where<br style="FONT-FAMILY: " />b.object_id=a.object_id);<br style="FONT-FAMILY: " />耗时：几个小时以上 <br style="FONT-FAMILY: " />方法二： delete from demo where rowid in <br style="FONT-FAMILY: " />(select rid from <br style="FONT-FAMILY: " />(select rowid rid,row_number() over(partition by object_id order by rowid) rn<br style="FONT-FAMILY: " />from demo)<br style="FONT-FAMILY: " />where rn &lt;&gt; 1 );<br style="FONT-FAMILY: " />耗时：30秒<br style="FONT-FAMILY: " />方法三： create table demo2 as <br style="FONT-FAMILY: " />select object_id,owner... from<br style="FONT-FAMILY: " />(select demo.*,row_number() over(partition by object_id order by rowid) rn from demo)<br style="FONT-FAMILY: " />where rn = 1;<br style="FONT-FAMILY: " />truncate table demo; insert into demo select * from demo2; drop table demo2;<br style="FONT-FAMILY: " />共耗时： 10秒，适合大数据量的情况，产生更少回滚量；</font><br /></p><img src ="http://www.blogjava.net/kyleYang/aggbug/304526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-02 16:33 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/02/304526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>