﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-沉睡森林@漂在北京-随笔分类-DataBase</title><link>http://www.blogjava.net/wangbing/category/39741.html</link><description>本处文章除注明“转载”外均为原创，转载请注明出处。 </description><language>zh-cn</language><lastBuildDate>Wed, 17 Mar 2010 04:31:20 GMT</lastBuildDate><pubDate>Wed, 17 Mar 2010 04:31:20 GMT</pubDate><ttl>60</ttl><item><title>讲解大型数据库的设计原则与开发技巧</title><link>http://www.blogjava.net/wangbing/archive/2010/03/16/315579.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Tue, 16 Mar 2010 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2010/03/16/315579.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/315579.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2010/03/16/315579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/315579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/315579.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">讲解大型数据库的设计原则与开发技巧<br />
原文引自：http://tech.ccidnet.com/art/1105/20080315/1391565_1.html<br />
目前，计算机技术已经广泛地应用于国民经济的各个领域当中，在计算机硬件不断微型化的同时，应用系统也逐渐向着复杂化、大型化的方向发展。数据库是整个系统的核心，它的设计直接关系系统执行的效率和系统的稳定性。因此在软件系统开发中，数据库设计应遵循必要的数据库范式理论，以减少冗余、保证数据的完整性与正确性。只有在合适的数据库产品上设计出合理的数据库模型，才能降低整个系统的编程和维护难度，提高系统的实际运行效率。虽然对于小项目或中等规模的项目开发人员可以很容易地利用范式理论设计出一套符合要求的数据库，但对于一个包含大型数据库的软件项目，就必须有一套完整的设计原则与技巧。<br />
一、成立数据小组<br />
大型数据库数据元素多，在设计上有必要成立专门的数据小组。由于数据库设计者不一定是使用者，对系统设计中的数据元素不可能考虑周全，数据库设计出来后，往往难以找到所需的库表，因此数据小组最好由熟悉业务的项目骨干组成。<br />
数据小组的职能并非是设计数据库，而是通过需求分析，在参考其他相似系统的基础上，提取系统的基本数据元素，担负对数据库的审核。审核内容包括审核新的数据库元素是否完全、能否实现全部业务需求；对旧数据库（如果存在旧系统）的分析及数据转换；数据库设计的审核、控制及必要调整。<br />
二、设计原则<br />
１．规范命名。所有的库名、表名、域名必须遵循统一的命名规则，并进行必要说明，以方便设计、维护、查询。<br />
２．控制字段的引用。在设计时，可以选择适当的数据库设计管理工具，以方便开发人员的分布式设计和数据小组的集中审核管理。采用统一的命名规则，如果设计的字段已经存在，可直接引用；否则，应重新设计。<br />
３．库表重复控制。在设计过程中，如果发现大部分字段都已存在，开发人员应怀疑所设计的库表是否已存在。通过对字段所在库表及相应设计人员的查询，可以确认库表是否确实重复。<br />
４．并发控制。设计中应进行并发控制，即对于同一个库表，在同一时间只有一个人有控制权，其他人只能进行查询。<br />
５．必要的讨论。数据库设计完成后，数据小组应与相关人员进行讨论，通过讨论来熟悉数据库，从而对设计中存在的问题进行控制或从中获取数据库设计的必要信息。<br />
６．数据小组的审核。库表的定版、修改最终都要通过数据小组的审核，以保证符合必要的要求。<br />
７．头文件处理。每次数据修改后，数据小组要对相应的头文件进行修改（可由管理软件自动完成），并通知相关的开发人员，以便进行相应的程序修改。<br />
三、设计技巧<br />
１．分类拆分数据量大的表。对于经常使用的表（如某些参数表或代码对照表），由于其使用频率很高，要尽量减少表中的记录数量。例如，银行的户主账表原来设计成一张表，虽然可以方便程序的设计与维护，但经过分析发现，由于数据量太大，会影响数据的迅速定位。如果将户主账表分别设计为活期户主账、定期户主账及对公户主账等，则可以大大提高查询效率。<br />
２．索引设计。对于大的数据库表，合理的索引能够提高整个数据库的操作效率。在索引设计中，索引字段应挑选重复值较少的字段；在对建有复合索引的字段进行检索时，应注意按照复合索引字段建立的顺序进行。例如，如果对一个５万多条记录的流水表以日期和流水号为序建立复合索引，由于在该表中日期的重复值接近整个表的记录数，用流水号进行查询所用的时间接近３秒；而如果以流水号为索引字段建立索引进行相同的查询，所用时间不到１秒。因此在大型数据库设计中，只有进行合理的索引字段选择，才能有效提高整个数据库的操作效率。<br />
３．数据操作的优化。在大型数据库中，如何提高数据操作效率值得关注。例如，每在数据库流水表中增加一笔业务，就必须从流水控制表中取出流水号，并将其流水号的数值加一。正常情况下，单笔操作的反应速度尚属正常，但当用它进行批量业务处理时，速度会明显减慢。经过分析发现，每次对流水控制表中的流水号数值加一时都要锁定该表，而该表却是整个系统操作的核心，有可能在操作时被其他进程锁定，因而使整个事务操作速度变慢。对这一问题的解决的办法是，根据批量业务的总笔数批量申请流水号，并对流水控制表进行一次更新，即可提高批量业务处理的速度。另一个例子是对插表的优化。对于大批量的业务处理，如果在插入数据库表时用普通的Ｉｎｓｅｒｔ语句，速度会很慢。其原因在于，每次插表都要进行一次Ｉ/Ｏ操作，花费较长的时间。改进后，可以用Ｐｕｔ语句等缓冲区形式等满页后再进行Ｉ/Ｏ操作，从而提高效率。对大的数据库表进行删除时，一般会直接用Ｄｅｌｅｔｅ语句，这个语句虽然可以进行小表操作，但对大表却会因带来大事务而导致删除速度很慢甚至失败。解决的方法是去掉事务，但更有效的办法是先进行Ｄｒｏｐ操作再进行重建。<br />
４．数据库参数的调整。数据库参数的调整是一个经验不断积累的过程，应由有经验的系统管理员完成。以Ｉｎｆｏｒｍｉｘ数据库为例，记录锁的数目太少会造成锁表的失败；逻辑日志的文件数目太少会造成插入大表失败等，这些问题都应根据实际情况进行必要的调整。<br />
５．必要的工具。在整个数据库的开发与设计过程中，可以先开发一些小的应用工具，如自动生成库表的头文件、插入数据的初始化、数据插入的函数封装、错误跟踪或自动显示等，以此提高数据库的设计与开发效率。<br />
６．避免长事务。对单个大表的删除或插入操作会带来大事务，解决的办法是对参数进行调整，也可以在插入时对文件进行分割。对于一个由一系列小事务顺序操作共同构成的长事务（如银行交易系统的日终交易），可以由一系列操作完成整个事务，但其缺点是有可能因整个事务太大而使不能完成，或者，由于偶然的意外而使事务重做所需的时间太长。较好的解决方法是，把整个事务分解成几个较小的事务，再由应用程序控制整个系统的流程。这样，如果其中某个事务不成功，则只需重做该事务，因而既可节约时间，又可避免长事务。<br />
７．适当超前。计算机技术发展日新月异，数据库的设计必须具有一定前瞻性，不但要满足当前的应用要求，还要考虑未来的业务发展，同时必须有利于扩展或增加应用系统的处理功能。<br />
与小型数据库相比，大型数据库的设计与开发要复杂得多，因此在设计、开发过程中，除了要遵循数据库范式理论、增加系统的一致性和完整性外，还要在总体上根据具体情况进行分布式设计，紧紧把握集中控制、统一审核的基本原则，保证数据库设计结构紧凑、分布平衡、定位迅速。在数据库操作上，要采用一定的技巧提高整个应用系统的执行效率，并注意适当超前，以适应不断变化的应用及系统发展的要求。（</span></div>
<img src ="http://www.blogjava.net/wangbing/aggbug/315579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2010-03-16 13:09 <a href="http://www.blogjava.net/wangbing/archive/2010/03/16/315579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于oracle中varchar2的最大长度</title><link>http://www.blogjava.net/wangbing/archive/2010/03/15/315482.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Mon, 15 Mar 2010 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2010/03/15/315482.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/315482.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2010/03/15/315482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/315482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/315482.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">关于&nbsp;varchar2&nbsp;的最大长度<br />
varchar2有两个最大长度：一个是在字段类型4000；一个是在PL/SQL中变量类型32767。今天犯了一个小错误，就是函数的varchar2类型的返回值长度也是4000，而不是我以为的32767。<br />
&nbsp;<br />
想了一下，这是一个比较容易出错的地方。因为在函数中我可以声明长度超过4000的字符串变量，并且将它作为返回值，这里是不会提示编译错误的。这个函数平时都可以正常执行，而一旦这个字符串长度超过4000，函数执行就会出错。所以这个问题虽然比较简单，仍然记录一下。<br />
&nbsp;<br />
C:\Documents&nbsp;and&nbsp;Settings\yuechao.tianyc&gt;sqlplus<br />
&nbsp;<br />
SQL*Plus:&nbsp;Release&nbsp;10.2.0.1.0&nbsp;-&nbsp;Production&nbsp;on&nbsp;星期二&nbsp;5月&nbsp;5&nbsp;17:15:59&nbsp;2009<br />
&nbsp;<br />
Copyright&nbsp;(c)&nbsp;1982,&nbsp;2005,&nbsp;Oracle.&nbsp;&nbsp;All&nbsp;rights&nbsp;reserved.<br />
&nbsp;<br />
请输入用户名:&nbsp;&nbsp;test/test<br />
&nbsp;<br />
连接到:<br />
Oracle&nbsp;Database&nbsp;10g&nbsp;Enterprise&nbsp;Edition&nbsp;Release&nbsp;10.2.0.1.0&nbsp;-&nbsp;Production<br />
With&nbsp;the&nbsp;Partitioning,&nbsp;OLAP&nbsp;and&nbsp;Data&nbsp;Mining&nbsp;options<br />
&nbsp;<br />
SQL&gt;&nbsp;create&nbsp;or&nbsp;replace&nbsp;function&nbsp;funny&nbsp;return&nbsp;varchar2<br />
&nbsp;&nbsp;2&nbsp;&nbsp;is<br />
&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;v_yct&nbsp;varchar2(32767);<br />
&nbsp;&nbsp;4&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;v_yct&nbsp;:=&nbsp;rpad('a',&nbsp;4001,&nbsp;'b');<br />
&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;v_yct;<br />
&nbsp;&nbsp;7&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;8&nbsp;&nbsp;/<br />
&nbsp;<br />
函数已创建。<br />
&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;funny&nbsp;from&nbsp;dual;<br />
select&nbsp;funny&nbsp;from&nbsp;dual<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
第&nbsp;1&nbsp;行出现错误:<br />
ORA-06502:&nbsp;PL/SQL:&nbsp;数字或值错误&nbsp;:&nbsp;&nbsp;字符串缓冲区太小<br />
ORA-06512:&nbsp;在&nbsp;"TEST.FUNNY",&nbsp;line&nbsp;6<br />
&nbsp;<br />
本来以为记录下来就好。刚才跟一位同事讨论了一下，认为有可能在schema级varchar2的长度限制都是4000，而在PL/SQL代码级的长度限制是32767。下面继续测试：<br />
&nbsp;<br />
--&nbsp;1.&nbsp;作为函数入参的限制是32767<br />
SQL&gt;&nbsp;create&nbsp;or&nbsp;replace&nbsp;function&nbsp;funny(&nbsp;p_char&nbsp;in&nbsp;varchar2&nbsp;)&nbsp;return&nbsp;number<br />
&nbsp;&nbsp;2&nbsp;&nbsp;is<br />
&nbsp;&nbsp;3&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;length(p_char);<br />
&nbsp;&nbsp;5&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;6&nbsp;&nbsp;/<br />
&nbsp;<br />
函数已创建。<br />
&nbsp;<br />
SQL&gt;&nbsp;declare<br />
&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;v_char&nbsp;varchar2(32767);<br />
&nbsp;&nbsp;3&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;v_char&nbsp;:=&nbsp;rpad('a',&nbsp;32767,&nbsp;'b');<br />
&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(funny(v_char));<br />
&nbsp;&nbsp;6&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;7&nbsp;&nbsp;/<br />
32767<br />
&nbsp;<br />
PL/SQL&nbsp;过程已成功完成。<br />
&nbsp;<br />
--&nbsp;2.&nbsp;同样的函数，在schema级和在PL/SQL代码级长度限制不同<br />
SQL&gt;&nbsp;select&nbsp;length(rpad('a',&nbsp;4001,&nbsp;'b'))&nbsp;from&nbsp;dual;<br />
&nbsp;<br />
LENGTH(RPAD('A',3276558,'B'))<br />
-----------------------------<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;4000<br />
&nbsp;<br />
SQL&gt;&nbsp;begin<br />
&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(length(rpad('a',&nbsp;4001,&nbsp;'b')));<br />
&nbsp;&nbsp;3&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;4&nbsp;&nbsp;/<br />
4001<br />
&nbsp;<br />
PL/SQL&nbsp;过程已成功完成。<br />
&nbsp;<br />
&nbsp;<br />
如果中间结果字符串长度超过限制会怎样呢？<br />
&nbsp;<br />
（1）在PL/SQL中，如果中间结果超过32767，没有影响：<br />
&nbsp;<br />
SQL&gt;&nbsp;declare<br />
&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;v_char1&nbsp;varchar2(32767);<br />
&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;v_char2&nbsp;varchar2(32767);<br />
&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;v_char3&nbsp;varchar2(10);<br />
&nbsp;&nbsp;5&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;v_char1&nbsp;:=&nbsp;lpad('a',&nbsp;32767,&nbsp;'a');<br />
&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;v_char2&nbsp;:=&nbsp;lpad('b',&nbsp;32767,&nbsp;'b');<br />
&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;v_char3&nbsp;:=&nbsp;substr(v_char1&nbsp;||&nbsp;v_char2,&nbsp;32763,&nbsp;10);<br />
&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(v_char3);<br />
&nbsp;10&nbsp;&nbsp;end;<br />
&nbsp;11&nbsp;&nbsp;/<br />
aaaaabbbbb<br />
&nbsp;<br />
PL/SQL&nbsp;过程已成功完成。<br />
&nbsp;<br />
（2）在schema级如果中间结果超过4000，会提示错误：<br />
&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;substr(rpad('a',&nbsp;4000,&nbsp;'a')||rpad('b',&nbsp;4000,&nbsp;'b'),&nbsp;3996,&nbsp;10)&nbsp;from&nbsp;dual;<br />
select&nbsp;substr(rpad('a',&nbsp;4000,&nbsp;'a')||rpad('b',&nbsp;4000,&nbsp;'b'),&nbsp;3996,&nbsp;10)&nbsp;from&nbsp;dual<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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
第&nbsp;1&nbsp;行出现错误:<br />
ORA-01489:&nbsp;字符串连接的结果过长<br />
&nbsp;<br />
&nbsp;<br />
如果字符串长度超过限制怎么办？可以使用CLOB类型。比如最开始的那个例子，可以将返回值改为CLOB类型：<br />
&nbsp;<br />
SQL&gt;&nbsp;create&nbsp;or&nbsp;replace&nbsp;function&nbsp;funny&nbsp;return&nbsp;clob<br />
&nbsp;&nbsp;2&nbsp;&nbsp;is<br />
&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;v_yct&nbsp;varchar2(32767);<br />
&nbsp;&nbsp;4&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;v_yct&nbsp;:=&nbsp;rpad('a',&nbsp;4001,&nbsp;'b');<br />
&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;v_yct;<br />
&nbsp;&nbsp;7&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;8&nbsp;&nbsp;/<br />
&nbsp;<br />
函数已创建。<br />
&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;funny&nbsp;from&nbsp;dual;<br />
&nbsp;<br />
FUNNY<br />
--------------------------------------------------------------------------------<br />
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br />
&nbsp;<br />
SQL&gt;&nbsp;set&nbsp;long&nbsp;10000<br />
SQL&gt;&nbsp;select&nbsp;funny&nbsp;from&nbsp;dual;<br />
FUNNY<br />
--------------------------------------------------------------------------------<br />
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br />
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br />
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br />
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
&nbsp;<br />
这样返回字符串的最大长度就是32767了。</span></div>
<img src ="http://www.blogjava.net/wangbing/aggbug/315482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2010-03-15 14:29 <a href="http://www.blogjava.net/wangbing/archive/2010/03/15/315482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]什么是savepoint？</title><link>http://www.blogjava.net/wangbing/archive/2010/03/05/314557.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Fri, 05 Mar 2010 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2010/03/05/314557.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/314557.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2010/03/05/314557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/314557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/314557.html</trackback:ping><description><![CDATA[<span  style="font-family: verdana, sans-serif; font-size: 16px; line-height: 26px; ">什么是savepoint?<br />
Use the SAVEPOINT statement to identify a point in a transaction to which you can later roll back.<br />
例如：&nbsp;<br />
SQL&gt; SELECT * FROM SCOTT.DEPT&nbsp;&nbsp;;<br />
<br />
DEPTNO DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOC<br />
------ -------------- -------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;10 ACCOUNTING&nbsp;&nbsp;&nbsp;&nbsp; NEW YORK<br />
&nbsp;&nbsp;&nbsp;&nbsp;20 RESEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DALLAS<br />
&nbsp;&nbsp;&nbsp;&nbsp;30 SALES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHICAGO<br />
&nbsp;&nbsp;&nbsp;&nbsp;40 OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp; BOSTON<br />
SQL&gt; UPDATE SCOTT.DEPT&nbsp;&nbsp;SET loc ='a' WHERE loc='NEW YORK';<br />
<br />
1 row updated<br />
SQL&gt; SAVEPOINT a;<br />
<br />
Savepoint created<br />
SQL&gt; UPDATE SCOTT.DEPT&nbsp;&nbsp;SET loc ='b' WHERE loc='DALLAS';<br />
<br />
1 row updated<br />
SQL&gt; SAVEPOINT b;<br />
<br />
Savepoint created<br />
SQL&gt; ROLLBACK TO SAVEPOINT a;<br />
<br />
Rollback complete<br />
SQL&gt; COMMIT;<br />
<br />
Commit complete<br />
SQL&gt; SELECT * FROM SCOTT.DEPT&nbsp;&nbsp;;<br />
<br />
DEPTNO DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOC<br />
------ -------------- -------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;10 ACCOUNTING&nbsp;&nbsp;&nbsp;&nbsp; a<br />
&nbsp;&nbsp;&nbsp;&nbsp;20 RESEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DALLAS<br />
&nbsp;&nbsp;&nbsp;&nbsp;30 SALES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHICAGO<br />
&nbsp;&nbsp;&nbsp;&nbsp;40 OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp; BOSTON&nbsp;<br />
<br />
事务中的Savepoints&nbsp;<br />
你可以在事务上下文中声明称为savepoint的中间标记。Savepoint将一个长事务分隔为较小的部分。&nbsp;<br />
使用savepoint，你可以在长事务中任何点任意标记你的操作。然后你可以选择回滚在事务中当前点之前、声明的savepoint之后执行的操作。比如，你可以在一长段复杂的更新中使用savepoint，如果犯了个错，你不需要重新提交所有语句。&nbsp;<br />
Savepoints在应用程序中同样有用。如果一个过程包含几个函数，那可以在每个函数前创建一个savepoint。如果一个函数失败，返回数据到函数开始前的状态并在修改参数或执行一个恢复操作后重新运行函数就非常容易。&nbsp;<br />
在回滚到一个savepoint后，Oracle释放由被回滚的语句持有的锁。其他等待之前被锁资源的事务可以进行了。其他要更新之前被锁行的事务也可以执行。&nbsp;<br />
当一个事务回滚到一个savepoint，发生下列事件：&nbsp;<br />
1. Oracle仅回滚savepoint之后的语句。&nbsp;<br />
2. Oracle保留这一savepoint，但所有建立于此后的savepoints丢失。&nbsp;<br />
3. Oracle释放在该savepoint后获得的所有表、行锁，但保留之前获得的所有锁。&nbsp;<br />
事务保持活动并可继续。&nbsp;<br />
无论何时一个会话在等待事务，到savepoint的回滚不会释放行锁。为了确保事务如果无法获得锁也不会悬挂（hang），在执行UPDATE或DELETE前使用FOR UPDATE ... NOWAIT。（这里指回滚的savepoint之前获得的锁。该savepoint后获得的行锁会被释放，之后执行的语句也会被彻底回滚。）&nbsp;<br />
&nbsp;&nbsp;<br />
<br />
注意：<br />
1.savepoint 名字保持唯一<br />
2.如果后面新设置的一个savepoint的名字和前面的一个savepoint名字重复，前一个savepoint将被取消<br />
3.设置savepoint后，事务可以继续commit,全部回退或者回退到具体一个savepoints<br />
(Savepoint names must be distinct within a given transaction. If you create a second savepoint with the same identifier as an earlier savepoint, then the earlier savepoint is erased. After a savepoint has been created, you can either continue processing, commit your work, roll back the entire transaction, or roll back to the savepoint.)&nbsp;<br />
4.撤销的处理必须是在没有发出commit命令的前提下才能有效。<br />
如下：在commit;后执行rollback to savepoint失败&nbsp;<br />
SQL&gt; SELECT * FROM SCOTT.DEPT&nbsp;&nbsp;;<br />
<br />
DEPTNO DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOC<br />
------ -------------- -------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;10 ACCOUNTING&nbsp;&nbsp;&nbsp;&nbsp; NEW YORK<br />
&nbsp;&nbsp;&nbsp;&nbsp;20 RESEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DALLAS<br />
&nbsp;&nbsp;&nbsp;&nbsp;30 SALES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHICAGO<br />
&nbsp;&nbsp;&nbsp;&nbsp;40 OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp; BOSTON<br />
SQL&gt; UPDATE SCOTT.DEPT&nbsp;&nbsp;SET loc ='a' WHERE loc='NEW YORK';<br />
<br />
1 row updated<br />
SQL&gt; SAVEPOINT a;<br />
<br />
Savepoint created<br />
SQL&gt; UPDATE SCOTT.DEPT&nbsp;&nbsp;SET loc ='b' WHERE loc='DALLAS';<br />
<br />
1 row updated<br />
SQL&gt; SAVEPOINT b;<br />
<br />
Savepoint created<br />
SQL&gt; COMMIT;<br />
<br />
Commit complete<br />
SQL&gt; ROLLBACK TO SAVEPOINT a;<br />
<br />
ROLLBACK TO SAVEPOINT a<br />
<br />
ORA-01086: 从未创建保留点 'A'<br />
SQL&gt; SELECT * FROM SCOTT.DEPT&nbsp;&nbsp;;<br />
<br />
DEPTNO DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOC<br />
------ -------------- -------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;10 ACCOUNTING&nbsp;&nbsp;&nbsp;&nbsp; a<br />
&nbsp;&nbsp;&nbsp;&nbsp;20 RESEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b<br />
&nbsp;&nbsp;&nbsp;&nbsp;30 SALES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHICAGO<br />
&nbsp;&nbsp;&nbsp;&nbsp;40 OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp; BOSTON</span>
<img src ="http://www.blogjava.net/wangbing/aggbug/314557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2010-03-05 09:06 <a href="http://www.blogjava.net/wangbing/archive/2010/03/05/314557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle常用的监控语句</title><link>http://www.blogjava.net/wangbing/archive/2010/02/03/311821.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Wed, 03 Feb 2010 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2010/02/03/311821.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/311821.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2010/02/03/311821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/311821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/311821.html</trackback:ping><description><![CDATA[<span  style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">--根据FILE_ID &amp; BLOCK_ID获得对象名称<br />
SELECT /*+ RULE*/ owner, segment_name, segment_type<br />
&nbsp; FROM dba_extents<br />
&nbsp;WHERE file_id = &amp;file_id<br />
&nbsp;&nbsp; AND &amp;block_id BETWEEN block_id AND block_id + blocks - 1;<br />
<br />
--根据操作系统PID,查询SESSION信息<br />
SELECT a.sid, a.serial#, b.spid, a.terminal, a.machine, a.program, a.osuser<br />
&nbsp; FROM v$session a, v$process b<br />
&nbsp;WHERE a.paddr = b.addr AND b.spid = '&amp;SPID';<br />
<br />
--根据SESSION SID,查询操作系统PID<br />
SELECT a.sid, a.serial#, b.spid, a.terminal, a.machine, a.program, a.osuser<br />
&nbsp; FROM v$session a, v$process b<br />
&nbsp;WHERE a.paddr = b.addr AND a.sid = '&amp;SID';<br />
<br />
--查询用户正在执行的SQL<br />
SELECT sql_text<br />
&nbsp; FROM v$sqltext<br />
&nbsp;WHERE hash_value = (SELECT sql_hash_value<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE sid = &amp;sid)<br />
&nbsp;ORDER BY piece;<br />
<br />
--查询当前的系统等待事件<br />
SELECT *<br />
&nbsp; FROM v$session_wait<br />
&nbsp;WHERE event NOT LIKE '%SQL*Net%'<br />
&nbsp;&nbsp; AND event NOT LIKE '%rdbms%'<br />
&nbsp;&nbsp; AND event NOT LIKE '%timer%'<br />
&nbsp;&nbsp; AND event NOT LIKE '%jobq%'<br />
&nbsp;ORDER BY event, seconds_in_wait;<br />
<br />
--查询详细的当前系统等待事件<br />
SELECT s.sid, s.username, w.seq#, w.event, w.p1text, w.p1, w.p2text, w.p2, w.p3text, w.p3,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.seconds_in_wait, w.state, s.logon_time, s.osuser, s.program<br />
&nbsp; FROM v$session s, v$session_wait w<br />
&nbsp;WHERE s.sid = w.sid<br />
&nbsp;&nbsp; AND w.event NOT LIKE '%SQL*Net%'<br />
&nbsp;&nbsp; AND w.event NOT LIKE '%rdbms%'<br />
&nbsp;&nbsp; AND w.event NOT LIKE '%timer%'<br />
&nbsp;&nbsp; AND w.event NOT LIKE '%jobq%'<br />
&nbsp;ORDER BY w.event, w.seconds_in_wait;<br />
<br />
--查询等待db file sequential/scattered read的Session正在执行的SQL<br />
SELECT s.sid, s.username, t.hash_value, t.piece, t.sql_text<br />
&nbsp; FROM v$session s, v$session_wait w, v$sqltext t<br />
&nbsp;WHERE s.sid = w.sid<br />
&nbsp;&nbsp; AND s.sql_hash_value = t.hash_value<br />
&nbsp;&nbsp; AND w.event IN ('db file sequential read', 'db file scattered read')<br />
&nbsp;ORDER BY s.sid, t.piece;<br />
<br />
--查询等待db file sequential/scattered read对应的数据库对象<br />
SELECT /*+ RULE*/ s.sid, s.username, w.seq#, w.event,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.segment_type, d.owner || '.' || d.segment_name AS segment_name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.seconds_in_wait, w.state, s.logon_time<br />
&nbsp; FROM v$session s, v$session_wait w, dba_extents d<br />
&nbsp;WHERE s.sid = w.sid<br />
&nbsp;&nbsp; AND d.file_id = w.p1<br />
&nbsp;&nbsp; AND w.p2 BETWEEN d.block_id AND d.block_id + d.blocks - 1<br />
&nbsp;&nbsp; AND w.event IN ('db file sequential read', 'db file scattered read')<br />
&nbsp;ORDER BY w.event, segment_name;<br />
<br />
--查询导致LOCK的SID,SPID,LOCKED_OBJECT,LOCK_TYPE等信息<br />
SELECT /*+ RULE*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l.sid, p.spid, s.username,s.logon_time, s.osuser, s.program, l.type,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE l.TYPE WHEN 'TM' THEN O.object_name WHEN 'TX' THEN '' END as OBJECT_NAME,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (l.lmode, 0, '0=NONE', 1, '1=NULL', 2, '2=RS', 3, '3=RX', 4, '4=S', 5, '5=SRX', 6, '6=X') lmode,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE l.request WHEN 0 THEN '' ELSE 'BLOCKED BY ' || l.id2 END as BLOCKED,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE l.block WHEN 0 THEN '' ELSE l.id2 || ' IS BLOCKING' END as BLOCKING,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l.request, l.ctime<br />
&nbsp; FROM v$lock l, v$session s, dba_objects o, v$process p<br />
&nbsp;WHERE l.type in ('TX', 'TM')<br />
&nbsp;&nbsp; AND s.paddr = p.addr<br />
&nbsp;&nbsp; AND l.sid = s.sid<br />
&nbsp;&nbsp; AND l.id1 = o.object_id(+)<br />
&nbsp;ORDER BY s.username, l.sid, l.ctime;<br />
<br />
--查询导致DDL LOCK的详细信息<br />
SELECT s.sid, p.spid, s.username, a.owner || '.' || a.NAME AS OBJECT_NAME,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.TYPE, a.mode_held, a.mode_requested, s.osuser, s.logon_time, s.program<br />
&nbsp; FROM dba_ddl_locks a, v$session s, v$process p<br />
&nbsp;WHERE s.sid = a.session_id<br />
&nbsp;&nbsp; AND s.paddr = p.addr<br />
&nbsp;&nbsp; AND (a.mode_held = 'Exclusive' OR a.mode_requested = 'Exclusive')<br />
&nbsp;ORDER BY s.USERNAME, a.NAME;<br />
<br />
--查询事务使用的回滚段<br />
SELECT s.username, s.sid, s.serial#, t.ubafil "UBA filenum",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.ubablk "UBA Block number", t.used_ublk "Number of undo Blocks Used",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.start_time, t.status, t.start_scnb, t.xidusn rollid, r.name rollname<br />
&nbsp; FROM v$session s, v$transaction t, v$rollname r<br />
&nbsp;WHERE s.saddr = t.ses_addr AND t.xidusn = r.usn;<br />
####################################################################################################<br />
<br />
<br />
--查询LIBRARY CACHE PIN等待事件等待的对象<br />
--视图缩写:[K]ernel [G]eneric [L]ibrary Cache Manager [OB]ject<br />
SELECT /*+ RULE*/ addr, kglhdadr, kglhdpar, kglnaobj, kglnahsh, kglhdobj<br />
&nbsp; FROM x$kglob<br />
&nbsp;WHERE kglhdadr IN (SELECT p1raw<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session_wait<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE event LIKE '%library%');<br />
<br />
--查询LIBRARY CACHE PIN等待事件中持有被等待对象的SESSION信息<br />
--视图缩写:[K]ernel [G]eneric [L]ibrary Cache Manager Object [P]i[N]s<br />
SELECT /*+ RULE*/ a.SID, a.username, a.program, b.addr, b.kglpnadr, b.kglpnuse,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.kglpnses, b.kglpnhdl, b.kglpnlck, b.kglpnmod, b.kglpnreq<br />
&nbsp; FROM v$session a, x$kglpn b<br />
&nbsp;WHERE a.saddr = b.kglpnuse<br />
&nbsp;&nbsp; AND b.kglpnmod &lt;&gt; 0<br />
&nbsp;&nbsp; AND b.kglpnhdl IN (SELECT p1raw<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session_wait<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE event LIKE '%library%');<br />
<br />
--查询LIBRARY CACHE PIN等待事件中持有被等待对象的SESSION执行的SQL语句<br />
SELECT sql_text<br />
&nbsp; FROM v$sqlarea<br />
&nbsp;WHERE (v$sqlarea.address, v$sqlarea.hash_value) IN (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT sql_address, sql_hash_value<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE SID IN (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ RULE*/ SID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session a, x$kglpn b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE a.saddr = b.kglpnuse<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND b.kglpnmod &lt;&gt; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND b.kglpnhdl IN (SELECT p1raw<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session_wait<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE event LIKE '%library%')));<br />
<br />
--查询哪个SESSION正在使用某个对象(LIBRARY CACHE)<br />
SELECT DISTINCT s.sid,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.username,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.logon_time,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.osuser,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.program,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.kglnahsh as SQL_HASH_VALUE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.kglnaobj as SQL_TEXT<br />
&nbsp; FROM v$session s, x$kglpn n, x$kglob b<br />
&nbsp;WHERE n.kglpnuse = s.saddr<br />
&nbsp;&nbsp; AND upper(b.kglnaobj) LIKE upper('%&amp;OBJECT_NAME%')<br />
&nbsp;&nbsp; AND n.kglpnhdl = b.kglhdadr;<br />
<br />
--查询V$SESSION_WAIT用户PIN住了哪些对象(LIBRARY CACHE)<br />
SELECT DISTINCT s.sid,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.username,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.logon_time,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.osuser,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.program,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n.kglpnmod,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.kglnahsh AS SQL_HASH_VALUE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.kglnaobj AS SQL_TEXT<br />
&nbsp; FROM v$session s, x$kglpn n, x$kglob b<br />
&nbsp;WHERE n.kglpnuse = s.saddr<br />
&nbsp;&nbsp; AND n.kglpnhdl = b.kglhdadr<br />
&nbsp;&nbsp; AND s.sid IN (SELECT sid<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session_wait<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE event NOT LIKE '%SQL*Net%'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND event NOT LIKE '%rdbms%'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND event NOT LIKE '%timer%'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND event NOT LIKE '%jobq%')<br />
&nbsp;ORDER BY s.username;<br />
<br />
--查询哪些大对象被载入SHARED POOL时导致其它对象被老化<br />
SELECT s.sid, s.username, s.logon_time, s.osuser, s.program,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k.ksmlrcom, k.ksmlrsiz, k.ksmlrnum, k.ksmlrhon, k.ksmlrses<br />
&nbsp; FROM x$ksmlru k, v$session s<br />
&nbsp;WHERE s.saddr = k.ksmlrses<br />
&nbsp;&nbsp; AND ksmlrsiz &gt; 0;<br />
####################################################################################################<br />
<br />
<br />
--查询Schema哪些表是全表扫描<br />
SELECT o.name, x.tch<br />
&nbsp; FROM obj$ o, x$bh x, dba_users u<br />
&nbsp;WHERE x.obj = o.dataobj#<br />
&nbsp;&nbsp; AND STANDARD.bitand(x.flag, 524288) &gt; 0<br />
&nbsp;&nbsp; AND u.username = UPPER('&amp;username')<br />
&nbsp;ORDER BY x.tch DESC;<br />
<br />
--查询低效率的SQL(BUFFER_GETS排序)<br />
SELECT *<br />
&nbsp; FROM (SELECT s.sid,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.spid,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.sql_hash_value,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.sql_text,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.executions,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.buffer_gets,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROUND(q.buffer_gets / q.executions) AS buffer_per_exec,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROUND(q.elapsed_time / q.executions) AS cpu_time_per_exec,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.cpu_time,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.elapsed_time,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.disk_reads,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.rows_processed<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session s, v$process b, v$sql q<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE s.sql_hash_value = q.hash_value<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND s.paddr = b.addr<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND s.status = 'ACTIVE'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND s.TYPE = 'USER'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND q.buffer_gets &gt; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND q.executions &gt; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY buffer_per_exec DESC)<br />
&nbsp;WHERE ROWNUM &lt;= 10;<br />
####################################################################################################<br />
<br />
<br />
--监控BufferCache命中率<br />
SELECT a.value + b.value logical_reads, c.value phys_reads,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROUND (100 * (1 - c.value / (a.value + b.value)), 4) hit_ratio<br />
&nbsp; FROM v$sysstat a, v$sysstat b, v$sysstat c<br />
&nbsp;WHERE a.NAME = 'db block gets'<br />
&nbsp;&nbsp; AND b.NAME = 'consistent gets'<br />
&nbsp;&nbsp; AND c.NAME = 'physical reads';<br />
<br />
--监控LibraryCache命中率<br />
SELECT SUM (pins) total_pins, SUM (reloads) total_reloads,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (reloads) / SUM (pins) * 100 libcache_reload_ratio<br />
&nbsp; FROM v$librarycache;<br />
<br />
--查询产生的跟踪文件名<br />
SELECT p1.VALUE || '/' || p2.VALUE || '_ora_' || p.spid || '.trc' filename<br />
&nbsp; FROM v$process p, v$session s, v$parameter p1, v$parameter p2<br />
&nbsp;WHERE p1.NAME = 'user_dump_dest'<br />
&nbsp;&nbsp; AND p2.NAME = 'db_name'<br />
&nbsp;&nbsp; AND p.addr = s.paddr<br />
&nbsp;&nbsp; AND s.audsid = USERENV ('SESSIONID');<br />
<br />
--删除表中的重复记录<br />
DELETE FROM table_name a<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE ROWID &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MIN (ROWID)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM table_name b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE b.pk_column_1 = a.pk_column_1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND b.pk_column_2 = a.pk_column_2);</span>
<img src ="http://www.blogjava.net/wangbing/aggbug/311821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2010-02-03 17:09 <a href="http://www.blogjava.net/wangbing/archive/2010/02/03/311821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又回到了从前</title><link>http://www.blogjava.net/wangbing/archive/2010/02/02/311654.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Tue, 02 Feb 2010 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2010/02/02/311654.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/311654.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2010/02/02/311654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/311654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/311654.html</trackback:ping><description><![CDATA[还记得07年快要毕业那会，在林业局给他们出报表，不停的写sql，写存储过程。但是最后还没有开始测试，就离开了武汉来北京了。来北京的2年多时间了，发现好像回到了原来的起点，因为又开始不停的写sql，写存储过程。我很担心，原来是我一个人在写，现在是安排好几个人在写。原来是实习，现在是上班。我担心这些东西还是会很以前一样，根本无法使用，但是我也无能为力，没有人提供有帮助的意见。又回到了从前。
<img src ="http://www.blogjava.net/wangbing/aggbug/311654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2010-02-02 12:37 <a href="http://www.blogjava.net/wangbing/archive/2010/02/02/311654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程事务控制</title><link>http://www.blogjava.net/wangbing/archive/2010/01/26/310894.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Tue, 26 Jan 2010 10:58:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2010/01/26/310894.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/310894.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2010/01/26/310894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/310894.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/310894.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">存储过程里的事务操作：<br />
create&nbsp;or&nbsp;replace&nbsp;procedure&nbsp;pr_mypro2(p_a&nbsp;in&nbsp;varchar2,p_b&nbsp;in&nbsp;varchar2,p_count&nbsp;out&nbsp;number)<br />
temp&nbsp;varchar2(1000);&nbsp;&nbsp;&nbsp;/**//*定义临时变量*/<br />
is<br />
begin<br />
select&nbsp;code&nbsp;into&nbsp;p_count&nbsp;from&nbsp;table1&nbsp;where&nbsp;a=p_a;&nbsp;/**//*查询并返回值*/<br />
temp&nbsp;:=&nbsp;p_count;&nbsp;&nbsp;/**//*将返回值赋给临时变量*/<br />
savepoint&nbsp;point1;&nbsp;&nbsp;/**//*保存点*/<br />
insert&nbsp;into&nbsp;table2(a,b)values(temp,p_b);&nbsp;/**//*将临时变量值添加到新表的字段*/<br />
savepoint&nbsp;point2;<br />
insert&nbsp;into&nbsp;<br />
<br />
&nbsp;exception&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;&nbsp;&nbsp;others&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rollback&nbsp;to&nbsp;savepoint&nbsp;point1;&nbsp;&nbsp;/**//*异常处理，保存点下面的操作都不会被执行*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
end;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;保存点<br />
(SAVEPOINT)是事务处理过程中的一个标志，与回滚命令(ROLLBACK)结合使用，主要的用途是允许用户将某一段处理回滚而不必回滚整个事务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果定义了多个savepoint，当指定回滚到某个savepoint时，那么回滚操作将回滚这个savepoint后面的所有操作（即使后面可能标记了N个savepoint）。<br />
例如，在一段处理中定义了五个savepoint，从第三个savepoint回滚，后面的第四、第五个标记的操作都将被回滚，如果不使用ROLLBACK&nbsp;TO&nbsp;savepoint_name而使用ROLLBACK，将会滚整个事务处理。</span></div>
<img src ="http://www.blogjava.net/wangbing/aggbug/310894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2010-01-26 18:58 <a href="http://www.blogjava.net/wangbing/archive/2010/01/26/310894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]ODI定时任务</title><link>http://www.blogjava.net/wangbing/archive/2009/09/02/293530.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Wed, 02 Sep 2009 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/09/02/293530.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/293530.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/09/02/293530.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/293530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/293530.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">我当时就是按照这个文章学会如何配置ODI的定时任务的。具体地址：http://www.dbform.com/html/2008/516.html<br />
<br />
<br />
对于设置ODI的定时执行场景，需要启动Scheduler&nbsp;Agent，在一个新的ODI安装完毕之后，默认的odiparams.bat文件中设置的是连接DEMO环境的数据库连接配置，如果我们在自己的数据库里创建了Master&nbsp;Repository和Work&nbsp;Repository，那么需要修改连接参数。<br />
<br />
在我的测试环境中，我使用的是自己机器上Oracle&nbsp;11g数据库，实例名是orcl11g，则需要做如下修改：<br />
<br />
set&nbsp;ODI_SECU_DRIVER</span><span style="color: #000000;">=</span><span style="color: #000000;">oracle.jdbc.driver.OracleDriver<br />
set&nbsp;ODI_SECU_URL</span><span style="color: #000000;">=</span><span style="color: #000000;">jdbc:oracle:thin:@localhost:</span><span style="color: #000000;">1521</span><span style="color: #000000;">:orcl11g<br />
set&nbsp;ODI_SECU_USER</span><span style="color: #000000;">=</span><span style="color: #000000;">snpm<br />
set&nbsp;ODI_SECU_ENCODED_PASS</span><span style="color: #000000;">=</span><span style="color: #000000;">b9yX4CpBkdmaP8Y3mYbaoye2p<br />
set&nbsp;ODI_SECU_WORK_REP</span><span style="color: #000000;">=</span><span style="color: #000000;">WORKREP1<br />
set&nbsp;ODI_USER</span><span style="color: #000000;">=</span><span style="color: #000000;">SUPERVISOR<br />
set&nbsp;ODI_ENCODED_PASS</span><span style="color: #000000;">=</span><span style="color: #000000;">hZypfAZQf.Yo8VWVI6HZzc<br />
<br />
其中：<br />
ODI_SECU_USER需要设置为创建Master&nbsp;Repository时候的用户名，在这里是snpm。<br />
ODI_SECU_ENCODED_PASS需要用agent实用程序加密一下，用法是agent&nbsp;encode&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">PASSWORD</span><span style="color: #000000;">%</span><span style="color: #000000;">。<br />
ODI_SECU_WORK_REP设置为创建Work&nbsp;Repository时候起的名字。<br />
ODI_USER默认是SUPERVISOR，这是连接ODI的用户名。<br />
ODI_ENCODED_PASS默认是SUNOPSIS，也需要用agent&nbsp;encode加密之后的值。<br />
<br />
设置完毕，启动Scheduler&nbsp;Agent，会遇到下面的错误：<br />
java.lang.Exception:&nbsp;Agent&nbsp;is&nbsp;not&nbsp;declared&nbsp;in&nbsp;Topology&nbsp;Manager<br />
<br />
我们还需要在Topology&nbsp;Manager&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;Physical&nbsp;Architecture&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;Agents里面创建一个Agent，填写Agent的名字，监听的机器，端口。如果需要设置Schedule，还需要在Topology&nbsp;Manager&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;Logical&nbsp;Architecture&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;Agents里面再创建一个Agent，将刚才创建的Physical&nbsp;Agent和此Logical&nbsp;Agent绑定在一起。<br />
<br />
然后，在Designer&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;Projects&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;Scenarios&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;Scheduling中创建一个执行计划，之后再次启动Scheduler&nbsp;Agent就OK了。<br />
<br />
C:\OraODI\oracledi\bin</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">agentscheduler&nbsp;&#8220;</span><span style="color: #000000;">-</span><span style="color: #000000;">port</span><span style="color: #000000;">=</span><span style="color: #000000;">20910</span><span style="color: #000000;">&#8243;&nbsp;&#8220;</span><span style="color: #000000;">-</span><span style="color: #000000;">NAME</span><span style="color: #000000;">=</span><span style="color: #000000;">myFirstAgent&#8221;<br />
A&nbsp;JDK&nbsp;is&nbsp;required&nbsp;to&nbsp;execute&nbsp;Web&nbsp;Services&nbsp;with&nbsp;OracleDI.&nbsp;You&nbsp;are&nbsp;currently&nbsp;using&nbsp;a&nbsp;JRE.<br />
OracleDI:&nbsp;Starting&nbsp;Scheduler&nbsp;Agent&nbsp;&#8230;<br />
Starting&nbsp;Oracle&nbsp;Data&nbsp;Integrator&nbsp;Agent&#8230;<br />
Version&nbsp;:&nbsp;</span><span style="color: #000000;">10.1</span><span style="color: #000000;">.</span><span style="color: #000000;">3.4</span><span style="color: #000000;">.</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&#8211;&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">/</span><span style="color: #000000;">10</span><span style="color: #000000;">/</span><span style="color: #000000;">2007</span><span style="color: #000000;"><br />
Agent&nbsp;in&nbsp;scheduling&nbsp;mode<br />
Number&nbsp;of&nbsp;items&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;scheduled&nbsp;executions:</span><span style="color: #000000;">0</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">17</span><span style="color: #000000;">/</span><span style="color: #000000;">2008</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">02</span><span style="color: #000000;">:</span><span style="color: #000000;">58</span><span style="color: #000000;">:</span><span style="color: #000000;">09</span><span style="color: #000000;">&nbsp;PM(main):&nbsp;Server&nbsp;Launched<br />
Aug&nbsp;</span><span style="color: #000000;">17</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2008</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">:</span><span style="color: #000000;">06</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">&nbsp;PM&nbsp;com.sunopsis.j.s&nbsp;a<br />
INFO:&nbsp;Start&nbsp;Thread[</span><span style="color: #000000;">1001</span><span style="color: #000000;">@</span><span style="color: #000000;">2008</span><span style="color: #000000;">/</span><span style="color: #000000;">08</span><span style="color: #000000;">/</span><span style="color: #000000;">17_03:</span><span style="color: #000000;">06</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">:</span><span style="color: #000000;">000</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,main]&nbsp;@&nbsp;Aug&nbsp;</span><span style="color: #000000;">17</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2008</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">:</span><span style="color: #000000;">06</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">&nbsp;PM<br />
<br />
最后一行显示了在Schedule中定义的计划被执行成功。<br />
<br />
在Windows操作系统中可以把Agent程序设置为Service，通过以下命令设置，其中倒数两个参数分别为Physical&nbsp;Agent&nbsp;Name和Agent&nbsp;Port：<br />
agentservice.bat&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">s&nbsp;myFirstAgent&nbsp;</span><span style="color: #000000;">20910</span><span style="color: #000000;"><br />
<br />
运行成功之后，将会产生OracleDI&nbsp;Agent&nbsp;Scheduler&nbsp;myFirstAgent这样命名的Windows服务。<br />
<br />
通过以下命令可以删除创建的服务：<br />
agentservice.bat&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">s&nbsp;myFirstAgent<br />
<br />
<br />
<br />
</span></div>
<img src ="http://www.blogjava.net/wangbing/aggbug/293530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-09-02 09:44 <a href="http://www.blogjava.net/wangbing/archive/2009/09/02/293530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle的flashback功能使用</title><link>http://www.blogjava.net/wangbing/archive/2009/06/18/283053.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 18 Jun 2009 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/06/18/283053.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/283053.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/06/18/283053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/283053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/283053.html</trackback:ping><description><![CDATA[<span style="font-family: Arial; color: #ac6100; font-size: 14px; line-height: 22px; ">alter table&nbsp;table_name&nbsp;&nbsp;enable row movement;<br />
<br />
flashback table table_name to timestamp(to_date('20090618 13:00:00','yyyymmdd hh24:mi:ss'))</span>
<img src ="http://www.blogjava.net/wangbing/aggbug/283053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-06-18 15:00 <a href="http://www.blogjava.net/wangbing/archive/2009/06/18/283053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle包——AJ_SHOWCASETABLE</title><link>http://www.blogjava.net/wangbing/archive/2009/05/21/271972.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 21 May 2009 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/05/21/271972.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/271972.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/05/21/271972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/271972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/271972.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->drop&#160;package&#160;LQ//*==============================================================...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangbing/archive/2009/05/21/271972.html'>阅读全文</a><img src ="http://www.blogjava.net/wangbing/aggbug/271972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-05-21 14:39 <a href="http://www.blogjava.net/wangbing/archive/2009/05/21/271972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle包—— TRANSPORT_CHECK</title><link>http://www.blogjava.net/wangbing/archive/2009/05/21/271971.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 21 May 2009 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/05/21/271971.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/271971.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/05/21/271971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/271971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/271971.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->drop&#160;package&#160;TRANSPORT_CHECK//*=================================================...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangbing/archive/2009/05/21/271971.html'>阅读全文</a><img src ="http://www.blogjava.net/wangbing/aggbug/271971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-05-21 14:38 <a href="http://www.blogjava.net/wangbing/archive/2009/05/21/271971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle包，动态执行sql—— TESTFUNINPROC</title><link>http://www.blogjava.net/wangbing/archive/2009/05/21/271970.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 21 May 2009 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/05/21/271970.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/271970.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/05/21/271970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/271970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/271970.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">drop</span><span style="color: #000000; ">&#160;package&#160;TESTFUNINPROC<br />
</span><span style="color: #808080; ">/</span><span style="color: #000000; "><br />
<br />
</span><span style="color: #008080; ">/*</span><span style="color: #008080; ">==============================================================</span><span style="color: #008080; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">/*</span><span style="color: #008080; ">&#160;Database&#160;package:&#160;TESTFUNINPROC&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008080; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">/*</span><span style="color: #008080; ">==============================================================</span><span style="color: #008080; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">create</span><span style="color: #000000; ">&#160;</span><span style="color: #808080; ">or</span><span style="color: #000000; ">&#160;</span><span style="color: #FF00FF; ">replace</span><span style="color: #000000; ">&#160;package&#160;TESTFUNINPROC&#160;</span><span style="color: #0000FF; ">as</span><span style="color: #000000; "><br />
&#160;&#160;&#160;type&#160;OUTLIST&#160;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&#160;REF&#160;</span><span style="color: #0000FF; ">CURSOR</span><span style="color: #000000; ">;<br />
&#160;&#160;&#160;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&#160;TESTFUN&#160;(TYPENUM&#160;</span><span style="color: #808080; ">IN</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; font-weight: bold; ">varchar2</span><span style="color: #000000; ">)&#160;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&#160;outlist;<br />
&#160;&#160;&#160;</span><span style="color: #0000FF; ">procedure</span><span style="color: #000000; ">&#160;TESTPROC&#160;(TYPENUM&#160;</span><span style="color: #808080; ">IN</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; font-weight: bold; ">varchar2</span><span style="color: #000000; ">,RESULT&#160;OUT&#160;outlist);<br />
</span><span style="color: #0000FF; ">end</span><span style="color: #000000; ">&#160;TESTFUNINPROC;<br />
</span><span style="color: #808080; ">/</span><span style="color: #000000; "><br />
<br />
</span><span style="color: #0000FF; ">create</span><span style="color: #000000; ">&#160;</span><span style="color: #808080; ">or</span><span style="color: #000000; ">&#160;</span><span style="color: #FF00FF; ">replace</span><span style="color: #000000; ">&#160;package&#160;body&#160;TESTFUNINPROC&#160;</span><span style="color: #0000FF; ">as</span><span style="color: #000000; "><br />
&#160;&#160;&#160;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&#160;TESTFUN&#160;(TYPENUM&#160;</span><span style="color: #808080; ">IN</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; font-weight: bold; ">varchar2</span><span style="color: #000000; ">)&#160;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&#160;outlist&#160;</span><span style="color: #0000FF; ">as</span><span style="color: #000000; "><br />
&#160;&#160;&#160;rc&#160;outlist;<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">Begin</span><span style="color: #000000; "><br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">open</span><span style="color: #000000; ">&#160;rc&#160;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; "><br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">select</span><span style="color: #000000; ">&#160;</span><span style="color: #808080; ">*</span><span style="color: #000000; ">&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&#160;GG_BOOK&#160;book<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">where</span><span style="color: #000000; ">&#160;book.BOOK_ZBLX&#160;</span><span style="color: #808080; ">=</span><span style="color: #000000; ">&#160;typeNum&#160;;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&#160;rc;<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">End</span><span style="color: #000000; ">;<br />
&#160;&#160;&#160;</span><span style="color: #0000FF; ">procedure</span><span style="color: #000000; ">&#160;TESTPROC&#160;(TYPENUM&#160;</span><span style="color: #808080; ">IN</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; font-weight: bold; ">varchar2</span><span style="color: #000000; ">,RESULT&#160;OUT&#160;outlist)&#160;</span><span style="color: #0000FF; ">as</span><span style="color: #000000; "><br />
&#160;&#160;&#160;</span><span style="color: #0000FF; ">Begin</span><span style="color: #000000; "><br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;result&#160;:</span><span style="color: #808080; ">=</span><span style="color: #000000; ">&#160;hblz_new.TestFunInProc.testFun(typeNum);<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">End</span><span style="color: #000000; ">;<br />
</span><span style="color: #0000FF; ">end</span><span style="color: #000000; ">&#160;TESTFUNINPROC;<br />
</span><span style="color: #808080; ">/</span></div>
<img src ="http://www.blogjava.net/wangbing/aggbug/271970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-05-21 14:37 <a href="http://www.blogjava.net/wangbing/archive/2009/05/21/271970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle包—— CUT_COUNTSENDBOOK</title><link>http://www.blogjava.net/wangbing/archive/2009/05/21/271969.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 21 May 2009 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/05/21/271969.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/271969.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/05/21/271969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/271969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/271969.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->drop&#160;package&#160;CUT_COUNTSENDBOOK//*===============================================...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangbing/archive/2009/05/21/271969.html'>阅读全文</a><img src ="http://www.blogjava.net/wangbing/aggbug/271969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-05-21 14:36 <a href="http://www.blogjava.net/wangbing/archive/2009/05/21/271969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle函数包—— COMMON_FUNCTION</title><link>http://www.blogjava.net/wangbing/archive/2009/05/21/271968.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 21 May 2009 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/05/21/271968.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/271968.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/05/21/271968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/271968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/271968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->drop&#160;package&#160;COMMON_FUNCTION//*=================================================...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangbing/archive/2009/05/21/271968.html'>阅读全文</a><img src ="http://www.blogjava.net/wangbing/aggbug/271968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-05-21 14:35 <a href="http://www.blogjava.net/wangbing/archive/2009/05/21/271968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发一个很久以前的oracle包代码——CUT_COUNTQUOTA</title><link>http://www.blogjava.net/wangbing/archive/2009/05/21/271966.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 21 May 2009 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/05/21/271966.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/271966.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/05/21/271966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/271966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/271966.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->drop&#160;package&#160;CUT_COUNTQUOTA//*==================================================...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangbing/archive/2009/05/21/271966.html'>阅读全文</a><img src ="http://www.blogjava.net/wangbing/aggbug/271966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-05-21 14:30 <a href="http://www.blogjava.net/wangbing/archive/2009/05/21/271966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ODI的一点整理</title><link>http://www.blogjava.net/wangbing/archive/2009/05/21/271964.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 21 May 2009 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2009/05/21/271964.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/271964.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2009/05/21/271964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/271964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/271964.html</trackback:ping><description><![CDATA[最近一直没有文章，今天发一点在工作中遇到的问题。主要是oracle的etl产品odi的相关问题，在OTN论坛上面很快找到了答案。下面抄录论坛里面的发帖和回复，减少我打字的数量。<br />
<br />
<span style="font-family: tahoma; font-size: 11px; ">Hi,<br />
<br />
I have two tables with same structure. Now I want to union the data from these two table and load the result in target table. How can I achieve this functionality in ODI? In formatica this can be done using UNION Transformation but I don't know about ODI.&#160;<br />
Please help.<br />
<br />
Thanks,<br />
Monika<br />
<br />
<br />
Hi Monika,<br />
<br />
Union transformation cannot be done by Interface in ODI.<br />
<br />
There are three option in ODI to achieve your task<br />
<br />
1) you need to create two interfaces like int1 and int2<br />
where int1 will transfer the data from tab1(source) to target table and int2 will transfer the tab2(source) to target table.<br />
<br />
2) In second option, create a view for the union of tab1 and tab2 and use that view as source in the interafce to tranfer the union data to target. In this method we can achive this by single interface.<br />
<br />
3) create the ODI procedure with a sql query of&#160;<strong>insert into target_table (select * from tab1 union select * from tab2)</strong>.<br />
<br />
Thanks,<br />
Madha.</span>
<img src ="http://www.blogjava.net/wangbing/aggbug/271964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2009-05-21 14:25 <a href="http://www.blogjava.net/wangbing/archive/2009/05/21/271964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>