<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-429266944698350812</id><updated>2011-12-08T06:07:40.378-08:00</updated><category term='表'/><category term='worklist'/><category term='imp'/><category term='Blob'/><category term='customize homepage'/><category term='Cache'/><category term='PCTFREE'/><category term='tkprof'/><category term='Gather Schema Statistics'/><category term='Expert one on one Oracle'/><category term='CLUSTER'/><category term='redo'/><category term='qarun'/><category term='嵌套表'/><category term='ping'/><category term='Default'/><category term='Control'/><category term='采购选项'/><category term='SET TRANSACTION'/><category term='V$OPEN_CURSOR'/><category term='索引'/><category term='function secuiry'/><category term='discoverer 4i'/><category term='Row Source Operation'/><category term='XML Publisher'/><category term='Preference SSWA'/><category term='远程桌面控制'/><category term='Oracle'/><category term='delayed block cleanout'/><category term='Trace'/><category term='可执行'/><category term='SQL*PLUS'/><category term='物化视图'/><category term='定时运行'/><category term='windows XP'/><category term='FREELIST'/><category term='PCTUSED'/><category term='b树索引'/><category term='excel'/><category term='RPCRT4.dll'/><category term='Sheet'/><category term='concurrent program'/><category term='discoverer viewer'/><category term='Financials Options'/><category term='demension'/><category term='OVERFLOW'/><category term='Function'/><category term='ORA-01555'/><category term='Supplier Item Catalog Window'/><category term='compuware'/><category term='V$SESSION_CACHED_CURSOR'/><category term='fnd_stats'/><category term='sun-web.xml'/><category term='工作簿'/><category term='HWM'/><category term='Purchasing Workflow'/><category term='分析'/><category term='任务'/><category term='ebs'/><category term='Invalid Object'/><category term='临时表'/><category term='dbms_stats'/><category term='HASH CLUSTER'/><category term='transaction'/><category term='undo'/><category term='IOT'/><category term='Notification Routing Rules'/><category term='DOCTYPE'/><category term='block cleanout'/><category term='iplanet'/><category term='事务'/><category term='zero'/><category term='exp'/><category term='query rewrite'/><category term='乱码'/><category term='fast commit'/><category term='并发程序'/><category term='Spfile'/><category term='行迁移'/><category term='shutdown'/><category term='SET_CONTEXT'/><category term='IP安全策略'/><category term='Jinitiator'/><category term='Internal Server Error'/><category term='costumer top'/><category term='VNC'/><category term='无线局域网'/><category term='ORA- 01034'/><category term='对象表'/><category term='CMMI'/><title type='text'>Gooply</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6044483940931609167</id><published>2008-10-22T08:21:00.000-07:00</published><updated>2008-10-22T08:47:29.716-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMMI'/><title type='text'>CMMI 预审</title><content type='html'>参加了CMMI的预审，记录部分感受。&lt;br /&gt;&lt;br /&gt;二级，关心需求的监控，变更管理，供应商的管理，配置管理，对设计和开发阶段并不关注。&lt;br /&gt;需求部分关注如下：需求怎样传递到项目经理，以及怎样确定立项。重点要强调，和客户进行了需求调研，并形成了BA分析报告。而且BA报告进行了评审，评审通过才立项。参加评审人员包括业务部门代表，经理，PM，PMO，IT经理等。在BA分析报告，包含相关的基本的估算，级别的估算。&lt;br /&gt;&lt;br /&gt;根据BA制定概要设计，需求跟踪矩阵。需求矩阵不仅仅只和需求相关，还和功能以及测试用例相关。&lt;br /&gt;&lt;br /&gt;制定WBS。首先对项目进行更具体的估算，子任务的划分，包括工作量，工期，资源成本，然后再确定WBS。&lt;br /&gt;&lt;br /&gt;怎样对项目进度进行监控？WBS有项目各任务完成时间，可以监控。然后项目Charter中也有各阶段开始和完成时间。&lt;br /&gt;&lt;br /&gt;变更管理。需求变更的流程，评审，变更跟踪单。变更分析包括变更的影响，时间，成本，以及需要更改的文档等等。&lt;br /&gt;&lt;br /&gt;配置管理。VSS相关功能，基线的种类。怎样比较版本和找到正确的版本。随来监控配置。&lt;br /&gt;&lt;br /&gt;QA，项目的QA人员。QA提供什么（QA检查清单，培训）。&lt;br /&gt;&lt;br /&gt;供应商的管理，供应商的QA，以及怎样对供应商进行监控。&lt;br /&gt;&lt;br /&gt;.....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6044483940931609167?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6044483940931609167/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6044483940931609167' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6044483940931609167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6044483940931609167'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2008/10/cmmi.html' title='CMMI 预审'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-4791897975555030401</id><published>2008-03-17T09:12:00.000-07:00</published><updated>2008-03-17T09:15:16.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Preference SSWA'/><category scheme='http://www.blogger.com/atom/ns#' term='customize homepage'/><category scheme='http://www.blogger.com/atom/ns#' term='worklist'/><title type='text'>登录默认页面看到notifications提示</title><content type='html'>Home FAQ  Note:207541.1&lt;br /&gt;&lt;br /&gt; QUESTIONS &amp;amp; ANSWERS-------------------&lt;br /&gt;1. How can I create a notifications worklist in main menu?&lt;br /&gt;Answer------&lt;br /&gt; . Add Preferences responsibility to your user. &lt;br /&gt;. Click Create and Modify Pages icon at the top of your menu page. &lt;br /&gt;. Click New. &lt;br /&gt;. New Page Name = Worklist. &lt;br /&gt;. Apply.  &lt;br /&gt; . Select Worklist: single click on Worklist. &lt;br /&gt;. Click edit. &lt;br /&gt;. Choose Edit Content. &lt;br /&gt;. Select Worklist. &lt;br /&gt;. Single click on the "&gt;" icon.  . Done.&lt;br /&gt;&lt;br /&gt;如果不能看到plus-in，需要增加职责。&lt;br /&gt;&lt;br /&gt; Problem Description------------------- &lt;br /&gt;11i when trying to customize homepage and clicking on edit content no available plug-in to choose from.&lt;br /&gt;Navigation -&gt; Sign On  -&gt; On the Main Menu page&lt;br /&gt;Click on Create and Modify icon  -&gt;&lt;br /&gt;Create a new page and click on edit button -&gt;&lt;br /&gt;Press the edit content button -&gt;&lt;br /&gt;No available plug-in to select from  Solution Description--------------------&lt;br /&gt;&lt;br /&gt;In System Administrator Responsibility add the Preference Responsibility Navigation -&gt; System Administrator Responsibility -&gt; Security / User / Define -&gt; Query User and Add the 'Preference' Responsibiltiy&lt;br /&gt;&lt;br /&gt; 如果没有'Preference'职责，那就是'Preference SSWA'职责。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-4791897975555030401?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/4791897975555030401/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=4791897975555030401' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4791897975555030401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4791897975555030401'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2008/03/notifications.html' title='登录默认页面看到notifications提示'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-2289548184412907690</id><published>2008-03-07T19:52:00.000-08:00</published><updated>2008-03-07T19:58:06.336-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Invalid Object'/><title type='text'>编译失效对象</title><content type='html'>正在尝试XML Gateway，出现问题，做了一个debug，发现问题的大概位置，然后在系统标准的package中ECX_UTILS中增加了几行语句，然后编译到数据库。&lt;br /&gt;&lt;br /&gt;发现无效的对象又多了一个，集中在ECX开头的几个Package，然后通过TOAD，查看系统中APPS这个Schema下的失效对象，将EXC开头的Package选中，重新编译。刷新后，失效对象越来越多。&lt;br /&gt;&lt;br /&gt;最后没有办法，只有请DBA在Unix端，通过ADAdmin来运行编译命令，解决问题。&lt;br /&gt;&lt;br /&gt;但是为什么会出现开始失效对象越来越多的情况呢？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-2289548184412907690?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/2289548184412907690/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=2289548184412907690' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2289548184412907690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2289548184412907690'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2008/03/blog-post.html' title='编译失效对象'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-3468984359224240796</id><published>2008-01-29T09:25:00.000-08:00</published><updated>2008-11-13T01:57:49.637-08:00</updated><title type='text'>怎样限制并发请求只能在指定时间运行?</title><content type='html'>怎样限制并发请求只能在指定时间运行?&lt;br /&gt;&lt;br /&gt;定义新的并发管理器，通过“Specialization Rules”将需要限定运行时间段的并发请求添加到新定义的并发管理器中。再定义work shift，定义并发请求的运行时间段，并将这个work shift分配给新定义的并发管理器。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;步骤（没有图片，arsenefang已发）：&lt;br /&gt;1） 定义work shift。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/R59kbEV28AI/AAAAAAAAAVs/ZN3m2bmRpn0/s1600-h/work+shifts.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5160954114174545922" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/R59kbEV28AI/AAAAAAAAAVs/ZN3m2bmRpn0/s400/work+shifts.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2） 定义并发请求管理器。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/R59kbUV28BI/AAAAAAAAAV0/k_ZvzObm7PU/s1600-h/managers.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5160954118469513234" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/R59kbUV28BI/AAAAAAAAAV0/k_ZvzObm7PU/s400/managers.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3） 通过Specialization Rules将需要限制将需要限定运行时间段的并发请求添加到新定义的并发管理器中。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/R59kbkV28CI/AAAAAAAAAV8/SYv6Nh69DMQ/s1600-h/rules.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5160954122764480546" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/R59kbkV28CI/AAAAAAAAAV8/SYv6Nh69DMQ/s400/rules.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4） 将work shift分配给并发管理器。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/R59kcEV28DI/AAAAAAAAAWE/A1J4f61C9fs/s1600-h/assing+work+shift.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5160954131354415154" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/R59kcEV28DI/AAAAAAAAAWE/A1J4f61C9fs/s400/assing+work+shift.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;其他测试：&lt;br /&gt;1） 对于新定义的并发请求，并不会自动分配给某一个并发管理器，需要手工添加。&lt;br /&gt;2） 如果已经将一个并发程序分配到某一个并发管理器A，但是实际上却在另一个并发管理器B中运行，需要检查另一个并发请求管理器中是否也包括（include）了这个并发程序。如果不希望并发程序在B中运行，可以在B通过exclude这个并发程序。&lt;br /&gt;&lt;br /&gt;想知道并发程序究竟在哪些并发管理器中？&lt;br /&gt;通过界面查询比较麻烦，不能根据并发程序的名称进行查询，如果需要，可以通过如下SQL来完成。&lt;br /&gt;&lt;br /&gt;SELECT a.type_id, a.queue_application_id, a.concurrent_queue_id, a.type_code,&lt;br /&gt;a.type_id, a.include_flag, d.user_concurrent_program_name,&lt;br /&gt;c.description, c.user_concurrent_queue_name&lt;br /&gt;FROM applsys.fnd_concurrent_programs_tl d,&lt;br /&gt;applsys.fnd_concurrent_queue_content a,&lt;br /&gt;applsys.fnd_concurrent_programs b,&lt;br /&gt;fnd_concurrent_queues_vl c&lt;br /&gt;WHERE (a.type_id = b.concurrent_program_id)&lt;br /&gt;AND (a.type_application_id = b.application_id)&lt;br /&gt;AND (b.application_id = d.application_id)&lt;br /&gt;AND (b.concurrent_program_id = d.concurrent_program_id)&lt;br /&gt;AND a.concurrent_queue_id = c.concurrent_queue_id&lt;br /&gt;AND d.user_concurrent_program_name = Your concurrent program name&lt;br /&gt;&lt;br /&gt;3） 对于有两个并发管理器都包括同一个并发程序，这个并发程序究竟在哪个并发管理器中运行，比较随机。可能，哪个free，哪个work。这和设定process的个数，sleep的时间相关，还请有研究的同志多多发言。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-3468984359224240796?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/3468984359224240796/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=3468984359224240796' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3468984359224240796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3468984359224240796'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2008/01/blog-post.html' title='怎样限制并发请求只能在指定时间运行?'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LVEyZaW7hys/R59kbEV28AI/AAAAAAAAAVs/ZN3m2bmRpn0/s72-c/work+shifts.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-1530261204717955085</id><published>2008-01-15T09:21:00.000-08:00</published><updated>2008-01-15T09:22:07.000-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qarun'/><title type='text'>form的label变更影响了qarun的脚本</title><content type='html'>一直运行的qarun脚本突然不能收集其中几个事务的性能数据了，搞了老半天才发现ERP升级之后，其中的某一个form的label名字更改了，从QUERY_MANAGER_×××变成了QM_×××。所以，脚本怎么也不能定位对应的field，出现错误，脚本便退出了。&lt;br /&gt;&lt;br /&gt;是个小问题，开始还以为是预置文件的问题，因为还出现FND: Developer Mode未设置的错误，一直怀疑这个来着。&lt;br /&gt;&lt;br /&gt;搞定手工。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-1530261204717955085?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/1530261204717955085/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=1530261204717955085' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1530261204717955085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1530261204717955085'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2008/01/formlabelqarun.html' title='form的label变更影响了qarun的脚本'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-3911848401418623715</id><published>2007-12-13T07:46:00.000-08:00</published><updated>2008-11-13T01:57:49.768-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sun-web.xml'/><category scheme='http://www.blogger.com/atom/ns#' term='iplanet'/><category scheme='http://www.blogger.com/atom/ns#' term='DOCTYPE'/><title type='text'>sun-web.xml之痛</title><content type='html'>去年开发的系统，突然出现了问题，问了原来的开发的成员，说时间太久忘了，只要找我，其实我也差不多忘了。&lt;br /&gt;&lt;br /&gt;错误主要是在显示系统中详细信息和保存项目的时候，很快就定位是iplanet端数据库连接池配置问题。&lt;br /&gt;&lt;br /&gt;于是，让DBA检查，将密码重新设置，没有成功。&lt;br /&gt;让DBA发过来日志有如下错误，可能是sun-web.xml文件有问题，是不是UNIX下字符出现错误，将我本机的这个文件发过去给DBA，没有成功。&lt;br /&gt;&lt;br /&gt;&lt;em&gt;WEB0120: XML error parsing deployment descriptor [/~~~~~~~~/wwwroot/WEB-INF/sun-web.xml]&lt;br /&gt;Failed to create the XML-DOM Document. Check your XML to make sure it is correct.&lt;br /&gt;java.net.ConnectException: 连接超时 at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3376) at org.apache.crimson.parser.Parser2.externalParameterEntity(Parser2.java:3064) at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1347) at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:656)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;最后，重新考虑这个日志的时候，忽略了“java.net.ConnectException: 连接超时 ” 这个错误。怎么会网络访问，重新检查sun-web.xml，发现DOCTYPE节点，其声明的dtd文件是指向&lt;a href="http://www.sun.com/"&gt;http://www.sun.com/&lt;/a&gt;的，可能这就是问题所在。以前从来没有注意这个问题，对于DOCTYPE，PUBLIC指定DTD文件是在系统之外，需远程访问；如果是SYSTEM，就在本地找寻dtd文件。虽然在我机器上将网络断开，没有重现这个错误，但是比较肯定系统就是遇到这个问题。将这个节点去掉，将sun-web.xml发给系统管理员，果然成功了！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd"&amp;gt&lt;br /&gt;&lt;br /&gt;另外，将系统迁移到iplanet的时候，磕磕碰碰，花费了以整体的时间，记录下来以备忘。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1）Iplanet的版本。&lt;/strong&gt;&lt;br /&gt;从sun的官方网站下载要注册，我原来有帐户但是忘了，于是从别的地方下载了一个。本来是要6.1版本的，下来发现是6.0的，这就是后面很多错误的根源。&lt;br /&gt;部署完成之后，访问系统的时候，总是出现如下错误：&lt;br /&gt;“"No WebApplicationContext found: no ContextLoaderListener registered"”&lt;br /&gt;在web.xml中增加如下内容，可以Iplanet可以成功启动。&lt;br /&gt;&lt;br /&gt;&amp;ltservlet&amp;gt&lt;br /&gt; &amp;ltservlet-name&amp;gtcontext&amp;lt/servlet-name&amp;gt&lt;br /&gt;   &amp;ltservlet-class&amp;gt&lt;br /&gt;   org.springframework.web.context.ContextLoaderServlet&lt;br /&gt;   &amp;lt/servlet-class&amp;gt&lt;br /&gt; &amp;ltload-on-startup&amp;gt1&amp;lt/load-on-startup&amp;gt&lt;br /&gt;&amp;lt/servlet&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;但是访问系统的时候，出现Servlet 2.2中不支持setCharacterEncoding() 错误。乖乖，原来IPlanet只支持Servlet 2.2，而我需要的是2.3版本。于是从Sun上下载了6.1颁布，不需要在web.xml增加上述那段，部署成功。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2）数据库连接池的建立&lt;/strong&gt;&lt;br /&gt;在Iplanet端建立了连接池，出现总是找不到驱动程序的错误，而实际上classes2.jar已经在WEB-INF/lib路径下。最后在JVM Path Settings中将JDBC的路径直接出入，解决这个问题。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/R2FUTKU9sEI/AAAAAAAAAUk/fWq1sZuLbkw/s1600-h/jdbcdirver.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5143484937600348226" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/R2FUTKU9sEI/AAAAAAAAAUk/fWq1sZuLbkw/s400/jdbcdirver.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3）Iplanet程序的部署。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;首先是将Web程序打包成war。但是Iplanet部署war文件的时候有大小限制，可以先不降lib目录打包，待部署完成再拷贝过去。&lt;br /&gt;部署应用。其对应的路径为：&lt;br /&gt;Administration Server &gt; MyServer &gt; vsclass1 &gt; WebApplication。&lt;br /&gt;其中MyServer是系统默认建立的服务器，vsclass1是系统默认建立的虚拟class。可以同时管理n个服务器，一个服务器上又可以建立n个vsclass1，一个vsclass可以对应多个WebApplication。所以，从左到右都是1:n的关系。为什么会有vsclass1的概念呢？ 这是因为对于某些Web Application，其配置可能绝大部分相同，所以可以统一在vsclass层次定义就可，这些Web Applications共享这些设置。这个设计应该是为哪些提供hosting服务的机构设定的吧。但是看看现在hosting，绝大部分都在使用LAMP。&lt;br /&gt;然后就是在vsclass层建立，数据库链接池和JDBC的Resource。&lt;br /&gt;最后别忘了将lib拷贝到Web Application的WEB-INF目录下。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;总结，&lt;/strong&gt;&lt;br /&gt;1) 最初发现问题的时候，虽然大概定位，但是没有再深究问题的根本，再加上时差的问题，问题解决效率不高。&lt;br /&gt;2) 没有模拟服务器环境，而开始只在Tomcat上测试，而sun-web.xml在Tomcat环境下是不需要的，对问题的重现带来困难。&lt;br /&gt;3) 在定位sun-web.xml文件的错误之后，没有静下心来研究文档结构，而是意味怀疑字符问题，耽误解决问题的时间。&lt;br /&gt;&lt;br /&gt;Any way，问题总算解决了，休息一下，休息一下。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-3911848401418623715?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/3911848401418623715/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=3911848401418623715' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3911848401418623715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3911848401418623715'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/12/sun-webxml.html' title='sun-web.xml之痛'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LVEyZaW7hys/R2FUTKU9sEI/AAAAAAAAAUk/fWq1sZuLbkw/s72-c/jdbcdirver.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-3719357786270253713</id><published>2007-12-04T07:36:00.000-08:00</published><updated>2007-12-04T07:46:34.147-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compuware'/><category scheme='http://www.blogger.com/atom/ns#' term='任务'/><category scheme='http://www.blogger.com/atom/ns#' term='定时运行'/><title type='text'>拷贝定时执行的任务</title><content type='html'>测试机器上的定期运行的任务停止运行已经有快两个星期，最后一次运行应该是感恩节前了。主要的问题是通过执行程序“Start ClientVantage.exe”再也不能生成计划任务 “Standard Transactions” 了。重新启动，OS升级，杀掉系统中的相关进程都不能。虽然是测试机器，但是数据有时候还是有一定参考意义，今天暂时找到一个方法。&lt;br /&gt;&lt;br /&gt;1. 从别的机器上将Windows/tasks下的“Standard Transactions”任务拷贝到测试机器的Windows/tasks目录下。&lt;br /&gt;2. 执行的时候应该会出现“Can not start”的错误，那么就编辑这个任务，将开始时间更改一下，系统会提示让你输入这个操作系统的密码，输入完成确定之后，任务就可以正常执行了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;这只是一个暂时的方法，对于每天重新启动，还是不能应付，再想办法。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-3719357786270253713?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/3719357786270253713/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=3719357786270253713' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3719357786270253713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3719357786270253713'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/12/blog-post.html' title='拷贝定时执行的任务'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-1827695433557684210</id><published>2007-11-06T07:43:00.000-08:00</published><updated>2008-11-13T01:57:49.921-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Supplier Item Catalog Window'/><category scheme='http://www.blogger.com/atom/ns#' term='function secuiry'/><title type='text'>怎样disable掉Supplier Item Catalog Window中的标签页</title><content type='html'>怎样disable掉Supplier Item Catalog Window中的标签页&lt;br /&gt;在采购模块中，如果从菜单Supplier Item Catalog进入，输入条件，点击Find，就会进入如下的界面。在这个界面中，如果我只想要用户只能够看到“Requisition Templates”，应该怎样设置呢？ 手册有这么一段，但是没有说具体怎么做：&lt;br /&gt;&lt;br /&gt;========================&lt;br /&gt;There are four tabbed regions in the upper screen of this folder window,but Function Security can be used to determine whether a user will beable to see all of them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/RzCMcMOyT9I/AAAAAAAAATU/ro92vX95Hcg/s1600-h/192482055.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5129754391522463698" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RzCMcMOyT9I/AAAAAAAAATU/ro92vX95Hcg/s400/192482055.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Metalink的一文：&lt;br /&gt;=============================&lt;br /&gt;Subject: How To Restrict Access To Specific Form's Tab In Oracle Applications 11i?&lt;br /&gt;Doc ID: Note:189420.1 Type: HOWTO&lt;br /&gt;Last Revision Date: 05-AUG-2003 Status: PUBLISHED&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Goal: How to restrict access to specific form's tab in Oracle Applications 11i?&lt;br /&gt;Fact: Oracle Application Object Library 11.5&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fix:&lt;br /&gt;&lt;br /&gt;Every form's tab represents a function. Function security is controlled by Responsibilities. A system administrator should exclude the form's tab Corresponding function from the menu structure assigned to a responsibility, users belong to this responsibility will not be able to access this form's tab anymore. As an example, the following steps will disable the Costing tab in Orgination Items form for some users:&lt;br /&gt;1. Create a new responsibility and attach INV_NAVIGATE menu to it.&lt;br /&gt;2. Assign the new responsibility to users that will not access the above tab.&lt;br /&gt;3. From System Administrator--&gt;menus--&gt;query INV_NAVIGATE and display the menu tree, drill down items --&gt;Organization Items--&gt;get the display name&lt;br /&gt;of the function corresponding to the Costing tab 'Items:Costing Group'.&lt;br /&gt;4. System Administrator--&gt;Responsibilities--&gt;Define, query the new responsibility and use the Menu Exclusions tab to exclude the function in step 3.&lt;br /&gt;5. Logon to Applications using the new responsibility and navigate to&lt;br /&gt;Organization Items form, the Costing tab is disabled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-1827695433557684210?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/1827695433557684210/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=1827695433557684210' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1827695433557684210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1827695433557684210'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/11/disablesupplier-item-catalog-window.html' title='怎样disable掉Supplier Item Catalog Window中的标签页'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LVEyZaW7hys/RzCMcMOyT9I/AAAAAAAAATU/ro92vX95Hcg/s72-c/192482055.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-366575825752689607</id><published>2007-10-25T14:00:00.000-07:00</published><updated>2008-11-13T01:57:51.890-08:00</updated><title type='text'>采购 -&gt; AutoCreate</title><content type='html'>&lt;strong&gt;Action：&lt;/strong&gt;&lt;br /&gt;可以将请购单新增文档或则添加到已存在的文档。有两种方式，一种是Create，一种是Add To。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RyPP1MOyTzI/AAAAAAAAASE/DofknF8aLVE/s1600-h/b1.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5126169313601015602" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RyPP1MOyTzI/AAAAAAAAASE/DofknF8aLVE/s400/b1.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Add To&lt;br /&gt;将新的请购单创建到采购文档T_ClosePoint1，新增加的采购行序号2。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/RyPP18OyT3I/AAAAAAAAASk/bUujamUQPP0/s1600-h/b5.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5126169326485917554" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RyPP18OyT3I/AAAAAAAAASk/bUujamUQPP0/s400/b5.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;是否可以将请购单Add To已经存在的采购单，必须依据采购文档的安全设置。如果Access Level为View Only。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/RyPP1cOyT0I/AAAAAAAAASM/_22pvlVZPCM/s1600-h/b2.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5126169317895982914" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RyPP1cOyT0I/AAAAAAAAASM/_22pvlVZPCM/s400/b2.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;那么当点击Manual按钮进行创建的时候，系统提示你选择一个已经存在的文档。如果当前用户原来没有创建采购订单，系统将找不对应的采购订单（因为采购文档的安全设置）&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/RyPP1cOyT1I/AAAAAAAAASU/eVNUFKSXVho/s1600-h/b3.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5126169317895982930" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RyPP1cOyT1I/AAAAAAAAASU/eVNUFKSXVho/s400/b3.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果采购文档的安全设置为可以修改。那么这个时候再Add To，可以找到你需要将请购单提交进去的采购文档。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RyPP1sOyT2I/AAAAAAAAASc/hWt0WuqO18s/s1600-h/b4.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5126169322190950242" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RyPP1sOyT2I/AAAAAAAAASc/hWt0WuqO18s/s400/b4.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Document Type：&lt;/strong&gt;&lt;br /&gt;已经审批的请购单，可以创建如下4种。未审批的请购单只能创建RFQ。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RyEEiMOyTqI/AAAAAAAAAQ8/wegcbb4lj1A/s1600-h/b6.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382836369641122" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RyEEiMOyTqI/AAAAAAAAAQ8/wegcbb4lj1A/s400/b6.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果针对为审批未通过的请购单创建Standard PO/Planned PO/Blanket Release，那么将会提示如下提示（Manual和Auto略有不同）。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEEjsOyTrI/AAAAAAAAARE/U9A2Iy4n7To/s1600-h/b7.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382862139444914" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEEjsOyTrI/AAAAAAAAARE/U9A2Iy4n7To/s400/b7.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Grouping：&lt;/strong&gt;&lt;br /&gt;如果是分组方式Default，在创建采购订单行的时候，将会根据请购单行的Item，Item版本，行类型，单位等进行分组。如果是Requisition，那么每一个请购行将会对应一个采购行。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEEjsOyTsI/AAAAAAAAARM/Q0aaTLribLA/s1600-h/b8.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382862139444930" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEEjsOyTsI/AAAAAAAAARM/Q0aaTLribLA/s400/b8.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;针对如下两个请购行。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/RyEEj8OyTtI/AAAAAAAAARU/grw9JOXWJAs/s1600-h/b9.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382866434412242" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RyEEj8OyTtI/AAAAAAAAARU/grw9JOXWJAs/s400/b9.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果Grouping = Default，那么创建采购单的时候，将会分组到一个采购订单行上，采购数量为两个请购数量之和。也就是将两者合并了。&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEESsOyTkI/AAAAAAAAAQM/HG1BAxfy9j4/s1600-h/b10.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382570081668674" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEESsOyTkI/AAAAAAAAAQM/HG1BAxfy9j4/s400/b10.PNG" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果Grouping = Requisition，一个采购单行就会对应一个请购单行。上述的两个请购单行，创建了两个采购单行。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RyPTQMOyT6I/AAAAAAAAAS8/L-BaCn0h4G4/s1600-h/b33.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5126173075992367010" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RyPTQMOyT6I/AAAAAAAAAS8/L-BaCn0h4G4/s400/b33.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RyEETMOyTlI/AAAAAAAAAQU/HhQoFegGY_8/s1600-h/b11.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382578671603282" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RyEETMOyTlI/AAAAAAAAAQU/HhQoFegGY_8/s400/b11.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Return Requistion：&lt;br /&gt;&lt;/strong&gt;Path: AutoCreate（M）-&gt; Tools （M）-&gt;Return Requisition（M）&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RyEETMOyTmI/AAAAAAAAAQc/Us1A6OlUeYE/s1600-h/b12.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382578671603298" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RyEETMOyTmI/AAAAAAAAAQc/Us1A6OlUeYE/s400/b12.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Modify：&lt;/strong&gt;&lt;br /&gt;AutoCreate（M）-&gt; Tools （M）-&gt;Modify（M）&lt;br /&gt;将原来的一行分成两行。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/RyEETcOyTnI/AAAAAAAAAQk/ixExO287w6E/s1600-h/b13.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382582966570610" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RyEETcOyTnI/AAAAAAAAAQk/ixExO287w6E/s400/b13.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;完成之后，在AutoCreate窗口只能看到新创建的两行。&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEETsOyToI/AAAAAAAAAQs/12tHqU5clbc/s1600-h/b14.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125382587261537922" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RyEETsOyToI/AAAAAAAAAQs/12tHqU5clbc/s400/b14.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;但是从Requisition Lines Summary可以看到新创建的两行，和原来存在的一行。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RyPSbMOyT4I/AAAAAAAAASs/zPDytRjILEQ/s1600-h/b15.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5126172165459300226" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RyPSbMOyT4I/AAAAAAAAASs/zPDytRjILEQ/s400/b15.PNG" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-366575825752689607?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/366575825752689607/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=366575825752689607' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/366575825752689607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/366575825752689607'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/blog-post_25.html' title='采购 -&gt; AutoCreate'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LVEyZaW7hys/RyPP1MOyTzI/AAAAAAAAASE/DofknF8aLVE/s72-c/b1.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-2584341783836400026</id><published>2007-10-24T14:42:00.000-07:00</published><updated>2008-11-13T01:57:52.717-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Purchasing Workflow'/><category scheme='http://www.blogger.com/atom/ns#' term='Notification Routing Rules'/><title type='text'>采购 -&gt; Notification Routing Rules</title><content type='html'>如果审批者由于出差不能及时审批订单，这时候采购员叫天天不应，叫地地不灵。那就叫系统管理员。&lt;br /&gt;一种方法通过“Mass Forwarding Documents”功能，将提交给某一个审批者的订单，批量转发给另外的审批者。&lt;br /&gt;&lt;br /&gt;这里讲述的是另外一种方法——Notification Routing Rules。这个功能按钮存在Notification页面上。主要功能就是创建一个Notification路由的规则，对于接收Notification，采取转发，重新分配，或者审批等。如果是系统管理员，那么可以针对任何用户接收的Notification可以创建规则。如果是普通用户，那么只能针对自己的接收的Notification创建规则。&lt;br /&gt;假定，现在你要出差，对于出差这段时间，对所有提交给你审批的采购订单都需要转发到另外一个审批者代劳。那就，开始设置：&lt;br /&gt;&lt;br /&gt;1. 点击Notification Summary打开Notification页面，点击页面上的Routing Rules按钮。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rx-9FQfptSI/AAAAAAAAAPc/CGfX973-BCk/s1600-h/a1.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125022798995633442" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rx-9FQfptSI/AAAAAAAAAPc/CGfX973-BCk/s400/a1.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Routing Rules列表中，点击“Create Rule”来创建一个新的Rule。&lt;br /&gt;在Notification的窗口，有创建Create Notification Rule的按钮。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9FgfptTI/AAAAAAAAAPk/ZSkNppf_Izw/s1600-h/a2.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125022803290600754" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9FgfptTI/AAAAAAAAAPk/ZSkNppf_Izw/s400/a2.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 创建Rule的第一步，选择Item Type，可以选择PO Approval或者Requisition，或者两者。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9FgfptUI/AAAAAAAAAPs/xAq9jZ-SVcE/s1600-h/a3.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125022803290600770" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9FgfptUI/AAAAAAAAAPs/xAq9jZ-SVcE/s400/a3.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. 创建Rule的第二步，设置Notification的格式。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9FgfptVI/AAAAAAAAAP0/sHYIqFC0p_g/s1600-h/a4.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125022803290600786" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9FgfptVI/AAAAAAAAAP0/sHYIqFC0p_g/s400/a4.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. 创建Rule的第三步，设置Rule的有效日期，收到Notification后采取的动作。&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rx-9GAfptWI/AAAAAAAAAP8/r4AOI2YhTxo/s1600-h/a5.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125022811880535394" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rx-9GAfptWI/AAAAAAAAAP8/r4AOI2YhTxo/s400/a5.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6. 点击Submit。收拾东西出差吧，出自己的差，让别人去烦审批的事情吧。&lt;br /&gt;&lt;br /&gt;7. 其他，测试过程中，不要将Forward To的用户设置为提交审批请求的Buyer，因为在文档类型中设置了Buyer不能审批，最后在系统中出现大量的提示信息——invalid forward-to person，界面也在提交审批界面Pending住，最后只要重新来过。 &lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9LgfptXI/AAAAAAAAAQE/o4K6bow6mlo/s1600-h/a6.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5125022906369815922" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rx-9LgfptXI/AAAAAAAAAQE/o4K6bow6mlo/s400/a6.PNG" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-2584341783836400026?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/2584341783836400026/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=2584341783836400026' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2584341783836400026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2584341783836400026'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/notification-routing-rules.html' title='采购 -&gt; Notification Routing Rules'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LVEyZaW7hys/Rx-9FQfptSI/AAAAAAAAAPc/CGfX973-BCk/s72-c/a1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6509928286276124095</id><published>2007-10-23T13:50:00.000-07:00</published><updated>2007-10-23T13:52:45.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Financials Options'/><title type='text'>采购设置 ——&gt; 3 财务选项</title><content type='html'>还是没有图片&lt;br /&gt;&lt;br /&gt;Supplier – Entry&lt;br /&gt;&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M)&lt;br /&gt;是针对Supplier定义的相关设置。对于RFQ Only Site，Hold Unmatched Invoiced，Invoice Match Option等选项，这里的设置会默认到供应商以及供应商地点上对应选项值的设定。Supplier Number，是设置供应商编码的规则。&lt;br /&gt;&lt;br /&gt;a.      RFQ Only Site&lt;br /&gt;如果Disable这个选项。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Supplier Entry (T)&lt;br /&gt;&lt;br /&gt;对于新创建的供应商地点，这个选项默认也是Disable的。&lt;br /&gt;Path：Supplier Base (M) –&gt; Suppliers (M) -&gt; Sites (B)&lt;br /&gt;&lt;br /&gt;如果Enable这个选项。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Supplier Entry (T)&lt;br /&gt;&lt;br /&gt;对于新创建的供应商地点，这个选项默认也是Enable的。&lt;br /&gt;Path：Supplier Base (M) –&gt; Suppliers (M) -&gt; Sites (B)&lt;br /&gt;&lt;br /&gt;如果供应商地点一旦被设置为RFQ Only，那么创建采购订单的时候将不能从Site中选择这个供应商地点。&lt;br /&gt;Path：Purchase Orders（M） -&gt; Purchase Orders（M）&lt;br /&gt;&lt;br /&gt;b.      Hold Unmatched Invoiced&lt;br /&gt;&lt;br /&gt;如果Enable这个选项。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Supplier Entry (T)&lt;br /&gt;&lt;br /&gt;对于新创建的供应商以及地点，这个选项默认也是Enable的。&lt;br /&gt;Path：Supplier Base (M) –&gt; Suppliers (M) -&gt; Sites (B)&lt;br /&gt;&lt;br /&gt;c.       Invoice Match Option&lt;br /&gt;&lt;br /&gt;如果选择Purchase Order。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Supplier Entry (T)&lt;br /&gt;&lt;br /&gt;对于新创建的供应商以及地点，这个选项默认也是Purchase Order的。&lt;br /&gt;Path：Supplier Base (M) –&gt; Suppliers (M)&lt;br /&gt;&lt;br /&gt;d.      Supplier Number&lt;br /&gt;供应商编码的编码规则。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Supplier Entry (T)&lt;br /&gt;&lt;br /&gt;e.      Supplier – Payables&lt;br /&gt;&lt;br /&gt;默认供应商定义窗口的Payment页上相关域的值。设置。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Supplier - Payables (T)&lt;br /&gt;&lt;br /&gt;从供应商Payment页检查。&lt;br /&gt;Path：Supplier Base (M) –&gt; Suppliers (M) -&gt; Payment （T）&lt;br /&gt;&lt;br /&gt;f.        Supplier – Purchasing&lt;br /&gt;&lt;br /&gt;默认供应商定义窗口的Purchasing页上相关域的值。设置。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Supplier - Purchasing (T)&lt;br /&gt;&lt;br /&gt;默认值被带入供应商定义窗口。&lt;br /&gt;Path：Supplier Base (M) –&gt; Suppliers (M)&lt;br /&gt;&lt;br /&gt;g.      Inventory Organization&lt;br /&gt;&lt;br /&gt;创建主组织（000）创建新的Item，不将其分配给其他组织。将Inventory Organization更改为C10（非主组织）&lt;br /&gt;&lt;br /&gt;创建采购订单，可以看到系统不能找到对应的采购编码。&lt;br /&gt;Path：Purchase Orders（M） -&gt; Purchase Orders（M）&lt;br /&gt;&lt;br /&gt;结论：一旦财务选项中定义了Inventory Organization，那么对于整个OU，对应采购订单行上所有的Item只能这里定义的Inventory Organization上来。而对于Shipment上的Org，包括定义Item的Org以及分配了这个Item的Org。例如，如果将这个Item分配给C10，查看Shipment行，可以看到Org可以选择000或者C10。&lt;br /&gt;&lt;br /&gt;发运行上的Org可以选择两个组织。&lt;br /&gt;Path：Purchase Orders（M） -&gt; Purchase Orders（M）-&gt; Shipment （B）&lt;br /&gt;&lt;br /&gt;h.      Supplier – Encumbrance&lt;br /&gt;&lt;br /&gt;尚未使用。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Financials Options (M) -&gt; Encumbrance (T)&lt;br /&gt;&lt;br /&gt;i.        Supplier – Tax&lt;br /&gt;&lt;br /&gt;Path：Supplier Base (M) –&gt; Suppliers (M) -&gt; Sites (B)&lt;br /&gt;这里设定的Tax Code带入到新创建的供应商和供应商地点。同时可以在采购选项中设定采购文档的Tax Code的继承层次。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Purchase Options (M) -&gt; Tax Defaults (T)&lt;br /&gt;&lt;br /&gt;j.        Enable Recoverable Tax&lt;br /&gt;这里的设置会影响到新建的Tax Code，新建编码默认值从财务选项中带入。而创建的采购订单的Distribution行的Recoverable Tax会根据Tax Code的设定而来。&lt;br /&gt;&lt;br /&gt;实际上，Recovery Rate的设置比较复杂。&lt;br /&gt;首先Enable财务选项中的“Enable Recoverable Tax”以及设置“Default Recovery Rate”。&lt;br /&gt;第二，在Purchasing Look Up Code中设置Vendor Type，并在Vendor定义中将Vendor Type分配给对应供应商。&lt;br /&gt;第三，在Tax Recovery Rate中定义Tax Rule，指定帐户访问，以及条件，这里设定对“风险”类型的采购商，可退回税为50%。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;第四，在Recovery Code中设定对应的Recovery Rate或者Rule Name。&lt;br /&gt;如果是Rate会默认从财务选项中带入。&lt;br /&gt;&lt;br /&gt;如果Rule Name，可以选定步骤三中新建的Rule。&lt;br /&gt;&lt;br /&gt;第四：针对上述供应商创建采购订单，检查其Recovery Rate就是定义Rule中定义中的50%。&lt;br /&gt;&lt;br /&gt;第五，如果需要对Tax Code和Recovery Rate 进行更改，可以设定两个预置文件。Tax: Allow Override of Tax Code和Tax: Allow Override of Tax Recovery Rate。&lt;br /&gt;&lt;br /&gt;结论：财务选项中所设定的Recovery Rate只是会默认带入Tax Code中定义，可以在定义Tax Code的时候进行修改。&lt;br /&gt;在定义Tax Code的时候也选择Recovery Rule来定义Recovery Rate。&lt;br /&gt;最终决定采购文档上Recovery Rate是由Tax Code所定义的Recovery Rate而决定。&lt;br /&gt;而采购文档上的Tax Code是根据采购选项中设定Tax Code的优先次序决定。有可能来自于财务选项，有可能来自于Item层，供应商地点层等。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6509928286276124095?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6509928286276124095/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6509928286276124095' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6509928286276124095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6509928286276124095'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/3.html' title='采购设置 ——&gt; 3 财务选项'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-9132837986542322253</id><published>2007-10-22T14:48:00.000-07:00</published><updated>2007-10-22T14:50:15.249-07:00</updated><title type='text'>采购设置 ——&gt; 2 接收选项</title><content type='html'>不再贴图，图片太多实在太耗费时间。&lt;br /&gt;&lt;br /&gt;a.      Receipt Date&lt;br /&gt;&lt;br /&gt;设定接收日期的允许偏差。下面设置不能早于或者晚于计划接收日期5天。如果超过，出现提示信息。&lt;br /&gt;Path：Setup（M）-&gt; Organization （M）-&gt; Receiving Option（M）&lt;br /&gt;&lt;br /&gt;如果接收日期超过上述接收接收日期允许范围，将会出现如下提示错误。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;结论：用于控制供应商交货日期。是否真的需要退回给供应商需要根据采购物品已经返回给供应商。如果需要，可以通过Correct窗口对采购订单进行订货。&lt;br /&gt;问题：采购接收的接口部分应该也考虑了这里的选项，如果插入接口表的数据中，接收日期超过允许的范围，那么应该不会成功导入接收表。&lt;br /&gt;&lt;br /&gt;b.      Over Receipt Control&lt;br /&gt;&lt;br /&gt;控制是否可以超过采购数据进行接收。&lt;br /&gt;Path：Setup（M）-&gt; Organization （M）-&gt; Receiving Option（M）&lt;br /&gt;&lt;br /&gt;如果超过允许超过的数量，将会有如下的提示。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;结论：只会限制超过采购数量的接收，不会限制低于采购数量的接收。因为如果限制低于采购数量的接收，那么对同一个采购行接收将不能够进行分多次接收。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;c.       Receipt unordered&lt;br /&gt;&lt;br /&gt;可以接收没有采购单的物料。&lt;br /&gt;Path：Setup（M）-&gt; Organization （M）-&gt; Receiving Option（M）&lt;br /&gt;&lt;br /&gt;如果需要进行unordered的接收，首先必须将Receipt Option中enable unordered receipt 选项。这样在Receipt窗口中Receipt Unordered的按钮才是enable的。 同时指定能够进行未订购接收的供应商，具体是在供应商属性中enable receipt unordered。&lt;br /&gt;然后如果Item层次如果的Allow Unordered Receipts没有设置覆盖上述两个选项的话，那么可以针对这些Item进行未采购接收。&lt;br /&gt;Path：Items（M）-&gt; Master Item（M）&lt;br /&gt;&lt;br /&gt;通过unordered按钮进入接收窗口，接收20个，此时无订单。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;然后创建采购订单TunorderRev3，然后通过Match Unordered Receipt窗口，进行Match。采购订单的采购数量必须大于Unordered Receipt的接收单的数量。&lt;br /&gt;Path：Receiving（M） -&gt; Match Unordered Receipt（M）&lt;br /&gt;&lt;br /&gt;Match完成之后，可以继续进行后续检验入库操作了。&lt;br /&gt;Path：Receiving（M） -&gt; Receiving Transactions（M）&lt;br /&gt;&lt;br /&gt;剩下的6个采购订单，可以还可以做正常的Receipt操作。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;结论：进行没有采购单的接收，可以处理哪些供应商已经送货，但是实际上系统中下采购订单或者没有审批完成，可以系统中对供应商的送货进行接收，记录数据。待采购订单完成审批完成之后，再进行Match。&lt;br /&gt;问题：在采购订单完成审批之前，这种接收不能入库，从而不能其他库存业务操作，例如生产发料，库存转移等等，后续流程不能还是不能在系统中完成。&lt;br /&gt;&lt;br /&gt;d.      Express Transactions&lt;br /&gt;&lt;br /&gt;设置允许快速接收，提高接收的效率。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Receiving Options (M)&lt;br /&gt;&lt;br /&gt;查询处对应需要进行快速接收的采购订单&lt;br /&gt;Path：Receiving (M) -&gt; Receipts (M) -&gt; Find (B)&lt;br /&gt; &lt;br /&gt;点击Express按钮，会让选择快速接收的Final Destination&lt;br /&gt;Path：Express (B)&lt;br /&gt;&lt;br /&gt;从Receiving Transaction Summary刚才快速接收的事务。因为选择的为Final Destination，所以同时将Receipt和Deliver两步同时完成。&lt;br /&gt;Path：Receiving（M） –&gt; Receiving Transaction Summary（M）&lt;br /&gt;&lt;br /&gt;是否进行快速接收存在一定的条件，对于不能快速接收的必须手动完成：&lt;br /&gt;• The item revision/subinventory/locator is required and not obtainable as a default from the item definition and the destination is Final&lt;br /&gt;• The early/late receipt date tolerance is exceeded and the exception control is Reject&lt;br /&gt;• Lot/serial information is required&lt;br /&gt;• Ship–to location is not available and the destination is Receiving&lt;br /&gt;• Location is not available for Expense destination type and the destination is Final Destination&lt;br /&gt;• Purchase order supplier and receipt header supplier do not match&lt;br /&gt;• other receipts are pending for the specified shipment&lt;br /&gt;&lt;br /&gt;结论：快速接收能够加快接收的效率。但是存在一定的前提，业务部门是否需要对接收的步骤进行的严格的控制。例如，必须进行了检验之后才入库。同时，要保证快速接收的效率，必须满足上述的条件，对于不满足条件的订单，必须手工完成。&lt;br /&gt;&lt;br /&gt;e.      Cascading Receipt&lt;br /&gt;&lt;br /&gt;“级联”功能便于将从单个供应商处接收的指定物料数量在多个发运和分配之间进行分配。如果在“查找预计接收”窗口中指定了供应商和物料，并在“接收选项”窗口中启用了“允许级联事务处理”，则将可以在“接收”窗口中使用此功能。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Receiving Options (M)&lt;br /&gt;&lt;br /&gt;针对某一个供应商和物料编码进行查询接收，下面的接收行来于三个订单。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;点击Cascade按钮，输入需要接收的数量以及单位。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）-&gt; Cascade（B）&lt;br /&gt;&lt;br /&gt;确定之后，发现系统自动计算5000数量所需要的接收行，注意最后一样的数量由2250更改为750。然后再进行接收。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;如果实际的接收行为5000，而输入接收数量为5100，将会出现如下的提示。&lt;br /&gt;Path：Receiving（M） -&gt; Receiving Transactions（M）&lt;br /&gt;&lt;br /&gt;结论：“级联”功能便于将从单个供应商处接收的指定物料数量在多个发运和分配之间进行分配。如果在“查找预计接收”窗口中指定了供应商和物料，并在“接收选项”窗口中启用了“允许级联事务处理”，则将可以在“接收”窗口中使用此功能。如果在“查找接收事务处理”窗口中指定了物料，则将可以在“接收事务处理”窗口中分发物料时使用此级联功能。在行中执行任何人工事务处理将禁用“级联”按钮，并且在您于相应的“查找”窗口中再次选择“查找”按钮之前，此按钮将一直处于禁用状态。&lt;br /&gt;&lt;br /&gt;如果选择“级联”按钮，采购管理系统将显示“级联明细”窗口，您必须在其中输入级联数量和单位。选择“确定”按钮，系统将启动级联流程。&lt;br /&gt;&lt;br /&gt;流程从第一个显示的行开始执行，并按您输入的相应级联数量为该行分配可用于接收/分发的供应。然后，流程将转至下一行继续执行并再次分配可用于接收/分发的数量（依此类推），直至查询到的最后一行或者用尽级联数量。由于这些行按承诺日期/需要日期顺序显示，因此流程的运行过程类似于先进/先出过程。如果输入的级联数量大于可用于接收/分发的数量，采购管理系统将显示一个对话框窗口以说明流程最多只能分配的数量；如果级联数量小于可用于接收/分发的数量，则最后一行分配到的接收/分发数量可能只是部分级联数量。为了明确表示级联数量已用尽，采购管理系统会将剩余行的事务处理数量显示为 0。&lt;br /&gt;&lt;br /&gt;级联功能不会修改任何目的地信息；它使用由接收方式定义的，以及自发运默认的信息。&lt;br /&gt;&lt;br /&gt;如果某发运行包含多项分配并且该行的接收方式默认为直接接收，级联流程将展开该行，并根据各项分配的可用供应将发运行的可用数量在其组成分配之间进行分配。如果超量分配某指定行，采购管理系统会将发运的所有剩余供应分配至最后一项分配；如果超量分发的事务处理先前已具有接收或事务处理，则该流程将使用非期望值来填写这些行；这种情况下，您可以在级联流程完成后进行重新分配。&lt;br /&gt;&lt;br /&gt;在级联流程执行期间，系统会禁用记录验证以加快级联流程的运行；但在保存记录时，系统将对所有记录进行验证。数量将按默认接收方式对行的预期处理方式分配至各行。但您可以人工改写这些值。&lt;br /&gt;&lt;br /&gt;f.        Allow Blind Receiving&lt;br /&gt;&lt;br /&gt;运行Blind接收保证接收的数量和采购的数量精确匹配，从而采购接收录入员没有机会更改接收的数量。接收的数量会显示为0。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Receiving Options (M)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;采购订单发运行的实际数量为1000。&lt;br /&gt;Path：Purchase Order（M） -&gt; Purchase Order Summary（M）&lt;br /&gt;&lt;br /&gt;针对上述的采购订单发运行进行接收，系统显示的数量为0。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;结论：通过这种方式，接收更为死板，不可能考虑分批次接收的情况。但是保证了接收数量与采购数量的一致性。同时一旦设置这个参数。&lt;br /&gt;&lt;br /&gt;问题：现在系统中若进行这种业务，为什么会有错误？&lt;br /&gt;&lt;br /&gt;g.      Enforce Ship-To&lt;br /&gt;&lt;br /&gt;确保接收的地点和采购订单的地点一致性，如果不一致，可以选择警告，拒绝或者忽略。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Receiving Options (M)&lt;br /&gt;采购接收的时候，发运地点从采购发运行上默认而来。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;如果对其进行更改，更改为如下的地点。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;保存，系统将会出现如下的警告提示。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;br /&gt;&lt;br /&gt;结论：只是对于接收时候要确保地点的一致性，如果到了采购入库的步骤，可以更改而不会出现警告。&lt;br /&gt;&lt;br /&gt;h.      ASN Control&lt;br /&gt;没有使用&lt;br /&gt;&lt;br /&gt;i.        Receipt Routing&lt;br /&gt;设定接收的时候是否需要检验，这个选项可以被供应商/地点/物料属性/发运行的属性覆盖。&lt;br /&gt;Path：Setup (M) -&gt;Organization (M) -&gt;Receiving Options (M)&lt;br /&gt;&lt;br /&gt;查询一个客户退货，可以看到Routing字段为“Inspection Required”。&lt;br /&gt;Path：Receiving（M） -&gt; Receipt（M）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-9132837986542322253?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/9132837986542322253/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=9132837986542322253' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/9132837986542322253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/9132837986542322253'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/2.html' title='采购设置 ——&gt; 2 接收选项'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-7646507082023293817</id><published>2007-10-19T11:56:00.000-07:00</published><updated>2008-11-13T01:57:55.250-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='采购选项'/><category scheme='http://www.blogger.com/atom/ns#' term='Default'/><title type='text'>采购设置 ——&gt; 1采购选项 ——&gt; 1.2 Default/Accrual/Number</title><content type='html'>&lt;span style="font-size:130%;"&gt;Default&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;顾名思义，就是设定采购默认值的设置，这些默认值将会再创建请购单，采购等文档的时候，相关域从这里得到默认值。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_0a2Dk-I/AAAAAAAAAO0/Tg2130jPv0g/s1600-h/1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125852158268386" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_0a2Dk-I/AAAAAAAAAO0/Tg2130jPv0g/s400/1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;a. Requisition Import Group-By&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;设定从请购接口表导入请购单的时候，请购单的分组规则。存在ALL，Vendor，Buyer，Item，Category等选项。这里的设置会影响到从MRP，WIP以及其他外部系统导入请购单的时候，请购单的分组。下面的例子以Requisition Import报表为例。测试，设置不同的分组，运行这个请求的时候，参数的默认值。&lt;br /&gt;&lt;br /&gt;如果分组值设定为Buyer。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_0a2Dk_I/AAAAAAAAAO8/tbjkihnuKGI/s1600-h/0.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125852158268402" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_0a2Dk_I/AAAAAAAAAO8/tbjkihnuKGI/s400/0.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;提交请求的时候，默认分组参数为Buyer。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_sq2Dk8I/AAAAAAAAAOk/VP_Co453Wu8/s1600-h/3.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125719014282178" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_sq2Dk8I/AAAAAAAAAOk/VP_Co453Wu8/s400/3.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果分组值设定为Vendor。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_sq2Dk7I/AAAAAAAAAOc/mx8Su9w9gno/s1600-h/4.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125719014282162" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_sq2Dk7I/AAAAAAAAAOc/mx8Su9w9gno/s400/4.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;提交请求的时候，默认分组参数为Vendor。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_sa2Dk6I/AAAAAAAAAOU/cdZ7HjbdoP0/s1600-h/5.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125714719314850" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_sa2Dk6I/AAAAAAAAAOU/cdZ7HjbdoP0/s400/5.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;b. Rate Type:&lt;br /&gt;&lt;/strong&gt;设定Corporate。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_sa2Dk5I/AAAAAAAAAOM/d3MlnkNPpMI/s1600-h/6.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125714719314834" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_sa2Dk5I/AAAAAAAAAOM/d3MlnkNPpMI/s400/6.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;请购单一旦设定非本位币，存在汇率转换的时候，可以看到默认汇率类型。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_s62Dk9I/AAAAAAAAAOs/j0UV1e9WzvI/s1600-h/2.png"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_hq2Dk4I/AAAAAAAAAOE/fHWmS0f8IJE/s1600-h/7.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125530035721090" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_hq2Dk4I/AAAAAAAAAOE/fHWmS0f8IJE/s400/7.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;c. Minimum Release&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_hq2Dk3I/AAAAAAAAAN8/d4qWgqs6mfA/s1600-h/8.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125530035721074" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxj_hq2Dk3I/AAAAAAAAAN8/d4qWgqs6mfA/s400/8.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在Blanket Purchasing Agreement 中的Term窗口检查默认值。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_ha2Dk2I/AAAAAAAAAN0/ovB4yXupZF4/s1600-h/9.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125525740753762" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_ha2Dk2I/AAAAAAAAAN0/ovB4yXupZF4/s400/9.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;d. Price Break Type&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_ha2Dk1I/AAAAAAAAANs/_eSYShukD88/s1600-h/10.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125525740753746" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_ha2Dk1I/AAAAAAAAANs/_eSYShukD88/s400/10.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在Blanket Purchasing Agreement 中的订单行上检查默认值。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxj_hK2Dk0I/AAAAAAAAANk/xTGQMxN3Zms/s1600-h/11.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125521445786434" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxj_hK2Dk0I/AAAAAAAAANk/xTGQMxN3Zms/s400/11.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;e. Price Type &lt;/strong&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RxkC862DlAI/AAAAAAAAAPE/_yhqoAZlc5Y/s1600-h/Fixrate.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123129296722039810" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RxkC862DlAI/AAAAAAAAAPE/_yhqoAZlc5Y/s400/Fixrate.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在请购行的Price Reference页检查默认值。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RxkC862DlBI/AAAAAAAAAPM/O-UMNOKj2V0/s1600-h/Fixrate1.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123129296722039826" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RxkC862DlBI/AAAAAAAAAPM/O-UMNOKj2V0/s400/Fixrate1.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_U62DkxI/AAAAAAAAANM/-lByh-EgUr4/s1600-h/14.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;f. Receipt Close/Invoice Close/Line Type/Match Approval Level &lt;/strong&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_U62DkyI/AAAAAAAAANU/afWc1KXTL9g/s1600-h/13.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125310992388898" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_U62DkyI/AAAAAAAAANU/afWc1KXTL9g/s400/13.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在请购行/发运行上检查默认值。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_U62DkzI/AAAAAAAAANc/nn9uDdTo7Wk/s1600-h/12.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125310992388914" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_U62DkzI/AAAAAAAAANc/nn9uDdTo7Wk/s400/12.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;g. RFQ Required &lt;/strong&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_U62DkxI/AAAAAAAAANM/-lByh-EgUr4/s1600-h/14.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125310992388882" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxj_U62DkxI/AAAAAAAAANM/-lByh-EgUr4/s400/14.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;可以在Item层和请购行层覆盖这个选项。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Number &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;编码方式，可以选择自动生成编号或者手工输入。自动只能选择数字，手工可以是字母和数字。 &lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RxkC9a2DlCI/AAAAAAAAAPU/Tt4ZZlf6rCc/s1600-h/number.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123129305311974434" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RxkC9a2DlCI/AAAAAAAAAPU/Tt4ZZlf6rCc/s400/number.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Accrual&lt;/span&gt;&lt;br /&gt;应计的时间点，是在接收的时候或者在期末的时候。对于库存，只能选择在接收时应计。对于费用项目，还可以选择在期末应计。&lt;br /&gt;同时设定应计帐户。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_Ua2DkvI/AAAAAAAAAM8/FsQlM_qeLhI/s1600-h/16.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123125302402454258" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_Ua2DkvI/AAAAAAAAAM8/FsQlM_qeLhI/s400/16.png" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-7646507082023293817?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/7646507082023293817/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=7646507082023293817' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7646507082023293817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7646507082023293817'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/1-12-defaultaccrualnumber.html' title='采购设置 ——&gt; 1采购选项 ——&gt; 1.2 Default/Accrual/Number'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LVEyZaW7hys/Rxj_0a2Dk-I/AAAAAAAAAO0/Tg2130jPv0g/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-2996505159475915902</id><published>2007-10-18T19:44:00.000-07:00</published><updated>2008-11-13T01:58:00.089-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Control'/><category scheme='http://www.blogger.com/atom/ns#' term='采购选项'/><title type='text'>采购设置 ——&gt; 1采购选项 ——&gt; 1.1 Control面板</title><content type='html'>最近比较闲，开始学习采购设置。&lt;br /&gt;&lt;br /&gt;采购设置 ——&gt; 采购选项 ——&gt; Control面板&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkII/AAAAAAAAAIE/9vSM3R5UhQM/s1600-h/1.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122881893720887426" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkII/AAAAAAAAAIE/9vSM3R5UhQM/s400/1.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;a. Price Tolerance&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;通过Requisition Summary查询，请购行单价.9915。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkJI/AAAAAAAAAIM/Yh0A9ebXL6E/s1600-h/2.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122881893720887442" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkJI/AAAAAAAAAIM/Yh0A9ebXL6E/s400/2.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;如果采购选项中采购价格百分比做如下的设定。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkKI/AAAAAAAAAIU/MWVqybA9hJY/s1600-h/3.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122881893720887458" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkKI/AAAAAAAAAIU/MWVqybA9hJY/s400/3.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;通过Auto Create将这个请购单创建到标准订单的时候，将价格更改为15（大于20% * .9915，其中.9915为上述请购行的单价），保存，点击Approve按钮提交审批，可以弹出审批界面，证明系统没有因为单价超过容差百分比而限制订单的审批。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkLI/AAAAAAAAAIc/lvVGEjWq9Us/s1600-h/4.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122881893720887474" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkLI/AAAAAAAAAIc/lvVGEjWq9Us/s400/4.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果采购选项中采购价格百分比做如下的设定。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgh8a2DkMI/AAAAAAAAAIk/MmSogz9GOhM/s1600-h/5.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122881898015854786" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgh8a2DkMI/AAAAAAAAAIk/MmSogz9GOhM/s400/5.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;那么将会再通过Approve按钮去访问提交审批界面的时候，将会出现错误提示。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxgin62DkNI/AAAAAAAAAIs/uYyu6DLjxEY/s1600-h/6.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122882645340164306" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxgin62DkNI/AAAAAAAAAIs/uYyu6DLjxEY/s400/6.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;结论：Price Tolerance Percentage和Enforce Price Tolerance Percentage要结合使用。只有Enable了Enforce Price Tolerance Percentage的时候，在Price Tolerance Percentage设定的值才起作用。&lt;br /&gt;&lt;br /&gt;如果将设定Price Tolerance Amount。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RxgioK2DkOI/AAAAAAAAAI0/G0zBsScb3Ys/s1600-h/7.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122882649635131618" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RxgioK2DkOI/AAAAAAAAAI0/G0zBsScb3Ys/s400/7.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;针对同样的采购订单，如果单价为1.1（累计Tolerance的金额为(1.1-.9915)*100 &gt; 10 ），点击Approve按钮，出现如下错误。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RxgioK2DkPI/AAAAAAAAAI8/rdwVOnwoMgs/s1600-h/8.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122882649635131634" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RxgioK2DkPI/AAAAAAAAAI8/rdwVOnwoMgs/s400/8.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;结论：同Price Tolerance Percentage，只是一个侧重采购金额，一个侧重价格百分比。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;b. Receipt Close Point&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;设定这个值，决定在什么时候对订单发运行进行Close For Receiving。一共有三个选型值，对应于采购接收的三个步骤——Receipt，Accept，Delivered。&lt;br /&gt;下面测试这个值的设置，对发运行自动关闭的影响。&lt;br /&gt;&lt;br /&gt;在采购选项中设置。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgioa2DkQI/AAAAAAAAAJE/y3Sd4mYj4Yk/s1600-h/9.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122882653930098946" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgioa2DkQI/AAAAAAAAAJE/y3Sd4mYj4Yk/s400/9.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;通常和Receipt Close结合使用（这个值在采购选项Default面板设置）。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgioa2DkRI/AAAAAAAAAJM/LzARdLEMKzc/s1600-h/10.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122882653930098962" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgioa2DkRI/AAAAAAAAAJM/LzARdLEMKzc/s400/10.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;创建采购订单，检查其发运行，其Closure Status为Open。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LVEyZaW7hys/RxgjRK2DkSI/AAAAAAAAAJU/Up4KzCxIsks/s1600-h/11.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122883354009768226" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RxgjRK2DkSI/AAAAAAAAAJU/Up4KzCxIsks/s400/11.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;采购选项的值被带入发运行。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/RxgjRa2DkTI/AAAAAAAAAJc/BD0u1OIfzf8/s1600-h/12.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122883358304735538" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RxgjRa2DkTI/AAAAAAAAAJc/BD0u1OIfzf8/s400/12.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;对审批的采购发运行做Receipt，发运行本来的数量为1000。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/RxgjRa2DkUI/AAAAAAAAAJk/WKpfESGbsEg/s1600-h/13.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122883358304735554" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RxgjRa2DkUI/AAAAAAAAAJk/WKpfESGbsEg/s400/13.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;这里我们接收(1-10%)*1000 = 900数量，保存。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/RxgjRa2DkVI/AAAAAAAAAJs/ccyOGyQPBl0/s1600-h/14.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122883358304735570" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RxgjRa2DkVI/AAAAAAAAAJs/ccyOGyQPBl0/s400/14.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;再检查发运行状态，已经为Closed For Receiving。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RxgjRq2DkWI/AAAAAAAAAJ0/wILB4nxTS9s/s1600-h/15.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122883362599702882" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RxgjRq2DkWI/AAAAAAAAAJ0/wILB4nxTS9s/s400/15.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;结论：这个选项控制在采购接收的什么步骤进行订单的自动关闭，通常需要和Receipt Close选项结合使用。从正常的业务逻辑来讲，设置为Delivery比较合理。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;c. Cancel Requisition&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;这个选项只应用于通过Auto Create创建的订单的请购单。有三个选项Optionally，Always，Never。&lt;br /&gt;&lt;br /&gt;Path：Purchasing Option（Menu）-&gt;Control（Tab）&lt;br /&gt;设置其值为Optionally。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RxgkPq2DkXI/AAAAAAAAAJ8/6Ci-X_4RG_0/s1600-h/16.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884427751592306" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RxgkPq2DkXI/AAAAAAAAAJ8/6Ci-X_4RG_0/s400/16.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;订单T_ClosePoint1通过Auto Create通过请购单创建而来。&lt;br /&gt;Path：Purchase Order Summary（Window）-&gt; Control （Menu）&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/RxgkPq2DkYI/AAAAAAAAAKE/WYEMg3gRPrE/s1600-h/17.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884427751592322" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RxgkPq2DkYI/AAAAAAAAAKE/WYEMg3gRPrE/s400/17.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;从弹出的Control窗口中，有取消请购的选项。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/RxgkP62DkZI/AAAAAAAAAKM/d6_ZDC30kOM/s1600-h/18.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884432046559634" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RxgkP62DkZI/AAAAAAAAAKM/d6_ZDC30kOM/s400/18.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果设置为 Always&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/RxgkP62DkaI/AAAAAAAAAKU/VQhT2CePm24/s1600-h/19.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884432046559650" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RxgkP62DkaI/AAAAAAAAAKU/VQhT2CePm24/s400/19.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;检查Control窗口，Cancel Requisition默认选择，且不让更改。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/RxgkP62DkbI/AAAAAAAAAKc/us37yVSD6bU/s1600-h/20.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884432046559666" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RxgkP62DkbI/AAAAAAAAAKc/us37yVSD6bU/s400/20.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;结论：用户控制在取消采购单的时候，是否取消采购单对应的请购单。&lt;br /&gt;问题：如果取消了请购单，而请购单从MRP创建，对计划的影响（To Do）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;d. Notify If Blanket PO Exists&lt;/strong&gt; &lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgkda2DkcI/AAAAAAAAAKk/IT0TinrnB-Y/s1600-h/21.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884663974793666" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgkda2DkcI/AAAAAAAAAKk/IT0TinrnB-Y/s400/21.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;创建请购单的时候，如果对应Item已经存在BPA，给出提示。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkdq2DkdI/AAAAAAAAAKs/byQnhKQlNT8/s1600-h/22.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884668269760978" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkdq2DkdI/AAAAAAAAAKs/byQnhKQlNT8/s400/22.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;e. Allow Item Description Update&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;是否在请购/采购行上更新Item的描述。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkdq2DkeI/AAAAAAAAAK0/jWw5V_4WS0c/s1600-h/23.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884668269760994" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkdq2DkeI/AAAAAAAAAK0/jWw5V_4WS0c/s400/23.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Item层的这个属性会覆盖采购选项的属性，所以必须在Item层上设置之后再测试。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkdq2DkfI/AAAAAAAAAK8/o1r_VZ-M1lg/s1600-h/24.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884668269761010" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkdq2DkfI/AAAAAAAAAK8/o1r_VZ-M1lg/s400/24.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;请购行上的描述字段变成可编辑状态了。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxgkd62DkgI/AAAAAAAAALE/mMJpsYlLdoY/s1600-h/25.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884672564728322" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rxgkd62DkgI/AAAAAAAAALE/mMJpsYlLdoY/s400/25.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;结论：采购选项关于Item描述的更新设置通常没有什么用，一般在Item层属性都会覆盖采购选项的设置。在Item层应该设计为下拉框，有三个选项（Yes，No，Null）。其中Null表示在Item层不设置这个属性，从而不会覆盖采购选项层的设置。&lt;br /&gt;&lt;br /&gt;如果Enable这个选项，对新创建的Item，Item层的可更新描述的选项默认也是Enable的。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgkra2DkhI/AAAAAAAAALM/C73hhXd1dAE/s1600-h/26.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884904492962322" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/Rxgkra2DkhI/AAAAAAAAALM/C73hhXd1dAE/s400/26.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;f. Enforce Vendor Hold&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkrq2DkiI/AAAAAAAAALU/G1J6h7JRAxQ/s1600-h/27.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884908787929634" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkrq2DkiI/AAAAAAAAALU/G1J6h7JRAxQ/s400/27.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;同时在Supplier的定义的Purchasing也设置Purchase Order Hold。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkrq2DkjI/AAAAAAAAALc/n15VmBpFHJ8/s1600-h/28.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884908787929650" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkrq2DkjI/AAAAAAAAALc/n15VmBpFHJ8/s400/28.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;针对这个Supplier创建采购订单，然后点击提交，系统将会出现如下的提示错误。&lt;a href="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkrq2DkkI/AAAAAAAAALk/CNB4Q3VnCak/s1600-h/29.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5122884908787929666" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/Rxgkrq2DkkI/AAAAAAAAALk/CNB4Q3VnCak/s400/29.PNG" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-2996505159475915902?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/2996505159475915902/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=2996505159475915902' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2996505159475915902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2996505159475915902'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/1-11-control.html' title='采购设置 ——&gt; 1采购选项 ——&gt; 1.1 Control面板'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LVEyZaW7hys/Rxgh8K2DkII/AAAAAAAAAIE/9vSM3R5UhQM/s72-c/1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-8272108482385265819</id><published>2007-10-15T08:09:00.000-07:00</published><updated>2007-10-15T08:14:08.177-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='远程桌面控制'/><category scheme='http://www.blogger.com/atom/ns#' term='VNC'/><category scheme='http://www.blogger.com/atom/ns#' term='shutdown'/><title type='text'>远程重新启动服务器</title><content type='html'>上周通过远程桌面控制的时候，关闭其中一个窗口，没有响应，我就强行结束任务，没想到系统pending住，桌面蓝屏，远程桌面不能控制，VNC也不能登录了。看到web server等其他服务在正常运行，便回家过周末去了：）&lt;br /&gt;&lt;br /&gt;本来想找系统管理员到机器旁边去看一下，不过看到是自己犯的错误，还是自己先想办法吧。网络真好，通过如下两个命令搞定了：&lt;br /&gt;&lt;br /&gt;net   use   &lt;a href="file://192.168.0.3/admin$"&gt;\\192.168.0.3\admin$&lt;/a&gt;   adminpasswd   /user:administrator &lt;br /&gt;shutdown -r -m &lt;a href="file://192.168.0.3/"&gt;\\192.168.0.3&lt;/a&gt; -t 30 -f&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-8272108482385265819?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/8272108482385265819/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=8272108482385265819' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8272108482385265819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8272108482385265819'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/blog-post.html' title='远程重新启动服务器'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-8378768276453203932</id><published>2007-10-10T12:36:00.000-07:00</published><updated>2007-10-10T12:40:15.854-07:00</updated><title type='text'>几个itpub关于采购审批层次的帖子</title><content type='html'>Q:  问个po审批层次的问题&lt;br /&gt;在po中定义了审批层次，我想问一下，在采购订单提交审批的时候，按照什么样的规则提交给不同层次的审批者？比如：一级a，二级b，三级c，b有5000元的最高审批权限，那么c做的采购订单什么情况下会由a来审批呢？超出5000元么？是由b转给a ,还是直接发送到了a？？？？&lt;br /&gt;&lt;br /&gt;A: 没有试验，不知道如下是否满足你的需求&lt;br /&gt;1）首先需要设定两个审批组一个审判GroupB审批的金额1~5000,另外一个组Group审批金额为5001～99999999999999999。&lt;br /&gt;2）审批组分配。将b的职位分配到GroupB，将a的职位分配到GroupA。&lt;br /&gt;3）设置文档类型的Foward Method的属性。如果超过5000，直接到A，那么将Forward Method属性值设为Direct。如果需要B转交，那么将Forward Method属性值设为Hiberarchy&lt;br /&gt;&lt;br /&gt;URL:&lt;a href="http://www.itpub.net/649786.html"&gt;http://www.itpub.net/649786.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q: 怎样指定审批层次的默认审批人&lt;br /&gt;因为公司同时使用了HR和PO模块。在HR模块中处于同一个position（PA）的有多个人(MA,MB,MC等)，这个position在采购的审批层次中，而这个position的几个人中，只有一个(MB)负责采购审批业务。 问题在于：用户提交单据的时候，发现审批路径上的人默认的时MA，而不是MB，这个用户带来很大的困惑。 请问是否有什么可以预制文件或者设置的地方，将MB设定为默认的审批人呢？&lt;br /&gt;&lt;br /&gt;A:OSS给出回复：&lt;br /&gt;1） 如果是11.5.9版本，没有这个功能，以字母的ascii码顺序默认审批人。&lt;br /&gt;参考Metalink:Note 106596.1&lt;br /&gt;Another method that must be considered is one where the application choosesthe forward-to person when multiple employees are tied to one position. Theapplication will select the forward-to person based on alphabetical nameorder. Here is an example to better clarify how the system chooses the nextapprover name when multiple approvers are assigned to one position:Position: ClerkEmployees Assigned: ManyReports To: Vice President, MaterialsPostion: Vice President, MaterialsEmployees Assigned: Dough, John S.Smith, Bob A.In this example, if a clerk chooses the Approve button without entering aforward-to person, and the next position above the clerk is theVice President of Materials, the document would be routed to John Dough.John Dough is selected because the system will choose the employee assignedto the position in alphabetical order, and since Dough comes before Smith,John Dough is selected. Therefore, unless the clerk selects a specificperson to forward the document to, the document will always be routed to thefirst person alphabetically assigned to the position.&lt;br /&gt;2） 如果是11.5.10版本，安装Oracle Approvals Management (AME) ，可以设定默认审批人。&lt;br /&gt;参考Metalink:Note 229663.1&lt;br /&gt;Oracle Approvals Management (AME) is a web–based application which is integrated with Oracle Workflow and which enables you to define business rules to control your approvals processes. With AME, you use the following components to define your approvals processes. They are associated with a transaction type for a particular application.• Attribute – this is a business variable, for example, a salary amount, user ID, or workflow process name.• Condition – a condition compares an attribute value with a set of allowed attribute values. For example, a condition could look at a salary amount. If the salary is greater than a specified value, a particular approver list is created.• Approval type and approval specifications – these components define the type of approver list that is generated. For example, to generate a supervisor–based approver list with 5 levels, you use the ’supervisory level’ approval type with the ’requires approval up to the first 5 approvers’ approval specification.• Rules – a rule links the other components together by associating one or more conditions with the approval type and approval rule&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.itpub.net/616596,2.html"&gt;http://www.itpub.net/616596,2.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-8378768276453203932?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/8378768276453203932/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=8378768276453203932' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8378768276453203932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8378768276453203932'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/10/itpub.html' title='几个itpub关于采购审批层次的帖子'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-4158897637426716787</id><published>2007-09-02T09:02:00.000-07:00</published><updated>2007-09-02T09:12:50.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jinitiator'/><category scheme='http://www.blogger.com/atom/ns#' term='RPCRT4.dll'/><title type='text'>访问form界面，IE窗口退出</title><content type='html'>今天突然发现访问不了ERP，一旦需要打开Form界面的时候，IE窗口自动退出。同时桌面有一个日志文件，部分内容如下。&lt;br /&gt;&lt;br /&gt;An unexpected exception has been detected in native code outside the VM.Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x77ea364eFunction name=NdrRpcSsDefaultAllocateLibrary=C:\WINDOWS\system32\RPCRT4.dll&lt;br /&gt;&lt;br /&gt;通过google查询，发现部分关于vista中怎样使用Jinitiator是用高版本的jvm替换对应的jvm。发现并不能解决问题，卸载掉部分jre的版本也没能够解决问题。最后还是在metalink上找到了解决方法，是msn的插件的问题，想起来前两天还错点了msn的按钮，应该是这个原因吧：&lt;br /&gt;&lt;br /&gt;&lt;a name="FIX"&gt;&lt;/a&gt;Solution&lt;br /&gt;-- To implement the solution, please execute the following steps::Suggest to check if this plug in is installed and enabled. If this is the case disable it using the following actions:1.Tools - Manage Add-ons - Enable or Disable Add-ons&lt;br /&gt;2. In Show option - "Add-ons that have been used by Internet Explorer"Select from the list and check for Name "Windows Live ...."&lt;br /&gt;e.g "Windows Live Messenger", "Windows Live Sing-in Helper" etc.&lt;br /&gt;3. Select "Disable" option4. Close all the Internet explorer browser sessions. Restart the client machine.&lt;br /&gt;5. Retest the issue.&lt;br /&gt;&lt;br /&gt;参考：Note:435562.1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-4158897637426716787?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/4158897637426716787/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=4158897637426716787' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4158897637426716787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4158897637426716787'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/09/formie.html' title='访问form界面，IE窗口退出'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6806393679265183133</id><published>2007-08-25T16:17:00.000-07:00</published><updated>2007-08-25T16:37:43.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='无线局域网'/><category scheme='http://www.blogger.com/atom/ns#' term='ping'/><category scheme='http://www.blogger.com/atom/ns#' term='IP安全策略'/><title type='text'>2000 servers终于可以通过网络访问了</title><content type='html'>自从在HP dv9207us机器被我从Vista降级安装windows 2000 server之后，问题一直不断。先是硬件驱动器的问题，后来是无限局域网内其他机器不能访问它的问题。所以，又作服务器有做客户端，够辛苦的。网络上有很多关于这种能够Ping通，但是不能通过网上邻居访问的解决方法，主要有：&lt;br /&gt;1、是否添加了“文件和打印共享”&lt;br /&gt;2、组策略中是否禁止了你用来访问的用户？&lt;br /&gt;&lt;br /&gt;发现都不是这些问题所在。无意在组策略的安全设置中，发现“IP安全策略，在本地机器中-〉安全服务器”是选中的，将其去掉就OK。&lt;br /&gt;&lt;br /&gt;现在终于可以从其他两台机器来访问这台服务器了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6806393679265183133?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6806393679265183133/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6806393679265183133' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6806393679265183133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6806393679265183133'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/2000-servers.html' title='2000 servers终于可以通过网络访问了'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-1496150253392009992</id><published>2007-08-17T21:28:00.000-07:00</published><updated>2007-08-17T21:31:04.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='乱码'/><category scheme='http://www.blogger.com/atom/ns#' term='imp'/><category scheme='http://www.blogger.com/atom/ns#' term='exp'/><title type='text'>数据库导入导出乱码问题</title><content type='html'>&lt;p&gt;&lt;br /&gt;        项目数据需要清理，DBA将数据按照用户导出发过了。导入数据的时候，发现数据库中文全部变成问号。上网找了一下资料，发现原来是数据库字符集不兼容。导入数据库的字符集WE8ISO8859P9，而导出数据库的字符集为ZHS16GBK。&lt;br /&gt;&lt;br /&gt;        第一个想法就是更改导入数据库的字符集，通过如下语句：ALTER DATABASE CHARACTER SET ZHS16GBK进行更改，系统提示“ORA-12712 new character set must be a superset of old character set”。原来使用这个语句还需要考虑更改的字符集与原来数据库的字符集兼容。Metalink Note:119164.1上定义了不同字符集的兼容关系。&lt;br /&gt;&lt;br /&gt;        只有重新建立一个库，设定字符集为ZHS16GBK/AL16UTF16。Imp的时候，系统显示的日志为：&lt;br /&gt;import done in ZHS16GBK character set and AL16UTF16 NCHAR character set&lt;br /&gt;export client uses ZHS16CGB231280 character set (possible charset conversion)&lt;br /&gt;export server uses ZHS16GBK NCHAR character set (possible ncharset conversion)&lt;br /&gt;&lt;br /&gt;         可以看到DBA导出的时候客户端字符集为“ZHS16CGB231280”，导出的数据库字符集为“ZHS16GBK”，这两个字符集也不完全兼容，以后导出的时候需要注意更改客户端字符集。导入的数据库的字符集为“ZHS16GBK”。导入完成之后，没有发现乱码问题。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;br /&gt;        1. 导入导出过程中涉及4个字符集，需要保证字符集的兼容性，才可能避免汉字乱码问题。&lt;br /&gt;                源数据库字符集&lt;br /&gt;                Export过程中用户会话字符集（通过NLS_LANG设定）&lt;br /&gt;                Import过程中用户会话字符集（通过NLS_LANG设定）&lt;br /&gt;                目标数据库字符集&lt;br /&gt;       2. 字符集兼容可以通过Metalink Note:119164.1查询。&lt;br /&gt;       3. 同时，在安装数据库的时候，应该根据业务需求选定好字符集，而不是采用安装过程的默认设置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考：&lt;br /&gt;&lt;/strong&gt;网上非常好的一篇文章：http://silverw0396.javaeye.com/blog/90554&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-1496150253392009992?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/1496150253392009992/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=1496150253392009992' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1496150253392009992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1496150253392009992'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/blog-post.html' title='数据库导入导出乱码问题'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-3267006862749595801</id><published>2007-08-14T13:36:00.000-07:00</published><updated>2007-08-14T13:37:59.897-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trace'/><category scheme='http://www.blogger.com/atom/ns#' term='discoverer 4i'/><title type='text'>Trace Discoverer Workbook</title><content type='html'>两种方法：修改注册表，或者通过SQL。&lt;br /&gt;&lt;br /&gt;&lt;a name="_Toc174869036"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;修改注册表的值&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;\\HKEY_CURRENT_USER\Software\Oracle\Discoverer\Database\SqlTrace&lt;br /&gt;type DWORD&lt;br /&gt;numeric value 1&lt;br /&gt;&lt;br /&gt;使用这个的前提是需要trace的工作簿查询尚未运行。如果已经运行了，可以通过方法2来完成。&lt;br /&gt;&lt;br /&gt;另，完成trace之后，别忘记更改回去。&lt;br /&gt;&lt;br /&gt;&lt;a name="_Toc174869037"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;通过SQL&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;a.             通过如下SQL定位discoverer的session以及spid。从而可以对对应的session进行跟踪。从而可以通过spid知道trace文件的名称。&lt;br /&gt;&lt;br /&gt;SELECT s.SID, s.serial#, s.username, s.program, p.spid&lt;br /&gt;  FROM v$session s, v$process p&lt;br /&gt; WHERE p.addr = s.paddr&lt;br /&gt;   AND s.program LIKE '%DIS4USR.EXE%'&lt;br /&gt;&lt;br /&gt;得到&lt;br /&gt;&lt;br /&gt;SID:72  serial#49228 SPID:5865&lt;br /&gt;SID:132  serial#56294  SPID:5877 &lt;br /&gt;&lt;br /&gt;b.          ENABLE TRACE&lt;br /&gt;exec dbms_system.set_sql_trace_in_session(72, 49228, TRUE)&lt;br /&gt;exec dbms_system.set_sql_trace_in_session(132, 56294, TRUE)&lt;br /&gt;&lt;br /&gt;c.             执行discoverer相关操作，例如运行工作簿，共享工作簿等。&lt;br /&gt;&lt;br /&gt;d.            从文件菜单中推出discoverer，这一步比较重要，如果是进行性能分析话，保证执行计划相关资源数据的完整性。&lt;br /&gt;&lt;br /&gt;e.             Disable trace.&lt;br /&gt;&lt;br /&gt;f.              通过步骤a得到的spid，从数据库下载对应的trace文件。格式化trace文件，判断哪一个是需要的trace文件，对正确的trace文件进行分析。&lt;br /&gt;&lt;br /&gt;tkprof onidau1_ora_5865.trc 14_2_1.txt sys = no;&lt;br /&gt;tkprof onidau1_ora_5877.trc 14_2_2.txt sys=no;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参考：metalink.  Note:273928.1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-3267006862749595801?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/3267006862749595801/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=3267006862749595801' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3267006862749595801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3267006862749595801'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/trace-discoverer-workbook.html' title='Trace Discoverer Workbook'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-5500141031735955192</id><published>2007-08-10T13:30:00.000-07:00</published><updated>2007-08-10T13:59:19.332-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Expert one on one Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='物化视图'/><category scheme='http://www.blogger.com/atom/ns#' term='query rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='demension'/><title type='text'>《Expert one on one Oracle》- 物化视图 - 笔记</title><content type='html'>物化视图概念类似于discoverer中的summary table。在discoverer的管理端，可以创建不同的summary table。在discoverer进行查询的时候，discoverer首先对查询进行解析，判断查询是否可以使用对应的summary table，如果可以，将会改写查询去查询对应的summary table。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;一个例子&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;通过如下的例子，对比统计数据需求的情况下，使用物化视图会有更快的访问速度。&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;--创建一张大表&lt;/span&gt;&lt;br /&gt;SQL&gt; create table my_all_objects&lt;br /&gt;2 nologging&lt;br /&gt;3 as&lt;br /&gt;4 select * from all_objects&lt;br /&gt;5 union all&lt;br /&gt;6 select * from all_objects&lt;br /&gt;7 union all&lt;br /&gt;8 select * from all_objects&lt;br /&gt;9 /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert /*+ APPEND */ into my_all_objects&lt;br /&gt;2 select * from my_all_objects;&lt;br /&gt;87945 rows created.&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert /*+ APPEND */ into my_all_objects&lt;br /&gt;2 select * from my_all_objects;&lt;br /&gt;175890 rows created.&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; analyze table my_all_objects compute statistics;&lt;br /&gt;Table analyzed.&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace traceonly&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--通过执行计划可以得知直接对数据进行count计算，需要访问4800数据块&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, count(*) from my_all_objects group by owner;&lt;br /&gt;28 rows selected.&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=CHOOSE (Cost=989 Card=28 Bytes=14&lt;br /&gt;0)&lt;br /&gt;1 0 SORT (GROUP BY) (Cost=989 Card=28 Bytes=140)&lt;br /&gt;2 1 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'MY_ALL_OBJECTS'&lt;/span&gt; (Cost=471 Card=3&lt;br /&gt;51780 Bytes=1758900)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 recursive calls&lt;br /&gt;0 db block gets&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;4804 consistent gets&lt;br /&gt;&lt;/span&gt;3004 physical reads&lt;br /&gt;0 redo size&lt;br /&gt;973 bytes sent via SQL*Net to client&lt;br /&gt;510 bytes received via SQL*Net from client&lt;br /&gt;3 SQL*Net roundtrips to/from client&lt;br /&gt;1 sorts (memory)&lt;br /&gt;0 sorts (disk)&lt;br /&gt;28 rows processed&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace off&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--赋予测试用户query rewrite的权限&lt;/span&gt;&lt;br /&gt;SQL&gt; grant query rewrite to scott;&lt;br /&gt;Grant succeeded.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--更改当前session能够query rewrite&lt;/span&gt;&lt;br /&gt;SQL&gt; alter session set query_rewrite_enabled=true;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--设定query_rewrite_integrity的值为enforced，有三个置可选，enforced，trusted，STALE_TOLERATED&lt;/span&gt;&lt;br /&gt;SQL&gt; alter session set query_rewrite_integrity=enforced;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--创建物化视图&lt;/span&gt;&lt;br /&gt;SQL&gt; create materialized view my_all_objects_aggs&lt;br /&gt;2 build immediate&lt;br /&gt;3 refresh on commit&lt;br /&gt;4 enable query rewrite&lt;br /&gt;5 as&lt;br /&gt;6 select owner, count(*)&lt;br /&gt;7 from my_all_objects&lt;br /&gt;8 group by owner&lt;br /&gt;9 /&lt;br /&gt;Materialized view created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--分析物化视图&lt;/span&gt;&lt;br /&gt;SQL&gt; analyze table my_all_objects_aggs compute statistics;&lt;br /&gt;Table analyzed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--通过执行计划可以得知再进行同样的count计算，只需要访问5个数据块。同时，通过执行路径也可以看到，查询是通过物化视图来完成的。如果业务上对于这种count的计算比较频繁的话，采用物化视图将会节省更多的资源。是一种以空间换取时间的方法。&lt;br /&gt;&lt;/span&gt;SQL&gt; set autotrace traceonly&lt;br /&gt;SQL&gt; select owner, count(*)&lt;br /&gt;2 from my_all_objects&lt;br /&gt;3 group by owner;&lt;br /&gt;28 rows selected.&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=28 Bytes=252)&lt;br /&gt;1 0 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'MY_ALL_OBJECTS_AGGS'&lt;/span&gt; (Cost=2 Card= 28 Bytes=252)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 recursive calls&lt;br /&gt;0 db block gets&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;5 consistent gets&lt;/span&gt;&lt;br /&gt;0 physical reads&lt;br /&gt;0 redo size&lt;br /&gt;973 bytes sent via SQL*Net to client&lt;br /&gt;510 bytes received via SQL*Net from client&lt;br /&gt;3 SQL*Net roundtrips to/from client&lt;br /&gt;0 sorts (memory)&lt;br /&gt;0 sorts (disk)&lt;br /&gt;28 rows processed&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace off&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--插入新的纪录&lt;/span&gt;&lt;br /&gt;SQL&gt; insert into my_all_objects&lt;br /&gt;2 ( owner, object_name, object_type, object_id )&lt;br /&gt;3 values&lt;br /&gt;4 ( 'New Owner', 'New Name', 'New Type', 1111111 );&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; set timing on&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--对新纪录的count计算仍然通过物化视图来访问。由于创建物化视图的时候，使用“refresh on commit”语句，表的新增纪录已经刷新到物化视图。&lt;br /&gt;&lt;/span&gt;SQL&gt; select owner, count(*)&lt;br /&gt;2 from my_all_objects&lt;br /&gt;3 where owner = 'New Owner'&lt;br /&gt;4 group by owner;&lt;br /&gt;&lt;br /&gt;OWNER COUNT(*)&lt;br /&gt;------------------------------ ----------&lt;br /&gt;New Owner 1&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:00.00&lt;br /&gt;SQL&gt; set timing off&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; set autotrace traceonly&lt;br /&gt;SQL&gt; select owner, count(*)&lt;br /&gt;2 from my_all_objects&lt;br /&gt;3 where owner = 'New Owner'&lt;br /&gt;4 group by owner;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=9)&lt;br /&gt;1 0 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'MY_ALL_OBJECTS_AGGS'&lt;/span&gt; (Cost=2 Card= 1 Bytes=9)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 recursive calls&lt;br /&gt;0 db block gets&lt;br /&gt;4 consistent gets&lt;br /&gt;0 physical reads&lt;br /&gt;0 redo size&lt;br /&gt;442 bytes sent via SQL*Net to client&lt;br /&gt;499 bytes received via SQL*Net from client&lt;br /&gt;2 SQL*Net roundtrips to/from client&lt;br /&gt;0 sorts (memory)&lt;br /&gt;0 sorts (disk)&lt;br /&gt;1 rows processed&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace off&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--更改sql，不查询owner字段，只count，发现Oracle足够聪明，即使没有创建物化视图的group语句，还是从物化视图来访问&lt;/span&gt;&lt;br /&gt;SQL&gt; set autotrace traceonly&lt;br /&gt;SQL&gt; select count(*)&lt;br /&gt;2 from my_all_objects&lt;br /&gt;3 where owner = 'New Owner';&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=9)&lt;br /&gt;1 0 SORT (AGGREGATE)&lt;br /&gt;2 1 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'MY_ALL_OBJECTS_AGGS'&lt;/span&gt; (Cost=2 Card=1 Bytes=9)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 recursive calls&lt;br /&gt;0 db block gets&lt;br /&gt;3 consistent gets&lt;br /&gt;0 physical reads&lt;br /&gt;0 redo size&lt;br /&gt;379 bytes sent via SQL*Net to client&lt;br /&gt;499 bytes received via SQL*Net from client&lt;br /&gt;2 SQL*Net roundtrips to/from client&lt;br /&gt;0 sorts (memory)&lt;br /&gt;0 sorts (disk)&lt;br /&gt;1 rows processed&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace off&lt;br /&gt;&lt;br /&gt;对于事物频繁的OLTP系统，尽量少使用物化视图。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;设置参数&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;如下参数可以在数据库层或者Session层设置QUERY_REWRITE_ENABLED和&lt;br /&gt;QUERY_REWRITE_INTEGRITY值。对于QUERY_REWRITE_INTEGRITY有三种值可设：&lt;br /&gt;Enforced：重写只使用数据库中定义的约束和关系。&lt;br /&gt;Trusted：除了数据库中定义的约束和关系，Oracle还会使用其他我们告知Oracle表的某些关系，从而使得数据库能够重写更多的查询。&lt;br /&gt;Stale_Tolerated：最弱的参数，及时物化视图没有同步更新，也会使用物化视图来重写SQL。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;查询重写&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;全文精确匹配&lt;/strong&gt;&lt;br /&gt;如果查询的语句与存储在数据词典中物化视图字符串精确匹配，那么将会重写查询。这里的精确匹配相对于共享池的比较而言更友好，它会忽略空格，大小写以及其他的一些格式。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;部分文本匹配&lt;br /&gt;&lt;/strong&gt;比较From因子后面的文本，即使Select部分的不匹配。例如：&lt;br /&gt;接前面的例子，物化视图的查询部分的SQL：&lt;br /&gt;Select owner, count(*) from my_all_objects group by owner&lt;br /&gt;如下的查询能够被重写：&lt;br /&gt;Select lower(owner) from my_all_objects group by owner&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;一般性重写方法&lt;/strong&gt;&lt;br /&gt;a. 数据满足：查询的数据列在物化视图的查询列中&lt;br /&gt;b. 连接兼容：查询语句中的关联列需要在物化视图的查询列中&lt;br /&gt;c. 分组兼容：查询语句和物化视图都必须有Group by语句，同时物化视图的Group by分组层次应该高于或者等于查询的语句。&lt;br /&gt;d. 聚集兼容：查询语句和物化视图都必须包含聚集语句。如果物化视图包含SUM ()/COUNT () 函数，对于同样列采用AGE () 函数进行计算可以被重写。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;确保使用物化视图&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;如下的例子将会说明在怎样的条件下可以确保采用物化视图重写查询，也会比较QUERY_REWRITE_INTEGRITY值Enforced和Trusted的不同。&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--这一部分语句验证如果在数据库中相关约束，而这种约束在定义物化视图&lt;br /&gt;--使用。那么，如果查询即使满足其它被重写的条件（数据满足，关联兼容，&lt;br /&gt;--分组兼容等），也不会被重写。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--创建测试表和物化视图&lt;/span&gt;&lt;br /&gt;SQL&gt; create table emp as select * from scott.emp;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table dept as select * from scott.dept;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter session set query_rewrite_enabled=true;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--注意这里使用的参数值为enforced，只有查询中的约束和关系在物化视图中存在，才会重写查询。&lt;/span&gt;&lt;br /&gt;SQL&gt; alter session set query_rewrite_integrity=enforced;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--创建物化视图，注意这里是“refresh on demand”，需要手动刷新物化视图&lt;/span&gt;&lt;br /&gt;SQL&gt; create materialized view emp_dept&lt;br /&gt;2 build immediate&lt;br /&gt;3 refresh on demand&lt;br /&gt;4 enable query rewrite&lt;br /&gt;5 as&lt;br /&gt;6 select dept.deptno, dept.dname, count (*)&lt;br /&gt;7 from emp, dept&lt;br /&gt;8 where emp.deptno = dept.deptno&lt;br /&gt;9 group by dept.deptno, dept.dname&lt;br /&gt;10 /&lt;br /&gt;Materialized view created.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter session set optimizer_goal=all_rows;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace on&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--通过执行计划可以看到这个查询并没有被重写，而是直接访问表“EMP”。这是因为我们并没有定义表emp和dept的之间的主外健之间的关系，这种关系物化视图中使用，例如“emp.deptno = dept.deptno”&lt;/span&gt;&lt;br /&gt;SQL&gt; select count(*) from emp;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;14&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1)&lt;br /&gt;1 0 SORT (AGGREGATE)&lt;br /&gt;2 1 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'EMP'&lt;/span&gt; (Cost=2 Card=82)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;….略&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--这一部分语句验证增加相关约束后，查询被重写。&lt;br /&gt;&lt;br /&gt;--增加相关的约束和关系&lt;/span&gt;&lt;br /&gt;SQL&gt; alter table dept&lt;br /&gt;2 add constraint dept_pk primary key(deptno);&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table emp&lt;br /&gt;2 add constraint emp_fk_dept&lt;br /&gt;3 foreign key(deptno) references dept(deptno);&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table emp modify deptno not null;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace on&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--由于增加了约束，Oracle能够重写查询使其通过物化视图“EMP_DEPT”来访问数据。可以查看下面的highlight部分的执行计划。&lt;/span&gt;&lt;br /&gt;SQL&gt; select count(*) from emp;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;14&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=13)&lt;br /&gt;1 0 SORT (AGGREGATE)&lt;br /&gt;2 1 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'EMP_DEPT'&lt;/span&gt; (Cost=2 Card=82 Bytes=&lt;br /&gt;1066)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;略….&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace off&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--下面这部分SQL将会在比较query_rewrite_integrity在取值为Enforced和&lt;br /&gt;--Trusted情况下，是否被重写。&lt;br /&gt;&lt;br /&gt;--删除上述步骤建立的约束&lt;/span&gt;&lt;br /&gt;SQL&gt; alter table emp drop constraint emp_fk_dept;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table dept drop constraint dept_pk;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table emp modify deptno null;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--插入数据&lt;br /&gt;&lt;/span&gt;SQL&gt; insert into emp (empno,deptno) values ( 1, 1 );&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--手工刷新物化视图，这是因为物化视图创建的时候使用的是“refresh on demand”&lt;/span&gt;&lt;br /&gt;SQL&gt; exec dbms_mview.refresh( 'EMP_DEPT' );&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--再次增加约束，但是这次增加了NOVALIDATE因子。这样即使数据不符合约束也能够成功创建。&lt;/span&gt;&lt;br /&gt;SQL&gt; alter table dept&lt;br /&gt;2 add constraint dept_pk primary key(deptno)&lt;br /&gt;3 rely enable NOVALIDATE&lt;br /&gt;4 /&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table emp&lt;br /&gt;2 add constraint emp_fk_dept&lt;br /&gt;3 foreign key(deptno) references dept(deptno)&lt;br /&gt;4 rely enable NOVALIDATE&lt;br /&gt;5 /&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table emp modify deptno not null NOVALIDATE;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; set autotrace on&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--设置query_rewrite_integrity值为enforced&lt;/span&gt;&lt;br /&gt;SQL&gt; alter session set query_rewrite_integrity=&lt;span style="color:#ff0000;"&gt;enforced&lt;/span&gt;;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--检查增加约束但数据不满足约束的情况下，如果是query_rewrite_integrity的值为enforcedenforced，那么物化视图不会被利用来重写查询。&lt;/span&gt;&lt;br /&gt;SQL&gt; select count(*) from emp;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;15&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1)&lt;br /&gt;1 0 SORT (AGGREGATE)&lt;br /&gt;2 1 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'EMP'&lt;/span&gt; (Cost=2 Card=164)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;略….&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--设置query_rewrite_integrity值为trusted&lt;/span&gt;&lt;br /&gt;SQL&gt; alter session set query_rewrite_integrity=&lt;span style="color:#ff0000;"&gt;trusted&lt;/span&gt;;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--检查增加约束但数据不满足约束的情况下，如果是query_rewrite_integrity的值为trusted，那么物化视图将会被利用来重写查询&lt;/span&gt;。&lt;br /&gt;SQL&gt; select count(*) from emp;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;14&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=13)&lt;br /&gt;1 0 SORT (AGGREGATE)&lt;br /&gt;2 1 TABLE ACCESS (FULL) OF &lt;span style="color:#ff0000;"&gt;'EMP_DEPT'&lt;/span&gt; (Cost=2 Card=82 Bytes=&lt;br /&gt;1066)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;略….&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Dimension&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;创建纬度映射不同列之间的父子关系，类似于在discoverer中创建的维度，使得在查询的时候根据需求下钻上卷。在这里可以为Oracle提供更多的信息，从而使得重写查询的可能性增大。非常类似discoverer中的hierarchy的概念。&lt;br /&gt;&lt;br /&gt;create dimension sales_dimension&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--这一部分定义类似于数据库字段的别名&lt;/span&gt;&lt;br /&gt;level cust_id is customer_hierarchy.cust_id&lt;br /&gt;level zip_code is customer_hierarchy.zip_code&lt;br /&gt;level region is customer_hierarchy.region&lt;br /&gt;level day is time_hierarchy.day&lt;br /&gt;level mmyyyy is time_hierarchy.mmyyyy&lt;br /&gt;level qtr_yyyy is time_hierarchy.qtr_yyyy&lt;br /&gt;level yyyy is time_hierarchy.yyyy&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--定义其中一个层次结构&lt;/span&gt;&lt;br /&gt;hierarchy cust_rollup&lt;br /&gt;(&lt;br /&gt;cust_id child of&lt;br /&gt;zip_code child of&lt;br /&gt;region&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--定义另外一个层次结构&lt;/span&gt;&lt;br /&gt;hierarchy time_rollup&lt;br /&gt;(&lt;br /&gt;day child of&lt;br /&gt;mmyyyy child of&lt;br /&gt;qtr_yyyy child of&lt;br /&gt;yyyy&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--mmyyyy和mon_yyyy是同义词&lt;/span&gt;&lt;br /&gt;attribute mmyyyy&lt;br /&gt;determines mon_yyyy;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;DBMS_OLAP&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;通过DBMS_OLAP，可以完成如下工作：&lt;br /&gt;a. 估算物化视图的大小&lt;br /&gt;b. 验证维度对象是否有效&lt;br /&gt;c. 建议建立起它物化视图，找出需要删除的视图并重命名&lt;br /&gt;d. 评估物化视图的使用状况&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-5500141031735955192?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/5500141031735955192/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=5500141031735955192' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5500141031735955192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5500141031735955192'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/expert-one-on-one-oracle.html' title='《Expert one on one Oracle》- 物化视图 - 笔记'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-1791214829285801970</id><published>2007-08-06T11:50:00.000-07:00</published><updated>2007-08-06T11:53:39.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='索引'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert one on one Oracle'/><title type='text'>《Expert one on one Oracle》- 索引- 笔记-2</title><content type='html'>&lt;strong&gt;位图索引（略）&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;基于函数的索引（略）&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;使用索引常见问题：&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;a. 能否在视图上创建索引？只能在视图所基于的基表上创建。&lt;br /&gt;&lt;br /&gt;b. B树索引不存储完全为NULL的条目，对于索引至少其中有一列定义为NOT NULL的时候，查询才能使用索引。&lt;br /&gt;&lt;br /&gt;对于表T1，create table t1( x int, y int)，创建索引create unique index t_inx(x,y)之后，如果执行select * from t1 where x is null，执行计划显示不会利用索引。&lt;br /&gt;如果对于表T2，create table t1( x int, y int not null)，创建索引create unique index t_inx(x,y)之后，如果执行select * from t2 where x is null，执行计划显示不会利用索引。&lt;br /&gt;&lt;br /&gt;c. 为何不使用索引&lt;br /&gt;&lt;br /&gt;查询的列超出索引的列的范围。例如，在T(x,y)上创建索引，而实际的查询为Select x, y, z from t where x = 5；那么，由于查询的z列必须访问数据块才能得到，这种情况下，有可能不使用索引而效率更高。&lt;br /&gt;索引的列包含NULL值。执行Select count(*) from T查询，在索引表上建有B树索引。对于NULL值，不在索引中记录，所以不能通过索引来计算count。而会通过全表扫描的方式。&lt;br /&gt;列上建有索引，但是查询的时候在列上使用了函数。例如：select * from t where f(indexed_column)=value&lt;br /&gt;错误的使用条件。例如，对于建有索引的字符列，这列中只包含数字，使用如下查询将不会使用索引，select * from t where indexed_column = 5，将会被转换成select * from t where to_number(indexed_column) = 5。还有，对于这种TRUNC(DATE_COL) = TRUNC(SYSDATE)条件，改写成date_col between trunc(sysdate) and trunc(sysdate)+1‐1/(1*24*60*60)。&lt;br /&gt;表未分析，或者统计数据错误。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-1791214829285801970?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/1791214829285801970/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=1791214829285801970' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1791214829285801970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1791214829285801970'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/expert-one-on-one-oracle-2.html' title='《Expert one on one Oracle》- 索引- 笔记-2'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-3570637617092938813</id><published>2007-08-03T12:17:00.000-07:00</published><updated>2007-08-03T12:25:28.196-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Expert one on one Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='b树索引'/><title type='text'>《Expert one on one Oracle》- 索引- 笔记-1</title><content type='html'>&lt;strong&gt;B树索引&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;对于非唯一性索引，rowid和索引key组成唯一性。唯一性索引，oracle不将rowid加入索引的key。&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;索引压缩&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;可以对索引进行压缩，例如all_objects中有大量重复的owner，object_type的值。增加CPU的时间，减少I/O的时间。&lt;br /&gt;&lt;br /&gt;create index t_idx on all_objects(owner,object_type,object_name);&lt;br /&gt;create index t_idx on all_objects(owner,object_type,object_name) compress 1;&lt;br /&gt;create index t_idx on all_objects(owner,object_type,object_name) compress 2;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Reserve Key indexes&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;对于那些邻近得值，如果对它们创建索引，索引也是序列递增的，非常可能存放在同一个块上，这样增加冲突的可能性。通过反转，可以让索引更好的分布。但是对于条件where X&gt;5，X列上的反转索引就会失效。&lt;br /&gt;&lt;br /&gt;SQL&gt; select 90101, dump(90101,16), dump(reverse(90101),16) from dual&lt;br /&gt;  2  union all&lt;br /&gt;  3  select 90102, dump(90102,16),dump(reverse(90102),16) from dual&lt;br /&gt;  4  union all&lt;br /&gt;  5  select 90103, dump(90103,16),dump(reverse(90103),16) from dual&lt;br /&gt;  6  /&lt;br /&gt;     90101 DUMP(90101,16)        DUMP(REVERSE(90101),1&lt;br /&gt;---------- --------------------- ---------------------&lt;br /&gt;     90101 Typ=2 Len=4: c3,a,2,2 Typ=2 Len=4: 2,2,a,c3&lt;br /&gt;     90102 Typ=2 Len=4: c3,a,2,3 Typ=2 Len=4: 3,2,a,c3&lt;br /&gt;     90103 Typ=2 Len=4: c3,a,2,4 Typ=2 Len=4: 4,2,a,c3&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;降序索引&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;索引创建的时候，是按照索引字段的值升序排列，查询的时候排序因子的字段使用不同的排序方式（例如一个字段升序，一个字段降序），那么通过执行计划可以看到数据库会多执行一个Sort的步骤。这种情况下，可以建立降序索引。感觉类似于基于函数的索引。&lt;br /&gt;&lt;br /&gt;SQL&gt; CREATE TABLE T AS select * from all_objects;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--建立多个字段的索引&lt;/span&gt;&lt;br /&gt;SQL&gt; create index t_idx on t(owner,object_type,object_name);&lt;br /&gt;Index created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--结果升序排列，使用索引，执行计划中无排序步骤&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, object_type&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner between 'T' and 'Z'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  order by owner ASC,object_type ASC;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE&lt;br /&gt;   1    0   INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--结果降序排列，使用索引，有排序步骤&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, object_type&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner between 'T' and 'Z'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  order by owner DESC, object_type DESC;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;   1    0   SORT (ORDER BY)&lt;/span&gt;&lt;br /&gt;   2    1     INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--分析表&lt;/span&gt;&lt;br /&gt;SQL&gt; exec dbms_stats.gather_TABLE_stats( user, 'T' );&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--分析表之后，结果降序排列，使用索引，无排序步骤&lt;br /&gt;&lt;/span&gt;SQL&gt; select owner, object_type&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner between 'T' and 'Z'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  order by owner DESC, object_type DESC;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=7018 Bytes=10&lt;br /&gt;          5270)&lt;br /&gt;   1    0   INDEX (RANGE SCAN DESCENDING) OF 'T_IDX' (NON-UNIQUE) (Cos&lt;br /&gt;          t=7 Card=7018 Bytes=105270)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--两个字段排序方式不一致，有排序步骤&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, object_type&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner between 'T' and 'Z'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  &lt;span style="color:#ff0000;"&gt;order by owner ASC,object_type DESC;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=34 Card=7018 Bytes=1&lt;br /&gt;          05270)&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;   1    0   SORT (ORDER BY) (Cost=34 Card=7018 Bytes=105270)&lt;/span&gt;&lt;br /&gt;   2    1     INDEX (FAST FULL SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=4 C&lt;br /&gt;          ard=7018 Bytes=105270)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;--建立降序索引&lt;br /&gt;&lt;/span&gt;SQL&gt; create index desc_t_idx on t(owner ASC,object_type DESC);&lt;br /&gt;Index created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--根据排序语句建立对应索引后，无排序步骤，使用降序索引&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, object_type&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner between 'T' and 'Z'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  order by owner ASC,object_type DESC;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=7018 Bytes=10&lt;br /&gt;          5270)&lt;br /&gt;   1    0   INDEX (RANGE SCAN) OF 'DESC_T_IDX' (NON-UNIQUE) (Cost=7 Ca&lt;br /&gt;          rd=7018 Bytes=105270)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;使用B树索引的两个原则&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;a.       如果访问的记录数占整个表纪录数百分比较少。&lt;br /&gt;b.      如果索引包含足够的信息，而查询的时候需要再去查询标的数据块。&lt;br /&gt;继续上面的例子：&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--使用T-IDX索引，因为这个查询中多了object_name字段，通过T-IDX索引就不需要访问表的数据块，通过FAST FULL SCAN可以完成&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, object_type,object_name&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner between 'T' and 'Z'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  order by owner ASC,object_type DESC;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=62 Card=7018 Bytes=2&lt;br /&gt;          73702)&lt;br /&gt;&lt;br /&gt;   1    0   SORT (ORDER BY) (Cost=62 Card=7018 Bytes=273702)&lt;br /&gt;   2    1     INDEX (&lt;span style="color:#ff0000;"&gt;FAST FULL SCAN&lt;/span&gt;) OF 'T_IDX' (NON-UNIQUE) (Cost=4 C&lt;br /&gt;          ard=7018 Bytes=273702)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--再增加一个查询字段created，这两个索引中都没有这个字段，所以都需要访问表的数据块。而，查询返回的结果占表纪录行的大部分（owner between 'T' and 'Z'），通过先访问索引再访问数据块，效率更低。Oracle选择全表扫描。&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, object_type,object_name,created&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner between 'T' and 'Z'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  order by owner ASC,object_type DESC;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=108 Card=7018 Bytes=&lt;br /&gt;          329846)&lt;br /&gt;&lt;br /&gt;   1    0   SORT (ORDER BY) (Cost=108 Card=7018 Bytes=329846)&lt;br /&gt;   2    1    &lt;span style="color:#ff0000;"&gt; TABLE ACCESS (FULL)&lt;/span&gt; OF 'T' (Cost=40 Card=7018 Bytes=3298&lt;br /&gt;          46)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--限定只返回少量的纪录，发现又重新开始使用索引。&lt;/span&gt;&lt;br /&gt;SQL&gt; select owner, object_type,object_name,created&lt;br /&gt;  2  from t&lt;br /&gt;  3  where owner = 'T'&lt;br /&gt;  4  and object_type is not null&lt;br /&gt;  5  order by owner ASC,object_type DESC;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=31 Card=1046 Bytes=4&lt;br /&gt;          9162)&lt;br /&gt;&lt;br /&gt;   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=31 Card=1046 By&lt;br /&gt;          tes=49162)&lt;br /&gt;&lt;br /&gt;   2    1     &lt;span style="color:#ff0000;"&gt;INDEX (RANGE SCAN) OF 'DESC_T_IDX'&lt;/span&gt; (NON-UNIQUE) (Cost=2&lt;br /&gt;          Card=1046)&lt;br /&gt;&lt;br /&gt;当然上述两条原则并不是适用于任何情况，有许多因素影响到执行计划。下面这个例子说明数据的存储对索引的影响。通过建立两张表，一张无序存储，一张有序存储，来比较两种情况下使用索引所消耗的资源和时间。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--创建有序存储的表，相邻记录存储在同一个数据块&lt;br /&gt;&lt;/span&gt;SQL&gt; create table colocated ( x int, y varchar2(2000) ) pctfree 0;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; begin&lt;br /&gt;  2     for i in 1 .. 100000&lt;br /&gt;  3     loop&lt;br /&gt;  4             insert into colocated values ( i, rpad(dbms_random.random,75,'*'&lt;br /&gt;) );&lt;br /&gt;  5     end loop;&lt;br /&gt;  6  end;&lt;br /&gt;  7  /&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--同一个数据块储存数据不相邻&lt;/span&gt;&lt;br /&gt;SQL&gt; create table disorganized nologging pctfree 0&lt;br /&gt;  2  as&lt;br /&gt;  3  select x, y from colocated ORDER BY y&lt;br /&gt;  4  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--创建主健，同时也会创建索引&lt;/span&gt;&lt;br /&gt;SQL&gt; alter table colocated    add constraint colocated_pk    primary key(x);&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table disorganized add constraint disorganized_pk primary key(x);&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; set timing on&lt;br /&gt;SQL&gt; set autotrace traceonly&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--对于有序存储的数据，查询的时候只有3000的逻辑I/O，时间为0.03秒&lt;br /&gt;&lt;/span&gt;SQL&gt; select * from COLOCATED where x between 20000 and 40000;&lt;br /&gt;&lt;br /&gt;20001 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:00.03&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE&lt;br /&gt;   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'COLOCATED'&lt;br /&gt;   2    1     INDEX (RANGE SCAN) OF 'COLOCATED_PK' (UNIQUE)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;        156  recursive calls&lt;br /&gt;          0  db block gets&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;       2908  consistent gets&lt;/span&gt;&lt;br /&gt;         43  physical reads&lt;br /&gt;          0  redo size&lt;br /&gt;    1805701  bytes sent via SQL*Net to client&lt;br /&gt;      15162  bytes received via SQL*Net from client&lt;br /&gt;       1335  SQL*Net roundtrips to/from client&lt;br /&gt;          4  sorts (memory)&lt;br /&gt;          0  sorts (disk)&lt;br /&gt;      20001  rows processed&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--对于无序存储的数据，查询的时候只有将近20000的逻辑I/O，时间为8秒。同样的数据和索引，相对而言，无序存储的数据使用索引查询消耗更多的时间。&lt;/span&gt;&lt;br /&gt;SQL&gt; select * from DISORGANIZED where x between 20000 and 40000;&lt;br /&gt;20001 rows selected.&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:08.00&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE&lt;br /&gt;   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'DISORGANIZED'&lt;br /&gt;   2    1     INDEX (RANGE SCAN) OF 'DISORGANIZED_PK' (UNIQUE)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;        156  recursive calls&lt;br /&gt;          0  db block gets&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;      21388  consistent gets&lt;/span&gt;&lt;br /&gt;       1119  physical reads&lt;br /&gt;          0  redo size&lt;br /&gt;    1805701  bytes sent via SQL*Net to client&lt;br /&gt;      15162  bytes received via SQL*Net from client&lt;br /&gt;       1335  SQL*Net roundtrips to/from client&lt;br /&gt;          4  sorts (memory)&lt;br /&gt;          0  sorts (disk)&lt;br /&gt;      20001  rows processed&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--对于无序存储的数据，强制用全表扫描只需要0.04秒，说明全表扫描比使用索引更有效。那为什么Oracle执行计划中为什么不使用全表扫描来查询呢？在CBO的优化模式下，因为没有对表进行分析，Oracle并没有足够的信息来选择最优的执行路径。下面对表进行分析&lt;/span&gt;。&lt;br /&gt;SQL&gt; select /*+ FULL(DISORGANIZED) */ * from DISORGANIZED where x between 20000&lt;br /&gt;and 40000;&lt;br /&gt;20001 rows selected.&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:00.04&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=105 Card=220 Bytes=2&lt;br /&gt;          23300)&lt;br /&gt;&lt;br /&gt;   1    0   TABLE ACCESS (FULL) OF 'DISORGANIZED' (Cost=105 Card=220 B&lt;br /&gt;          ytes=223300)&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;         60  recursive calls&lt;br /&gt;          0  db block gets&lt;br /&gt; &lt;span style="color:#ff0000;"&gt;      2407  consistent gets&lt;/span&gt;&lt;br /&gt;          1  physical reads&lt;br /&gt;          0  redo size&lt;br /&gt;    1805701  bytes sent via SQL*Net to client&lt;br /&gt;      15162  bytes received via SQL*Net from client&lt;br /&gt;       1335  SQL*Net roundtrips to/from client&lt;br /&gt;          2  sorts (memory)&lt;br /&gt;          0  sorts (disk)&lt;br /&gt;      20001  rows processed&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--分析表&lt;/span&gt;&lt;br /&gt;SQL&gt; set autotrace off;&lt;br /&gt;SQL&gt; set timing off;&lt;br /&gt;SQL&gt; analyze table colocated&lt;br /&gt;  2  compute statistics&lt;br /&gt;  3  for table&lt;br /&gt;  4  for all indexes&lt;br /&gt;  5  for all indexed columns&lt;br /&gt;  6  /&lt;br /&gt;Table analyzed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--分析表&lt;/span&gt;&lt;br /&gt;SQL&gt; analyze table disorganized&lt;br /&gt;  2  compute statistics&lt;br /&gt;  3  for table&lt;br /&gt;  4  for all indexes&lt;br /&gt;  5  for all indexed columns&lt;br /&gt;  6  /&lt;br /&gt;Table analyzed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--一旦分析完成，可以查询user_indexes表中的CLUSTERING_FACTOR字段的值。如果这个值接近数据块的数量，证明这张表是存储相当好。单个索引叶子节点的索引项通常指向同一个数据块。如果这个值接近数据行的数量，说明这张表是随机存储的。单个索引叶子节点的索引项通常不指向同一个数据块。如上的两张表中，表'COLOCATED_PK'的主健的CLUSTERING_FACTOR字段的值为1073，接近块的数量，存储有序。表'DISORGANIZED_PK'的主健CLUSTERING_FACTOR字段的值为99907，接近行的数量，存储无序。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; select a.index_name,&lt;br /&gt;  2         b.num_rows,&lt;br /&gt;  3        b.blocks,&lt;br /&gt;  4        a.clustering_factor&lt;br /&gt;  5    from user_indexes a, user_tables b&lt;br /&gt;  6  where index_name in ('COLOCATED_PK', 'DISORGANIZED_PK' )&lt;br /&gt;  7    and a.table_name = b.table_name&lt;br /&gt;  8  /&lt;br /&gt;&lt;br /&gt;INDEX_NAME                       NUM_ROWS     BLOCKS CLUSTERING_FACTOR&lt;br /&gt;------------------------------ ---------- ---------- -----------------&lt;br /&gt;COLOCATED_PK                       100000       1073              &lt;span style="color:#ff0000;"&gt;1073&lt;/span&gt;&lt;br /&gt;DISORGANIZED_PK                    100000       1076             &lt;span style="color:#ff0000;"&gt;99907&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;SQL&gt; set timing on&lt;br /&gt;SQL&gt; set autotrace traceonly&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;--经过表分析之后，Oracle拥有足够的信息知道通过全表访问更有效，这个时候不用通过增加hint，Oracle会自动选择全表扫描的方式查询。&lt;/span&gt;&lt;br /&gt;SQL&gt; select * from DISORGANIZED where x between 20000 and 30000;&lt;br /&gt;10001 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Elapsed: 00:00:00.01&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=105 Card=9995 Bytes=&lt;br /&gt;          839580)&lt;br /&gt;&lt;br /&gt;   1    0   &lt;span style="color:#ff0000;"&gt;TABLE ACCESS (FULL)&lt;/span&gt; OF 'DISORGANIZED' (Cost=105 Card=9995&lt;br /&gt;          Bytes=839580)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statistics&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;          0  recursive calls&lt;br /&gt;          0  db block gets&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;       1743  consistent gets&lt;/span&gt;&lt;br /&gt;          0  physical reads&lt;br /&gt;          0  redo size&lt;br /&gt;     903094  bytes sent via SQL*Net to client&lt;br /&gt;       7825  bytes received via SQL*Net from client&lt;br /&gt;        668  SQL*Net roundtrips to/from client&lt;br /&gt;          0  sorts (memory)&lt;br /&gt;          0  sorts (disk)&lt;br /&gt;      10001  rows processed&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-3570637617092938813?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/3570637617092938813/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=3570637617092938813' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3570637617092938813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/3570637617092938813'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/expert-one-on-one-oracle-1.html' title='《Expert one on one Oracle》- 索引- 笔记-1'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-5190745714782948857</id><published>2007-08-01T18:38:00.000-07:00</published><updated>2008-11-13T01:58:02.818-08:00</updated><title type='text'>Personalization: 从并发定义Form打开可执行Form</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;p&gt;Oracle Form Personalization的Demo， 从用户定义界面的职责列表中，选中某一个职责行然后从Tools菜单中，选中子菜单打开职责定义界面察看职责的详细信息。仿照这个Demo，练习了一个从并发程序定义界面，打开并发可执行界面，察看和这个并发程序关联的可执行的详细信息。&lt;br /&gt;&lt;br /&gt;Personalization分为两部分，一部分是针对并发程序Form的，主要功能是定义打开可执行的菜单，打开可执行的Form。另一部分是针对可执行Form的，主要功能是根据从并发程序传递过来的可执行的参数，进行查询显示。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;并发程序Form的Personalization&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;1. 打开Personalization的界面&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;选择“Application Developer”职责，打开“Concurrent-&gt;Program”。然后从Help菜单打开Personalize。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916464680716722" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RrE6CTDOybI/AAAAAAAAAHE/fTwA1IPdx5w/s400/open+menu.JPG" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;2. 定义Executable Details的菜单 &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置条件：&lt;/strong&gt;&lt;br /&gt;定义只对职责“Application Developer”有效。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915352284186786" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RrE5BjDOyKI/AAAAAAAAAE8/l9Tc3cBZZgE/s400/2.+init+menu+condition.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Action：&lt;/strong&gt;&lt;br /&gt;新增一个菜单“Executions”，指定Menu Entry为SPECIAL1，这样菜单会挂在TOOLS下。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915360874121410" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RrE5CDDOyMI/AAAAAAAAAFM/C9l0xIeYjr8/s400/3.+init+menu+action.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;3. 设置判断逻辑&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;如果当前的Execution Name域没有可执行的名称，那么如果用户这个时候点击“Executions”菜单，提示错误。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Condition：&lt;/strong&gt;&lt;br /&gt;根据Item项CONC_PROG.EXECUTABLE_ID是否有值来判断。&lt;br /&gt;注意，这里的Trigger为所定义菜单“SPECIAL1”。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915365169088738" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RrE5CTDOyOI/AAAAAAAAAFc/0ziBU_ImcNA/s400/4.+Not+selected+condition.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Action：&lt;/strong&gt;&lt;br /&gt;通过Message类型的错误，显示提示信息。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915365169088722" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RrE5CTDOyNI/AAAAAAAAAFU/ZUUK9DgOQbA/s400/4.+Not+selected+action.JPG" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;4. 打开菜单&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Condition：&lt;/strong&gt;&lt;br /&gt;根据Item项CONC_PROG.EXECUTABLE_ID是否有值来判断。&lt;br /&gt;注意，这里的Trigger为所定义菜单“SPECIAL1”。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915713061439762" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RrE5WjDOyRI/AAAAAAAAAF0/3MnDaZO5wzU/s400/5.+Entered+execution+condition.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Action1：&lt;/strong&gt;&lt;br /&gt;将CONC_PROG.EXECUTABLE_ID值放入全局变量XX_EXECUTION_ID保存起来。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915700176537842" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RrE5VzDOyPI/AAAAAAAAAFk/hxBx-mD-6cg/s400/5.+Entered+execution+action1.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Action2：&lt;/strong&gt;&lt;br /&gt;通过执行FND_FNDCPMPE，将可执行的界面&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915708766472450" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RrE5WTDOyQI/AAAAAAAAAFs/q7Czb8SvTn4/s400/5.+Entered+execution+action2.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;可执行Form的Personalization：&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;5. 打开Personalization的界面&lt;/strong&gt;&lt;br /&gt;选择“Application Developer”职责，打开“Concurrent-&gt;Executable”。然后从Help菜单打开Personalize。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915352284186802" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RrE5BjDOyLI/AAAAAAAAAFE/8Zq5nqkF1pE/s400/2.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;6. 初始化查询变量 &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Condition：&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915721651374386" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RrE5XDDOyTI/AAAAAAAAAGE/S8ctVzZrFIk/s400/22+init+vairlous+condition.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Action：&lt;/strong&gt;&lt;br /&gt;初始化全局变量XX_EXECUTION_ID。这里比较关键的一点是“Property Name”一定要选择“INITIAL VALUE”而不是“VALUE”。选择“INITIAL VALUE”表示，如果原来全局变量XX_EXECUTION_ID已经初始化，那么这里不会对其再次赋值。这种设置适应于从并发程序Form打开可执行Form的情况，因为在并发程序Form中已经对XX_EXECUTION_ID初始化，在可执行的Form中就需要保持这个变量原来值，而不是将其覆盖。如果设置“VALUE”，那么这里的赋值语句将会执行。设置为“VALUE”适应于直接打开可执行Form的情况。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093915717356407074" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RrE5WzDOySI/AAAAAAAAAF8/3JYTjowSA3A/s400/22+init+vairlous+action.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;7. 进入查询界面（类似于按下F11）&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;设置Condition：&lt;/strong&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916206982678866" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RrE5zTDOyVI/AAAAAAAAAGU/939qJ5a-0ro/s400/23+Enter+query+mode+condition.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Action：&lt;/strong&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916202687711554" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RrE5zDDOyUI/AAAAAAAAAGM/GhA_fmSEk_c/s400/23+Enter+query+mode+action.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;8. 设置查询的可执行的ID并执行查询（类似于按下Ctrl + F11）&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;设置Condition：&lt;/strong&gt;&lt;br /&gt;注意这里的Processing Mode为“Only in Enter-Query Mode”&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916215572613506" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RrE5zzDOyYI/AAAAAAAAAGs/icbiyyKajLY/s400/24+Execute+query+condition1.JPG" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;设置Action1：&lt;/strong&gt;&lt;br /&gt;将全局变量XX_EXECUTION_ID的值赋给FND_EXECUTABLES.EXECUTABLE_ID，类似于输入了可执行的名称。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916206982678882" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RrE5zTDOyWI/AAAAAAAAAGc/uXL90VqYqiA/s400/24+Execute+query+action1.JPG" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;设置Action2：&lt;br /&gt;&lt;/strong&gt;执行查询，类似于按下Ctrl + F11。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916211277646194" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_LVEyZaW7hys/RrE5zjDOyXI/AAAAAAAAAGk/nE2_Ya3lF2A/s400/24+Execute+query+action2.JPG" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;9. 重置全局变量&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;让其他直接打开可执行Form的用户，不至于打开Form的时候就进入已经查询出某个可执行的Form。如果重值变量为Null，当用户直接打开可执行Form的用户，第一个Condition将不会满足，将会显示一个“干净”的可执行Form。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Condition：&lt;/strong&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916460385749410" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RrE6CDDOyaI/AAAAAAAAAG8/kkNr4NFfyNs/s400/25+null+out+golbal.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Action：&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5093916460385749394" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_LVEyZaW7hys/RrE6CDDOyZI/AAAAAAAAAG0/NU6wUJqfF_s/s400/25+null+out+action.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-5190745714782948857?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/5190745714782948857/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=5190745714782948857' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5190745714782948857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5190745714782948857'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/personalization-formform.html' title='Personalization: 从并发定义Form打开可执行Form'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LVEyZaW7hys/RrE6CTDOybI/AAAAAAAAAHE/fTwA1IPdx5w/s72-c/open+menu.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-5238282429642965054</id><published>2007-08-01T14:52:00.000-07:00</published><updated>2008-11-13T01:58:03.133-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internal Server Error'/><category scheme='http://www.blogger.com/atom/ns#' term='工作簿'/><category scheme='http://www.blogger.com/atom/ns#' term='discoverer viewer'/><category scheme='http://www.blogger.com/atom/ns#' term='Sheet'/><title type='text'>同名Sheet引起Discoverer Viewer的“Internal Server Error”</title><content type='html'>&lt;div&gt;一个工作簿，以前存入数据库共享给用户。昨天通过Discoverer Viewer打开工作簿查询数据的时候，出现如下拷屏的错误（Internal Server Error）。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5093854101755578498" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RrEBUTDOyII/AAAAAAAAAEs/IuJeuAGTreM/s400/error+info.PNG" border="0" /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;查询Apache相关日志，只发现“14664 internal servlet error in server”。 &lt;/li&gt;&lt;li&gt;发现只针对这一个工作簿，存在这个问题。 &lt;/li&gt;&lt;li&gt;通过Discoverer Desktop可以打开这个工作簿并且可以查询出结果。 &lt;/li&gt;&lt;li&gt;将工作簿保存到本地然后再重新存入数据库，问题依然存在。 &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;后来发现，这个工作簿竟然有两个同样的名字“Sheet 1”，如果尝试通过手工建立两张同名的Sheets，这是不允许的。一定是Oracle内部发生了什么错误，从而产生两张同样的Sheets。 &lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5093854179064989842" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RrEBYzDOyJI/AAAAAAAAAE0/8w0wzbNBEk8/s400/same+sheet+name.PNG" border="0" /&gt;&lt;/p&gt;&lt;br /&gt;将其中一个删除或者更名，搞定问题。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-5238282429642965054?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/5238282429642965054/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=5238282429642965054' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5238282429642965054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5238282429642965054'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/08/sheetdiscoverer-viewerinternal-server.html' title='同名Sheet引起Discoverer Viewer的“Internal Server Error”'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LVEyZaW7hys/RrEBUTDOyII/AAAAAAAAAEs/IuJeuAGTreM/s72-c/error+info.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-7827605128374963967</id><published>2007-07-27T19:15:00.000-07:00</published><updated>2008-11-13T01:58:03.718-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows XP'/><category scheme='http://www.blogger.com/atom/ns#' term='discoverer 4i'/><title type='text'>Install discoverer 4i in windows XP</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;需要调优一个工作簿，参考Metalink上的一篇文章，一种比较方便方法直接更改desktop注册表中的一个条目的值便可以进行诊断。由于是通过Citrix的方式访问Discoverer Desktop，并没有Citrix那台主机的管理员权限，所以想在自己的机器上安装Discoverer Desktop。&lt;br /&gt;&lt;br /&gt;下面是安装的过程：&lt;br /&gt;&lt;strong&gt;1. 下载Discoverer Desktop4.1.37。&lt;br /&gt;&lt;/strong&gt;下载Discoverer Desktop Edition, Version 4.1.37 for MS Windows 95/98/NT/2000。&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;2. 安装Discoverer Desktop4.1.37。&lt;br /&gt;&lt;/strong&gt;接压安装文件，右健点击Setup.exe，点击“Properties”菜单，在弹出的属性窗口中切换到“Compatibility”页。选中“Compatibility mode”的复选框，然后选择“Windows 2000”作为兼容模式。点击确定。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5092067090417764338" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/RqqoCjDOx_I/AAAAAAAAADk/47An1tmG7Js/s320/3.PNG" border="0" /&gt;&lt;br /&gt;运行Setup.exe文件安装。&lt;br /&gt;&lt;br /&gt;如果以前的机器没有安装Oracle相关产品，可以直接跳到步骤3。由于我的机器原来安装有Oracle 9i，如果在安装的时候新建立一个Oracle Home，安装会提示让你必须选在Oracle 9i所对应的Oracle Home。这个时候，如果选择Oracle 9i对应的Oracle Home，安装会提示目录已经存在就是不让你继续。&lt;br /&gt;&lt;br /&gt;在网上找到答案，根本的原因就是安装数据库的时候，没有使用DEFAULT_HOEM。有两种方法。&lt;br /&gt;方法一，删除Oracle数据库，现安装Discoverer，再安装数据库，其实不简单。&lt;br /&gt;方法二，修改注册表中。找到注册表中的健值，HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ALL_HOMES，建立一个new key，并建立对应的String value（NAME，NLS_LANG,PATH-等）。例如：NAME: Oracle_Default，NLS_LANG :NA，PATH: C:\Oracle_Default其中PATH为自己定义的DEFAULT目录。&lt;br /&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5092071282305845346" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_LVEyZaW7hys/Rqqr2jDOyGI/AAAAAAAAAEc/Edr99T80u_g/s400/1.PNG" border="0" /&gt;&lt;br /&gt;将ALL_HOMES下的Oracle_Default的值改为刚才上面定义的“Oracle_Default”。原来的值为Oracle9i的Oracle Home。&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5092071497054210162" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_LVEyZaW7hys/RqqsDDDOyHI/AAAAAAAAAEk/r4uBrSFAdW4/s400/2.PNG" border="0" /&gt;&lt;br /&gt;运行Oracle Home Selector，选中Oracle_Default。&lt;br /&gt;然后再运行安装程序，选中Oracle_Default进行安装。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. 安装补丁3201601，将版本升级到4.1.48.6.0。&lt;br /&gt;&lt;/strong&gt;同样需要更改兼容性。如果不升级，连接EBS的时候，会出现用户名和密码错误的提示，从而不能登录。&lt;br /&gt;&lt;br /&gt;参考：Metalink：Note:365285.1 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-7827605128374963967?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/7827605128374963967/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=7827605128374963967' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7827605128374963967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7827605128374963967'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/install-discoverer-4i-in-windows-xp.html' title='Install discoverer 4i in windows XP'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LVEyZaW7hys/RqqoCjDOx_I/AAAAAAAAADk/47An1tmG7Js/s72-c/3.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-5117547412241469231</id><published>2007-07-26T07:14:00.000-07:00</published><updated>2007-07-27T07:32:13.437-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dbms_stats'/><category scheme='http://www.blogger.com/atom/ns#' term='Gather Schema Statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='ebs'/><category scheme='http://www.blogger.com/atom/ns#' term='fnd_stats'/><title type='text'>EBS表定时分析</title><content type='html'>EBS中默认定义了并发程序对数据库对象的进行分析，从而对基于Cost的优化器能够有效的工作。这些并发程序主要通过调用程序包FND_STATS来完成。而实际上，这几个并发程序并不是很方便。例如Gather Schema Statistics算是比较方便的一个，一次可以对数据库中的某个Schema下的对象进行分析。但是如果Oracle中有这么多的Schema，需要提交很多次请求才能完成。实际中，通过自己编写的并发程序来完成批量多个Schema下对象的分析。&lt;br /&gt;&lt;br /&gt;Gather Table Statistics&lt;br /&gt;Backup Table Statistics&lt;br /&gt;Restore Table Statistics&lt;br /&gt;Gather Schema Statistics&lt;br /&gt;Gather Column Statistics&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;步骤：&lt;br /&gt;1. 通过SQL*PLUS程序，SPOOL实际饱含分析语句的fnd_stats_run.sql文件，输出到一个应用的目录下，例如$FND_TOP。在这个文件中，对每一个需要分析的对象，都有如下三行语句组成，例如，对于ABM.ABM_BATCH_CALCS：&lt;br /&gt;&lt;br /&gt;EXEC DBMS_STATS.DELETE_TABLE_STATS(ownname =&gt; 'ABM', tabname =&gt; 'ABM_BATCH_CALCS');&lt;br /&gt;ANALYZE TABLE ABM.ABM_BATCH_CALCS ESTIMATE STATISTICS SAMPLE 1 ROWS;&lt;br /&gt;EXEC FND_STATS.GATHER_TABLE_STATS(ownname=&gt;'ABM',tabname=&gt;'ABM_BATCH_CALCS',percent=&gt;30,degree=&gt;1,granularity=&gt;'DEFAULT');&lt;br /&gt;&lt;br /&gt;所以，在这个SQL*PLUS中，可以自己编写逻辑确定哪些Schema下的对象需要分析，根据表的记录数，确定分析的百分比等。&lt;br /&gt;&lt;br /&gt;2. 将步骤1种程序定义成并发程序FND STATS PRODUCE。&lt;br /&gt;&lt;br /&gt;3. 将步骤1中输出到$FND_TOP目录下的SQL*PLUS程序fnd_stats_run.sql，定义成并发程序FND STATS RUN。&lt;br /&gt;&lt;br /&gt;4. 定义请求集，将上述两个请求加入请求集。并定义，只有当FND STATS PRODUCE运行成功之后，才运行FND STATS RUN。&lt;br /&gt;&lt;br /&gt;5. 最后，定时运行请求集。&lt;br /&gt;&lt;br /&gt;在ITPub上提问调查，到底要不要使用系统自带并发程序，意见还真多，FYI:&lt;br /&gt;&lt;a href="http://www.itpub.net/822695.html"&gt;http://www.itpub.net/822695.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-5117547412241469231?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/5117547412241469231/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=5117547412241469231' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5117547412241469231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5117547412241469231'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/ebs.html' title='EBS表定时分析'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6155692779522571157</id><published>2007-07-25T09:31:00.000-07:00</published><updated>2007-07-26T09:37:14.739-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><category scheme='http://www.blogger.com/atom/ns#' term='zero'/><category scheme='http://www.blogger.com/atom/ns#' term='XML Publisher'/><title type='text'>XML Publisher的Excel输出文件字段前面的所有零不丢失</title><content type='html'>&lt;p&gt;在Itpub上看到问题，Metalink上正好有人问到这个问题，测试通过。&lt;/p&gt;&lt;p&gt;问题：&lt;br /&gt;请教在Oracle XML Publisher，如何解决Excel输出文件自动使前面的所有零不丢失？现在用Excel输出文件时，如果某一个值，如001，会只显示1，自动使前面的所有零丢失。暂时只能加一个单引号，如‘001，避免此情况，但不是好办法，用户需要做修正工作，量多了挺讨厌的。如加一个不可见字符，XML文件报错。有否一个不可见字符，可以使XML文件不报错，或其它办法，以实现上述目的？&lt;/p&gt;&lt;p&gt;方法：&lt;br /&gt;In the rtf template, use the “Insert -&gt; Symbol” function to insert a very small0xA0 (NO-BREAK SPACE) character (font size 1 or 2pt) in front of the number string field.&lt;/p&gt;&lt;p&gt;另外，尝试用Oracle以及Word自带的formate是否都没有办法，Oracle的formate语法支持数字和日期。&lt;/p&gt;&lt;p&gt;参考：&lt;br /&gt;Metalink:Note:417811.1&lt;br /&gt;&lt;a href="http://www.itpub.net/820447.html"&gt;http://www.itpub.net/820447.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6155692779522571157?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6155692779522571157/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6155692779522571157' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6155692779522571157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6155692779522571157'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/xml-publisherexcel.html' title='XML Publisher的Excel输出文件字段前面的所有零不丢失'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-7181471621634814609</id><published>2007-07-24T19:55:00.000-07:00</published><updated>2007-07-25T20:10:58.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML Publisher'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrent program'/><category scheme='http://www.blogger.com/atom/ns#' term='Blob'/><title type='text'>publish image with xml publisher in ebs</title><content type='html'>本文通过一个例子，展示怎样在EBS使用XMLP输出报表，并在报表中输出存储在数据库Blob字段中的图片。下面将整个开发的过程简略描述一下， EBS 版本为11.5.10.2。&lt;br /&gt;1) 建立数据表。&lt;br /&gt;2) 载入数据。&lt;br /&gt;3) 编写数据编码的函数。&lt;br /&gt;4) 编写报表。&lt;br /&gt;5) 注册并发请求。&lt;br /&gt;6) 运行并发请求，得到用于开发的临时XML数据文件。&lt;br /&gt;7) 开发模板文件。&lt;br /&gt;8) 注册XMLP的数据和模板文件。&lt;br /&gt;9) 运行检查结果。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;例子以及拷屏请参考Itpub帖子：&lt;a href="http://www.itpub.net/815723.html"&gt;http://www.itpub.net/815723.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;已经在Itpub发布，获得一个精华，高兴!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-7181471621634814609?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/7181471621634814609/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=7181471621634814609' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7181471621634814609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7181471621634814609'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/publish-image-with-xml-publisher-in-ebs.html' title='publish image with xml publisher in ebs'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-5461630542860076158</id><published>2007-07-11T14:32:00.000-07:00</published><updated>2007-07-11T15:01:48.104-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Function'/><category scheme='http://www.blogger.com/atom/ns#' term='ebs'/><category scheme='http://www.blogger.com/atom/ns#' term='costumer top'/><title type='text'>Error:Function not available to this responsibility</title><content type='html'>新环境克隆出来，用户发现对于所有的客户化Form都不能访问，提示的错误为：&lt;br /&gt;Function not available to this responsibility. Change responsibilities or contact you System Administrator.&lt;br /&gt;&lt;br /&gt;按照Responsibility，Menu，Function检查，相关定义都没有更改。对比了另外一个环境，发现，发现应用层的服务器上相关Costumer的TOP目录都没有在环境中设置。通过echo $CUSTOMER_TOP，输出为空。所以，当通过Function去找Form的时候，就会遇到如上的错误。&lt;br /&gt;&lt;br /&gt;回头想想，问题本应该这样：&lt;br /&gt;1） Form和Report在不同的tie上，客户化的Report都没有问题，只有客户化的Form有问题。&lt;br /&gt;2） 客户化的Menu指向一个客户化的Function（Function对应客户化Form）有问题，如果指向系统标准的Function（例如：Standard Request Submit）没有问题。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-5461630542860076158?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/5461630542860076158/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=5461630542860076158' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5461630542860076158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5461630542860076158'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/errorfunction-not-available-to-this.html' title='Error:Function not available to this responsibility'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-4333744531053110848</id><published>2007-07-08T18:27:00.000-07:00</published><updated>2007-07-08T18:29:23.368-07:00</updated><title type='text'>XML Publisher</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;已经在itpub中看到不少的关于xml publisher的文章了，在网上已经找到一个非常好入门例子：&lt;br /&gt;&lt;/span&gt;&lt;a href="http://oracle.anilpassi.com/xml-publisher-concurrent-program-xmlp.html"&gt;&lt;span style="font-size:100%;"&gt;XML Publisher Concurrent Program - XMLP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://oracle.anilpassi.com/xml-publisher-concurrent-program-xmlp.html"&gt;&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-4333744531053110848?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/4333744531053110848/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=4333744531053110848' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4333744531053110848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4333744531053110848'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/xml-publisher.html' title='XML Publisher'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-2001057620102438285</id><published>2007-07-05T08:31:00.000-07:00</published><updated>2007-07-06T08:36:25.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='嵌套表'/><category scheme='http://www.blogger.com/atom/ns#' term='临时表'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='对象表'/><title type='text'>《Expert one on one Oracle》- 表- 笔记-4</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;strong&gt;嵌套表&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;类似于父/子表，但是有较大的差别。其中一个就是，在嵌套表中，父表中有多少行，就有多少嵌套表。使用嵌套表的两种方法：PL/SQL以及存储机制。&lt;br /&gt;创建，查询，更新嵌套表的例子：&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace type emp_type&lt;br /&gt;2 as object&lt;br /&gt;3 (empno number(4),&lt;br /&gt;4 ename varchar2(10),&lt;br /&gt;5 job varchar2(9),&lt;br /&gt;6 mgr number(4),&lt;br /&gt;7 hiredate date,&lt;br /&gt;8 sal number(7, 2),&lt;br /&gt;9 comm number(7, 2)&lt;br /&gt;10 );&lt;br /&gt;11 /&lt;br /&gt;Type created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace type emp_tab_type&lt;br /&gt;2 as table of emp_type&lt;br /&gt;3 /&lt;br /&gt;Type created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table dept_and_emp&lt;br /&gt;2 (deptno number(2) primary key,&lt;br /&gt;3 dname varchar2(14),&lt;br /&gt;4 loc varchar2(13),&lt;br /&gt;5 emps emp_tab_type&lt;br /&gt;6 )&lt;br /&gt;7 nested table emps store as emps_nt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table emps_nt add constraint emps_empno_unique&lt;br /&gt;2 unique(empno)&lt;br /&gt;3 /&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into dept_and_emp&lt;span style="color:#ff0000;"&gt;--插入嵌套表&lt;/span&gt;&lt;br /&gt;2 select dept.*,&lt;br /&gt;3 CAST( multiset( select empno, ename, job, mgr, hiredate, sal, comm&lt;br /&gt;4 from emp&lt;br /&gt;5 where emp.deptno = dept.deptno ) AS emp_tab_type )&lt;br /&gt;6 from dept&lt;br /&gt;7 /&lt;br /&gt;5 rows created.&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--multiset告诉Oracle子查询可能返回多行&lt;br /&gt;--CAST告诉Oracle将返回结果作为一个集合&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into table&lt;span style="color:#ff0000;"&gt;--插入嵌套子表&lt;/span&gt;&lt;br /&gt;2 ( select emps from dept_and_emp where deptno = 10 )&lt;br /&gt;3 values&lt;br /&gt;4 ( 1234, 'NewEmp', 'CLERK', 7782, sysdate, 1200, null );&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; delete from table&lt;span style="color:#ff0000;"&gt;--删除嵌套子表&lt;/span&gt;&lt;br /&gt;2 ( select emps from dept_and_emp where deptno = 20 )&lt;br /&gt;3 where ename = 'SCOTT';&lt;br /&gt;1 row deleted.&lt;br /&gt;&lt;br /&gt;SQL&gt; select d.dname, e.empno, ename&lt;span style="color:#ff0000;"&gt;--查询嵌套子表&lt;/span&gt;&lt;br /&gt;2 from dept_and_emp d, table(d.emps) e&lt;br /&gt;3 where d.deptno in ( 20 );&lt;br /&gt;&lt;br /&gt;DNAME EMPNO ENAME&lt;br /&gt;-------------- ---------- ----------&lt;br /&gt;RESEARCH 7369 SMITH&lt;br /&gt;RESEARCH 7566 JONES&lt;br /&gt;RESEARCH 7876 ADAMS&lt;br /&gt;RESEARCH 7902 FORD&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; update&lt;span style="color:#ff0000;"&gt;--更新嵌套子表&lt;/span&gt;&lt;br /&gt;2 table( select emps&lt;br /&gt;3 from dept_and_emp&lt;br /&gt;4 where deptno = 10&lt;br /&gt;5 )&lt;br /&gt;6 set comm = 100&lt;br /&gt;7 /&lt;br /&gt;3 rows updated.&lt;br /&gt;&lt;br /&gt;SQL&gt; update&lt;br /&gt;2 table( select emps&lt;br /&gt;3 from dept_and_emp&lt;br /&gt;4 where deptno = 1&lt;br /&gt;5 )&lt;br /&gt;6 set comm = 100&lt;br /&gt;7 /&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;update&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-22908: reference to NULL table value&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;通过exp/imp可以查看到嵌套表的创建语句。通过运行如下的语句，可以进一步得到：&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT SQL_TEXT FROM V$SQL WHERE UPPER(SQL_TEXT) LIKE&lt;br /&gt;2 '%EMP%';&lt;br /&gt;……&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;SELECT /*+NESTED_TABLE_GET_REFS+*/ NESTED_TABLE_ID,SYS_NC_ROWINFO$ FROM "SCOTT"."EMPS_NT"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;--执行上述查询出来的SQL语句&lt;br /&gt;SQL&gt; SELECT /*+NESTED_TABLE_GET_REFS+*/ NESTED_TABLE_ID,SYS_NC_ROWINFO$&lt;br /&gt;2 from&lt;br /&gt;3 "SCOTT"."EMPS_NT";&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--得到表EMPS_NT中两列的值&lt;/span&gt;&lt;br /&gt;NESTED_TABLE_ID&lt;br /&gt;--------------------------------&lt;br /&gt;SYS_NC_ROWINFO$(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;A704A65FA4D14709807E86B8741D5ED7&lt;br /&gt;EMP_TYPE(7782, 'CLARK', 'MANAGER', 7839, '09-JUN-81', 2450, 100)&lt;br /&gt;&lt;br /&gt;A704A65FA4D14709807E86B8741D5ED7&lt;br /&gt;EMP_TYPE(7839, 'KING', 'PRESIDENT', NULL, '17-NOV-81', 5000, 100)&lt;br /&gt;&lt;br /&gt;A704A65FA4D14709807E86B8741D5ED7&lt;br /&gt;EMP_TYPE(7934, 'MILLER', 'CLERK', 7782, '23-JAN-82', 1300, 100)&lt;br /&gt;&lt;br /&gt;实际上，这两列NESTED_TABLE_ID，SYS_NC_ROWINFO$被隐藏。NESTED_TABLE_ID列是父表实际的外健，SYS_NC_ROWINFO$列，让ORACLE将一列看作一个对象。通过这种方式，ORACLE通过系统产生的主健和外健实现父子表。可以查看系统为父表创建的主健：&lt;br /&gt;&lt;br /&gt;SQL&gt; select name&lt;br /&gt;2 from sys.col$&lt;br /&gt;3 where obj# = ( select object_id&lt;br /&gt;4 from user_objects&lt;br /&gt;5 where object_name = 'DEPT_AND_EMP')&lt;br /&gt;6 /&lt;br /&gt;&lt;br /&gt;NAME&lt;br /&gt;------------------------------&lt;br /&gt;DEPTNO&lt;br /&gt;DNAME&lt;br /&gt;LOC&lt;br /&gt;EMPS&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;SYS_NC0000400005$&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;系统为父表创建了一列SYS_NC0000400005$，为子表的外健，通过如下查询可以确定:&lt;br /&gt;&lt;br /&gt;SQL&gt; select SYS_NC0000400005$ from dept_and_emp WHERE SYS_NC0000400005$ = 'A704A&lt;br /&gt;65FA4D14709807E86B8741D5ED7';&lt;br /&gt;&lt;br /&gt;SYS_NC0000400005$&lt;br /&gt;--------------------------------&lt;br /&gt;A704A65FA4D14709807E86B8741D5ED7&lt;br /&gt;&lt;br /&gt;从而通过NESTED_TABLE_GET_REFS可以单独查询子表，例如：&lt;br /&gt;SQL&gt; select &lt;span style="color:#ff0000;"&gt;/*+ nested_table_get_refs */&lt;/span&gt; empno, ename from emps_nt where ename l&lt;br /&gt;ike '%AR%';&lt;br /&gt;&lt;br /&gt;EMPNO ENAME&lt;br /&gt;---------- ----------&lt;br /&gt;7782 CLARK&lt;br /&gt;7521 WARD&lt;br /&gt;7654 MARTIN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;通过如上查询结果，嵌套表的物理结构为：&lt;br /&gt;如果EXP/IMP嵌套表，那么可以发现嵌套表的定义中有RETURN AS VALUE因子，这表示会将潜套表行全部返回给应用的客户端。可以改写为RETURN AS LOCATOR，那么只是将指针方会给应用的客户端。&lt;br /&gt;&lt;br /&gt;同时，从上面的例子可以看到，嵌套子表系统创建的主健实际上是没有索引的，而在访问这个子表的时候，ORACLE总是需要关联这个字段，所以最好为这个字段创建索引。更进一步，最好的方式将嵌套子表建立成索引组指表。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;临时表&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;创建临时表时并不分配存储参数。当运行的时候，一个SESSION第一次将数据存入临时表，一个临时段将会创建。每个SESSION都有自己的临时段。&lt;br /&gt;&lt;br /&gt;ORACLE的临时表应该预先创建了，只是通常情况下它们都没有数据，直到SESSION存入数据。有两种类型的临时表，基于SESSION的/基于事务的。&lt;br /&gt;&lt;br /&gt;create global temporary table temp_table_session&lt;br /&gt;on commit preserve rows--on commit delete rows&lt;br /&gt;as&lt;br /&gt;select * from scott.emp where 1=0&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;临时表的限制：&lt;br /&gt;a. 不能定义参考完整性约束&lt;br /&gt;b. 不能有VARRAY和NESTED TABLE类型的列&lt;br /&gt;c. 不能是IOT/分区表/索引（HASH）CLUSTER表&lt;br /&gt;d. 不能通过ANALYZE产生统计信息&lt;br /&gt;&lt;br /&gt;针对最后一条，如果需要临时表在运行的时候有参考的统计信息，可以采用如下的方式：&lt;br /&gt;a. 创建与临时表一样的普通表（表名，数据量都相同），创建索引&lt;br /&gt;b. 对表和索引进行分析&lt;br /&gt;c. 将统计信息导出&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;dbms_stats.create_stat_table( ownname =&gt; USER,&lt;br /&gt;stattab =&gt; 'STATS');&lt;br /&gt;&lt;br /&gt;dbms_stats.export_table_stats( ownname =&gt; USER,&lt;br /&gt;tabname =&gt; 'TEMP_ALL_OBJECTS',&lt;br /&gt;stattab =&gt; 'STATS');&lt;br /&gt;&lt;br /&gt;dbms_stats.export_index_stats( ownname =&gt; USER,&lt;br /&gt;indname =&gt; 'TEMP_ALL_OBJECTS_IDX',&lt;br /&gt;stattab =&gt; 'STATS');&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;d. 删除普通表，创建临时表&lt;br /&gt;e. 导入步骤c中导出的统计信息&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;dbms_stats.import_table_stats( ownname =&gt; USER,&lt;br /&gt;tabname =&gt; 'TEMP_ALL_OBJECTS',&lt;br /&gt;stattab =&gt; 'STATS');&lt;br /&gt;dbms_stats.import_index_stats( ownname =&gt; USER,&lt;br /&gt;indname =&gt; 'TEMP_ALL_OBJECTS_IDX',&lt;br /&gt;stattab =&gt; 'STATSʹ');&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;对象表&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;对象表和嵌入表类似，ORACLE为了维持对象表，在普通表上增加了许多隐藏的东西。其实，其最终还是转换成关系型数据库的行和列。所以，对于物理存储的表而言，倾向于不使用对象表，因为不会知道背后隐藏的机制究竟会产生什么样的副作用。当然在存储过程，程序开发中使用是一个不错的选择。例如，用对象视图来同步对象与数据库数据。&lt;br /&gt;&lt;br /&gt;SQL&gt; create table people_tab&lt;br /&gt;2 ( name varchar2(30) primary key,&lt;br /&gt;3 dob date,&lt;br /&gt;4 home_city varchar2(30),&lt;br /&gt;5 home_street varchar2(30),&lt;br /&gt;6 home_state varchar2(2),&lt;br /&gt;7 home_zip number,&lt;br /&gt;8 work_city varchar2(30),&lt;br /&gt;9 work_street varchar2(30),&lt;br /&gt;10 work_state varchar2(2),&lt;br /&gt;11 work_zip number&lt;br /&gt;12 )&lt;br /&gt;13 /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace type address_type&lt;br /&gt;2 as object&lt;br /&gt;3 ( city varchar2(30),&lt;br /&gt;4 street varchar2(30),&lt;br /&gt;5 state varchar2(2),&lt;br /&gt;6 zip number&lt;br /&gt;7 )&lt;br /&gt;8 /&lt;br /&gt;Type created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace type person_type&lt;br /&gt;2 as object&lt;br /&gt;3 ( name varchar2(30),&lt;br /&gt;4 dob date,&lt;br /&gt;5 home_address address_type,&lt;br /&gt;6 work_address address_type&lt;br /&gt;7 )&lt;br /&gt;8 /&lt;br /&gt;Type created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create view people of person_type&lt;br /&gt;2 with object identifier (name)&lt;br /&gt;3 as&lt;br /&gt;4 select name,dob,&lt;br /&gt;5 address_type(home_city,home_street,home_state,home_zip) home_a&lt;br /&gt;6 address_type(work_city,work_street,work_state,work_zip) work_a&lt;br /&gt;7 from people_tab&lt;br /&gt;8 /&lt;br /&gt;View created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into people values ( 'Tom','15-mar-1965',&lt;br /&gt;2 address_type( 'Reston','123 Main Street','Va','45678' ),&lt;br /&gt;3 address_type( 'Redwood','1 Oracle Way','Ca','23456' ) );&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; select name, p.home_address.city from people p;&lt;br /&gt;NAME HOME_ADDRESS.CITY&lt;br /&gt;------------------------------ ------------------------------&lt;br /&gt;Tom Reston&lt;br /&gt;&lt;br /&gt;SQL&gt; select name from people_tab;&lt;br /&gt;NAME&lt;br /&gt;------------------------------&lt;br /&gt;Tom&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-2001057620102438285?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/2001057620102438285/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=2001057620102438285' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2001057620102438285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/2001057620102438285'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/expert-one-on-one-oracle-4.html' title='《Expert one on one Oracle》- 表- 笔记-4'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-4396549567466191230</id><published>2007-07-03T13:30:00.000-07:00</published><updated>2007-07-03T13:34:48.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HASH CLUSTER'/><category scheme='http://www.blogger.com/atom/ns#' term='CLUSTER'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>《Expert one on one Oracle》- 表- 笔记-3</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;strong&gt;聚簇表&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Cluster就是将拥有相同列的一些表存储在同一个数据块上，将相关数据存储在一起。例如：值为a的行都存储在同一个数据块上。Cluster不同于IOT，是以堆的形式存储。&lt;br /&gt;&lt;br /&gt;看一个Cluster的定义：&lt;br /&gt;create cluster emp_dept_cluster&lt;br /&gt;( deptno number(2) )&lt;br /&gt;size 1024&lt;br /&gt;/&lt;br /&gt;Size指定有1024byte的数据每个cluster的key值相关。对于8k的block而言，大概每个块将会存储7个cluster keys。当插入的值不在这些cluster keys中，那么将会插入新的块。Size影响cluster使用的最重要的参数，这个值太大，会造成存储空间的浪费，值太小，会影响到造成过多数据链（类似于IOT的overflow）。&lt;br /&gt;&lt;br /&gt;create index emp_dept_cluster_idx&lt;br /&gt;on cluster emp_dept_cluster&lt;br /&gt;/&lt;br /&gt;这条数据的主要工作就是根据cluster的key值，返回块中包含key值的地址。Key实际上是主健。首先会查找cluster key，然后决定block的地址，从而读取数据。&lt;br /&gt;&lt;br /&gt;create table dept_clu&lt;br /&gt;( deptno number(2) primary key,&lt;br /&gt;  dname  varchar2(14),&lt;br /&gt;  loc    varchar2(13)&lt;br /&gt;)&lt;br /&gt;cluster emp_dept_cluster(deptno)&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;create table emp_clu&lt;br /&gt;( empno number primary key,&lt;br /&gt;  ename varchar2(10),&lt;br /&gt;  job   varchar2(9),&lt;br /&gt;  mgr   number,&lt;br /&gt;  hiredate date,&lt;br /&gt;  sal   number,&lt;br /&gt;  comm  number,&lt;br /&gt;  deptno number(2) references dept(deptno)&lt;br /&gt;)&lt;br /&gt;cluster emp_dept_cluster(deptno)&lt;br /&gt;/&lt;br /&gt;和普通表相同，除了多了一个关键词cluster，告诉Oracle哪一列映射到cluster的cluster key。&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;   for x in ( select * from scott.dept )&lt;br /&gt;   loop&lt;br /&gt;               insert into dept_clu&lt;br /&gt;               values ( x.deptno, x.dname, x.loc );&lt;br /&gt;               insert into emp_clu&lt;br /&gt;               select *&lt;br /&gt;                 from scott.emp&lt;br /&gt;                where deptno = x.deptno;&lt;br /&gt;   end loop;&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;如果通过如下两个SQL查询，可以发现这两个表的数据都存储在同一个数据块上。&lt;br /&gt;SELECT ROWID, deptno, DBMS_ROWID.rowid_block_number (ROWID) BLOCK&lt;br /&gt;FROM dept_clu;&lt;br /&gt;&lt;br /&gt;SELECT ROWID, deptno, DBMS_ROWID.rowid_block_number (ROWID) BLOCK&lt;br /&gt;FROM emp_clu;&lt;br /&gt;&lt;br /&gt;上述的例子是插入dept_clu的值然后再插入emp_clu表中和这个值关联的值，为什么不先完全插入完成dept_clu，然后再插入emp_clu呢？如果这样，由于dept_clu中dept中行很小，根据size设置为1024，每块就能存储下7个cluster key相关的行。当完成dept_clu的插入之后，再插入emp_clu。由于emp_clu的行比较大，可能针对一个cluster key，超过1024byte的大小，从而造成了过多的数据链。而采用上述方式载入数据，就会以更紧凑的方式存储数据，而一定是每块7个cluster key。&lt;br /&gt;&lt;br /&gt;分别以两种方式载入数据进行对比：&lt;br /&gt;SQL&gt; create table dept_clu&lt;br /&gt;  2  ( deptno number(2) primary key,&lt;br /&gt;  3    dname  varchar2(14),&lt;br /&gt;  4    loc    varchar2(13)&lt;br /&gt;  5  )&lt;br /&gt;  6  cluster emp_dept_cluster(deptno)&lt;br /&gt;  7  /&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table emp_clu&lt;br /&gt;  2  ( empno number primary key,&lt;br /&gt;  3  ename varchar2(10),&lt;br /&gt;  4  job varchar2(9),&lt;br /&gt;  5  mgr number,&lt;br /&gt;  6  hiredate date,&lt;br /&gt;  7  sal number,&lt;br /&gt;  8  comm number,&lt;br /&gt;  9  deptno number(2) references dept(deptno),&lt;br /&gt; 10  data char(1000) default '*'--与前面不同，这里更改了行大小&lt;br /&gt; 11  )&lt;br /&gt; 12  cluster emp_dept_cluster(deptno)&lt;br /&gt; 13  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--以顺序的方式插入&lt;br /&gt;&lt;/span&gt;SQL&gt; insert into dept_clu select * from scott.dept;&lt;br /&gt;5 rows created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into emp_clu select emp.*,'*' from scott.emp;&lt;br /&gt;14 rows created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--Highlight部分显示超过半数emp的block与dept不在同一个block&lt;br /&gt;&lt;/span&gt;SQL&gt; select dbms_rowid.rowid_block_number(dept_clu.rowid) dept_rid,&lt;br /&gt;  2  dbms_rowid.rowid_block_number(emp_clu.rowid) emp_rid,&lt;br /&gt;  3  dept_clu.deptno&lt;br /&gt;  4  from emp_clu, dept_clu&lt;br /&gt;  5  where emp_clu.deptno = dept_clu.deptno&lt;br /&gt;  6  /&lt;br /&gt;&lt;br /&gt;  DEPT_RID    EMP_RID     DEPTNO&lt;br /&gt;---------- ---------- ----------&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;        18         20         10&lt;br /&gt;        18         19         10&lt;br /&gt;        18         19         10&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;        18         18         20&lt;br /&gt;        18         18         20&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;        18         20         20&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;        18         19         20&lt;br /&gt;        18         19         20&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;        18         18         30&lt;br /&gt;        18         18         30&lt;br /&gt;        18         18         30&lt;br /&gt;        18         18         30&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;        18         19         30&lt;br /&gt;        18         19         30&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;14 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--以交叉的方式插入&lt;/span&gt;&lt;br /&gt;SQL&gt; begin&lt;br /&gt;  2  for x in ( select * from scott.dept )&lt;br /&gt;  3  loop&lt;br /&gt;  4  insert into dept_clu&lt;br /&gt;  5   values ( x.deptno, x.dname, x.loc );&lt;br /&gt;  6   insert into emp_clu&lt;br /&gt;  7   select emp.*,'x'&lt;br /&gt;  8  from scott.emp&lt;br /&gt;  9  where deptno = x.deptno;&lt;br /&gt; 10   end loop;&lt;br /&gt; 11  end;&lt;br /&gt; 12  /&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--Highlight部分显示只有两个emp的block与dept不在同一个block&lt;/span&gt;&lt;br /&gt;SQL&gt; select dbms_rowid.rowid_block_number(dept_clu.rowid) dept_rid,&lt;br /&gt;  2  dbms_rowid.rowid_block_number(emp_clu.rowid) emp_rid,&lt;br /&gt;  3  dept_clu.deptno&lt;br /&gt;  4  from emp_clu, dept_clu&lt;br /&gt;  5  where emp_clu.deptno = dept_clu.deptno&lt;br /&gt;  6  /&lt;br /&gt;&lt;br /&gt;  DEPT_RID    EMP_RID     DEPTNO&lt;br /&gt;---------- ---------- ----------&lt;br /&gt;        19         19         30&lt;br /&gt;        19         19         30&lt;br /&gt;        19         19         30&lt;br /&gt;        19         19         30&lt;br /&gt;        19         19         30&lt;br /&gt;        19         19         30&lt;br /&gt;        20         20         20&lt;br /&gt;        20         20         20&lt;br /&gt;        20         20         20&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;        20         18         20&lt;br /&gt;        20         18         20&lt;/span&gt;&lt;br /&gt;        20         20         10&lt;br /&gt;        20         20         10&lt;br /&gt;        20         20         10&lt;br /&gt;14 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;什么情况下不使用cluster？&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;a.      更新比较频繁的表。&lt;br /&gt;b.      需要经常全表扫描的表。因为可能需要扫描更多的表。&lt;br /&gt;c.      需要频繁truncate的表。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;什么情况下使用cluster?&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;a.      数据主要用来读取，通过索引读取，join比较频繁的表。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Hash Cluster Table&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;在Hash Cluster Table中，对于一行得健值，Oracle通过内部或者外部函数进行三列（hash）计算，从而决定着一行应该在磁盘位置。采用Hash算法的一个副作用是，如果没有表上建立索引，不能对hash cluster中的表进行range scan。例如：对于select * from emp where deptno between 10 and 20，如果表emp在hash cluster中，那么将会是全表扫描。&lt;br /&gt;&lt;br /&gt;在Index Cluster Table中，空间是动态分配的，而在hash cluster table中，空间预先分配的。空间的计算公式为：(HASHKEYS/trunc(blocksize/SIZE))。&lt;br /&gt;&lt;br /&gt;散列表有冲突值也是可以OK的。冲突的值被散列表聚簇在一起，这也是散列表的特性。这也是为什么Oracle需要指定HASHKEY和SIZE。当然，要避免那些没有预期的冲突。例如：指定HASHKEY为1000（实际应该为1009，取最接近素数），如果在这个表中放入1100个部分，那么至少就会存在一个冲突。&lt;br /&gt;&lt;br /&gt;通过一个SHOW_SPACE的存储过程看，创建一个HASH_CLUSTER，然后查看其空间使用的情况。&lt;br /&gt;SQL&gt; create or replace&lt;br /&gt;  2  procedure show_space&lt;br /&gt;  3  ( p_segname in varchar2,&lt;br /&gt;  4    p_owner   in varchar2 default user,&lt;br /&gt;  5    p_type    in varchar2 default 'TABLE',&lt;br /&gt;  6    p_partition in varchar2 default NULL )&lt;br /&gt;  7  as&lt;br /&gt;  8      l_free_blks                 number;&lt;br /&gt;  9&lt;br /&gt; 10      l_total_blocks              number;&lt;br /&gt; 11      l_total_bytes               number;&lt;br /&gt; 12      l_unused_blocks             number;&lt;br /&gt; 13      l_unused_bytes              number;&lt;br /&gt; 14      l_LastUsedExtFileId         number;&lt;br /&gt; 15      l_LastUsedExtBlockId        number;&lt;br /&gt; 16      l_last_used_block           number;&lt;br /&gt; 17      procedure p( p_label in varchar2, p_num in number )&lt;br /&gt; 18      is&lt;br /&gt; 19      begin&lt;br /&gt; 20          dbms_output.put_line( rpad(p_label,40,'.')&lt;br /&gt; 21                                p_num );&lt;br /&gt; 22      end;&lt;br /&gt; 23  begin&lt;br /&gt; 24      dbms_space.free_blocks&lt;br /&gt; 25      ( segment_owner     =&gt; p_owner,&lt;br /&gt; 26        segment_name      =&gt; p_segname,&lt;br /&gt; 27        segment_type      =&gt; p_type,&lt;br /&gt; 28       partition_name    =&gt; p_partition,&lt;br /&gt; 29        freelist_group_id =&gt; 0,&lt;br /&gt; 30        free_blks         =&gt; l_free_blks );&lt;br /&gt; 31&lt;br /&gt; 32      dbms_space.unused_space&lt;br /&gt; 33      ( segment_owner     =&gt; p_owner,&lt;br /&gt; 34        segment_name      =&gt; p_segname,&lt;br /&gt; 35        segment_type      =&gt; p_type,&lt;br /&gt; 36       partition_name    =&gt; p_partition,&lt;br /&gt; 37        total_blocks      =&gt; l_total_blocks,&lt;br /&gt; 38        total_bytes       =&gt; l_total_bytes,&lt;br /&gt; 39        unused_blocks     =&gt; l_unused_blocks,&lt;br /&gt; 40        unused_bytes      =&gt; l_unused_bytes,&lt;br /&gt; 41        last_used_extent_file_id =&gt; l_LastUsedExtFileId,&lt;br /&gt; 42        last_used_extent_block_id =&gt; l_LastUsedExtBlockId,&lt;br /&gt; 43        last_used_block =&gt; l_last_used_block );&lt;br /&gt; 44&lt;br /&gt; 45      p( 'Free Blocks', l_free_blks );&lt;br /&gt; 46      p( 'Total Blocks', l_total_blocks );&lt;br /&gt; 47      p( 'Total Bytes', l_total_bytes );&lt;br /&gt; 48      p( 'Unused Blocks', l_unused_blocks );&lt;br /&gt; 49      p( 'Unused Bytes', l_unused_bytes );&lt;br /&gt; 50      p( 'Last Used Ext FileId', l_LastUsedExtFileId );&lt;br /&gt; 51      p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );&lt;br /&gt; 52      p( 'Last Used Block', l_last_used_block );&lt;br /&gt; 53  end;&lt;br /&gt; 54  /&lt;br /&gt;&lt;br /&gt;Procedure created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create cluster hash_cluster&lt;br /&gt;  2  ( hash_key number )&lt;br /&gt;  3  hashkeys 1000&lt;br /&gt;  4  size 8192&lt;br /&gt;  5  /&lt;br /&gt;&lt;br /&gt;Cluster created.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec show_space('HASH_CLUSTER',user,'CLUSTER');&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; set serveroutput on;&lt;br /&gt;SQL&gt; exec show_space('HASH_CLUSTER',user,'CLUSTER');&lt;br /&gt;Free Blocks.............................0&lt;br /&gt;Total Blocks............................1024&lt;br /&gt;Total Bytes.............................8388608&lt;br /&gt;Unused Blocks...........................14&lt;br /&gt;Unused Bytes............................114688&lt;br /&gt;Last Used Ext FileId....................12&lt;br /&gt;Last Used Ext BlockId...................1033&lt;br /&gt;Last Used Block.........................114&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;可以看到，为这个一共分配了1024个块，其中有14个未使用的，1个块用于管理extends，所以共有1024-14-1共有1009个块在HWM下。1009也是1000之后下一个素数。所以，ORACLE总共为这个表分配了8192*1009空间。&lt;br /&gt;&lt;br /&gt;刚创建一张 表的时候，HWM下的块的数量为0。然而创建一个HASH CLUSTER，由于ORACLE需要初始化每一个块，类似于将数据架载到这张表上，所以花费的时间较长。同时，对于HASH CLUSTER而言，数据的多少对于全表扫描花费同样多的时间。但是不用担心，创建HASH CLUSTER主要通过HASH KEY来查找，而不是全表扫描来查找。&lt;br /&gt;&lt;br /&gt;对于数据相同的两张表，A表存入HASH CLUSTER，B表以堆表的方式存储。查询通常，A表的查询通常会消耗较多的CPU，B表的查询会消耗较多的内存。&lt;br /&gt;什么情况下使用HASH CLUSTER&lt;br /&gt;a.      在一定程度上知道表中行的数量或者上限，能够正确设置HASHKEY以及SIZE，避免重构。如果表生命周期很短，可以容易做到。&lt;br /&gt;b.      DML，特别是插入语句消耗资源很少，也不会产生太多负担，更新语句更新HASHKEY则不一样，会产生行迁移。&lt;br /&gt;c.      适合经常需要访问的数据。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-4396549567466191230?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/4396549567466191230/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=4396549567466191230' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4396549567466191230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4396549567466191230'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/expert-one-on-one-oracle-3.html' title='《Expert one on one Oracle》- 表- 笔记-3'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-7348727626783609005</id><published>2007-07-01T10:56:00.000-07:00</published><updated>2007-07-01T15:21:55.229-07:00</updated><title type='text'>INSERT堆表时，数据块写入的顺序</title><content type='html'>&lt;span style="font-size:100%;"&gt;读到《Expert one on one Oracle》表部分，TOM说，对于堆表数据的插入，数据会被写到最适合的块，而不是以特定的顺序写入。&lt;br /&gt;&lt;br /&gt;进行了测试，了解了FREELIST的部分结构，虽然还有一个疑问，记录于此，以后再解决。表空间非ASSM。&lt;br /&gt;&lt;br /&gt;SQL&gt; show parameters db_block_size--8k大小的 block&lt;br /&gt;NAME TYPE VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;db_block_size integer 8192&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t ( i number, a varchar2(4000), b varchar2(4000) );&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; select FILE_ID, block_id, blocks from dba_extents where segment_name = 'T'&lt;br /&gt;AND OWNER = 'SCOTT';&lt;span style="color:#ff0000;"&gt;--找到这个表所对应SEGMETN的头，对于8k数据块来说，数据块是从第9个块开始的&lt;br /&gt;&lt;/span&gt;FILE_ID BLOCK_ID BLOCKS&lt;br /&gt;---------- ---------- ----------&lt;br /&gt;12 9 8&lt;br /&gt;&lt;br /&gt;SQL&gt; alter system dump datafile 12 block 9;&lt;span style="color:#ff0000;"&gt;--dump segment header&lt;/span&gt;&lt;br /&gt;System altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;nfl = 1,&lt;/span&gt; nfb = 1 typ = 1 nxf = 0 ccnt = 0&lt;br /&gt;SEG LST:: &lt;span style="color:#ff0000;"&gt;flg: UNUSED&lt;/span&gt; lhd: 0x00000000 ltl: 0x00000000&lt;br /&gt;End dump data blocks tsn: 13 file#: 12 minblk 9 maxblk 9&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;-- 根据nfl得知，有一个freelist，根据flag得知，这个freelist尚未使用&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t values ( 1, rpad('*',100,'*'), rpad('*',100,'*') );&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT ROWID, i, DBMS_ROWID.rowid_object (ROWID) OBJECT,&lt;br /&gt;2 DBMS_ROWID.rowid_relative_fno (ROWID) file_no,&lt;br /&gt;3 DBMS_ROWID.rowid_block_number (ROWID) BLOCK,&lt;br /&gt;4 DBMS_ROWID.rowid_row_number (ROWID) rowno&lt;br /&gt;5 FROM t;&lt;br /&gt;ROWID I OBJECT FILE_NO BLOCK ROWNO&lt;br /&gt;------------------ ---------- ---------- ---------- ---------- ----------&lt;br /&gt;AAAHkEAAMAAAAAKAAA 1 30980 12 10 0&lt;br /&gt;&lt;br /&gt;SQL&gt; alter system dump datafile 12 block 10;&lt;span style="color:#ff0000;"&gt;--插入数据位于第10块，dump出来&lt;br /&gt;&lt;/span&gt;System altered.&lt;br /&gt;&lt;br /&gt;Block header dump: 0x0300000a&lt;br /&gt;Object id on Block? Y&lt;br /&gt;seg/obj: 0x7904 csc: 0x00.55c15a itc: 2 &lt;span style="color:#ff0000;"&gt;flg: O&lt;/span&gt; typ: 1 - DATA&lt;br /&gt;fsl: 0 fnx: 0x0 ver: 0x01&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--根据flag得知，这个块在freelist上&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; alter system dump datafile 12 block 9;&lt;br /&gt;System altered.&lt;br /&gt;&lt;br /&gt;alter system dump datafile 12 block 9;&lt;br /&gt;nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1&lt;br /&gt;SEG LST:: &lt;span style="color:#ff0000;"&gt;flg: USED&lt;/span&gt; lhd: 0x0300000a ltl: 0x0300000a&lt;br /&gt;End dump data blocks tsn: 13 file#: 12 minblk 9 maxblk 9&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--顺便看一下block9, flg标示已经变为USED， lhd的值指向block 10的&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;SQL&gt; insert into t values ( 2, rpad('*',3900,'1'), rpad('*',3900,'1') );&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT ROWID, i, DBMS_ROWID.rowid_object (ROWID) OBJECT,&lt;br /&gt;2 DBMS_ROWID.rowid_relative_fno (ROWID) file_no,&lt;br /&gt;3 DBMS_ROWID.rowid_block_number (ROWID) BLOCK,&lt;br /&gt;4 DBMS_ROWID.rowid_row_number (ROWID) rowno&lt;br /&gt;5 FROM t;&lt;br /&gt;ROWID I OBJECT FILE_NO BLOCK ROWNO&lt;br /&gt;------------------ ---------- ---------- ---------- ---------- ----------&lt;br /&gt;AAAHkEAAMAAAAAKAAA 1 30980 12 10 0&lt;br /&gt;AAAHkEAAMAAAAALAAA 2 30980 12 11 0&lt;br /&gt;&lt;br /&gt;SQL&gt; alter system dump datafile 12 block 10;&lt;br /&gt;System altered.&lt;br /&gt;&lt;br /&gt;alter system dump datafile 12 block 10;&lt;br /&gt;Block header dump: 0x0300000a&lt;br /&gt;Object id on Block? Y&lt;br /&gt;seg/obj: 0x7904 csc: 0x00.55c15a itc: 2 &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;flg: -&lt;/span&gt;&lt;/strong&gt; typ: 1 - DATA&lt;br /&gt;fsl: 0 fnx: 0x0 ver: 0x01&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--flg的值为"-"，表示当插入第二行的时候，block10已经从freelist中移掉。 为什么？？？block10有超过 8k*pctfree的空间啊？&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;SQL&gt; alter system dump datafile 12 block 11;&lt;br /&gt;System altered.&lt;br /&gt;Block header dump: 0x0300000b&lt;br /&gt;Object id on Block? Y&lt;br /&gt;seg/obj: 0x7904 csc: 0x00.55c5b5 itc: 2 flg: O typ: 1 - DATA&lt;br /&gt;fsl: 0 fnx: 0x0 ver: 0x01&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;--block11这个时候已经加入freelist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;结论：如果不是assm类型表空间，存在这种可能block不能被插入一个新的数据的时候将从 freelist中摘掉了&lt;br /&gt;&lt;br /&gt;后续问题： oracle根据什么算法，将block10丛freelist移除？ 不应该啊，因为block10有超过 8k*pctfree的空间。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;参考：&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.itpub.net/803823.html"&gt;&lt;strong&gt;&lt;span style="font-size:100%;"&gt;在itpub的求助贴&lt;/span&gt;&lt;/strong&gt; &lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://school.kyuanma.com/article/233/250/2006/2006102820338.html"&gt;Oracle Freelist和HWM原理及性能优化&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-7348727626783609005?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/7348727626783609005/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=7348727626783609005' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7348727626783609005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7348727626783609005'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/07/insert.html' title='INSERT堆表时，数据块写入的顺序'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-5944392343764011583</id><published>2007-06-29T08:43:00.000-07:00</published><updated>2007-07-01T08:48:48.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OVERFLOW'/><category scheme='http://www.blogger.com/atom/ns#' term='IOT'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>《Expert one on one Oracle》- 表- 笔记-2</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;堆表&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;平常我们使用的绝大多数的表都是堆表。堆，在数据结构中就是一块大的空间，磁盘或者内存，并以随机的方式管理。所以，查询堆表结果并不是以插入的顺序输出。&lt;br /&gt;&lt;br /&gt;SQL&gt; show parameters db_block_size;&lt;br /&gt;&lt;br /&gt;NAME                                 TYPE        VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;db_block_size                        integer     8192&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t&lt;br /&gt;  2   ( a int,&lt;br /&gt;  3   b varchar2(4000) default rpad('*',4000,'*'),&lt;br /&gt;  4   c varchar2(3000) default rpad('*',3000,'*')&lt;br /&gt;  5   )&lt;br /&gt;  6  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t (a) values ( 1);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t (a) values ( 2);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t (a) values ( 3);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; delete from t where a = 2 ;&lt;br /&gt;1 row deleted.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t (a) values ( 4);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT a, DBMS_ROWID.rowid_object (ROWID) OBJECT,&lt;br /&gt;  2         DBMS_ROWID.rowid_relative_fno (ROWID) file_no,&lt;br /&gt;  3         DBMS_ROWID.rowid_block_number (ROWID) BLOCK,&lt;br /&gt;  4         DBMS_ROWID.rowid_row_number (ROWID) rowno&lt;br /&gt;  5    FROM t; ;--输出顺序不是134，而是143, 最后插入的块被插入到中间的块&lt;br /&gt;&lt;br /&gt;         A     OBJECT    FILE_NO      BLOCK      ROWNO&lt;br /&gt;---------- ---------- ---------- ---------- ----------&lt;br /&gt;         1      30943         12         10          0&lt;br /&gt;         4      30943         12         11          1&lt;br /&gt;         3      30943         12         12          0&lt;br /&gt;&lt;br /&gt;创建表的时候有非常多选项，但是我们通常只需要关心PCTFREE，PCTUSED，INITRANS，FREELISTS。通过如下的方式可以查看创建过程的其他参数：创建的内容在T.SQL文件中。&lt;br /&gt;exp userid=scott/scott tables=t&lt;br /&gt;imp userid=scott/scott full=y indexfile=t.sql&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;索引组织表&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;以索引的结构存储数据的表。表的数据就是索引，索引也即数据。相对堆表来讲，索引表需要更高的管理和维护成本。因为索引表的存储是顺序的，所以对于数据的增删改都需要较大的成本。&lt;br /&gt;&lt;br /&gt;对于更新相对少的表，可以考虑使用索引表，例如一些代码表等。还有，对于那些物理上希望存储在一块的数据，也可以考虑使用索引表，例如：在父子表关联中，希望子表的多条记录物理上存储在一块。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;索引表的选项：&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;相对堆表，无PCTUSED。因为索引表的数据，由于数据的值已经决定它所在的数据块，而不管这块空余空间的大小。同样的原因，PCTFREE值也只在对象创建和填充索引结构的时使用。&lt;br /&gt;&lt;br /&gt;NOCRPRESS，让ORACLE存储索引和值的时候不要压缩。如果为CRPRESS，后面整形参数，表示需要压缩的列的数量。从而使得那些重复的列值不再存储。&lt;br /&gt;下面的例子中，表的owner，type是存在大量重复的。所以，可以采用压缩的方式创建索引表。&lt;br /&gt;&lt;br /&gt;如果压缩因子为2，创建完成之后，可能的存储为：&lt;br /&gt;Scott/table&lt;br /&gt;11111&lt;br /&gt;22222&lt;br /&gt;33333&lt;br /&gt;44444&lt;br /&gt;55555&lt;br /&gt;…&lt;br /&gt;99999&lt;br /&gt;如果不压缩：可能存储为：&lt;br /&gt;Scott/table/11111&lt;br /&gt;Scott/table/22222&lt;br /&gt;Scott/table/33333&lt;br /&gt;Scott/table/44444&lt;br /&gt;Scott/table/55555&lt;br /&gt;Scott/table/66666&lt;br /&gt;…&lt;br /&gt;Scott/table/99999&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;通过如下例子，对比压缩和非压缩所使用的空间。&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace&lt;br /&gt;  2  procedure show_iot_space&lt;br /&gt;  3  ( p_segname in varchar2 )&lt;br /&gt;  4  as&lt;br /&gt;  5      l_segname                   varchar2(30);&lt;br /&gt;  6      l_total_blocks              number;&lt;br /&gt;  7      l_total_bytes               number;&lt;br /&gt;  8      l_unused_blocks             number;&lt;br /&gt;  9      l_unused_bytes              number;&lt;br /&gt; 10      l_LastUsedExtFileId         number;&lt;br /&gt; 11      l_LastUsedExtBlockId        number;&lt;br /&gt; 12      l_LAST_USED_BLOCK           number;&lt;br /&gt; 13  begin&lt;br /&gt; 14      select 'SYS_IOT_TOP_'  object_id&lt;br /&gt; 15        into l_segname&lt;br /&gt; 16        from user_objects&lt;br /&gt; 17       where object_name = upper(p_segname);&lt;br /&gt; 18&lt;br /&gt; 19      dbms_space.unused_space&lt;br /&gt; 20      ( segment_owner     =&gt; user,&lt;br /&gt; 21        segment_name      =&gt; l_segname,&lt;br /&gt; 22        segment_type      =&gt; 'INDEX',&lt;br /&gt; 23        total_blocks      =&gt; l_total_blocks,&lt;br /&gt; 24        total_bytes       =&gt; l_total_bytes,&lt;br /&gt; 25        unused_blocks     =&gt; l_unused_blocks,&lt;br /&gt; 26        unused_bytes      =&gt; l_unused_bytes,&lt;br /&gt; 27        LAST_USED_EXTENT_FILE_ID =&gt; l_LastUsedExtFileId,&lt;br /&gt; 28        LAST_USED_EXTENT_BLOCK_ID =&gt; l_LastUsedExtBlockId,&lt;br /&gt; 29        LAST_USED_BLOCK =&gt; l_LAST_USED_BLOCK );&lt;br /&gt; 30&lt;br /&gt; 31      dbms_output.put_line&lt;br /&gt; 32      ( 'IOT used '  to_char(l_total_blocks-l_unused_blocks) );&lt;br /&gt; 33  end;&lt;br /&gt; 34  /&lt;br /&gt;Procedure created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table iot&lt;br /&gt;  2  ( owner, object_type, object_id,&lt;br /&gt;  3    primary key(owner,object_type,object_id)&lt;br /&gt;  4  )&lt;br /&gt;  5  organization index&lt;br /&gt;  6  NOCOMPRESS&lt;br /&gt;  7  as&lt;br /&gt;  8  select owner, object_type, object_id from all_objects&lt;br /&gt;  9  order by owner, object_type, object_id&lt;br /&gt; 10  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; set serveroutput on&lt;br /&gt;SQL&gt; exec show_iot_space( 'iot' );&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;IOT used 96&lt;br /&gt;&lt;/span&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; drop table iot;&lt;br /&gt;Table dropped.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table iot&lt;br /&gt;  2  ( owner, object_type, object_id,&lt;br /&gt;  3    primary key(owner,object_type,object_id)&lt;br /&gt;  4  )&lt;br /&gt;  5  organization index&lt;br /&gt;  6  compress 1&lt;br /&gt;  7  as&lt;br /&gt;  8  select owner, object_type, object_id from all_objects&lt;br /&gt;  9  order by owner, object_type, object_id&lt;br /&gt; 10  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec show_iot_space('iot' );&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;IOT used 74&lt;/span&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; drop table iot;&lt;br /&gt;Table dropped.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table iot&lt;br /&gt;  2  ( owner, object_type, object_id,&lt;br /&gt;  3    primary key(owner,object_type,object_id)&lt;br /&gt;  4  )&lt;br /&gt;  5  organization index&lt;br /&gt;  6  compress 2&lt;br /&gt;  7  as&lt;br /&gt;  8  select owner, object_type, object_id from all_objects&lt;br /&gt;  9  order by owner, object_type, object_id&lt;br /&gt; 10  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec show_iot_space( 'iot' );&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;IOT used 38&lt;br /&gt;&lt;/span&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;通过如上的例子可以看到，参数COMPRESS可以节省存储空间，减少I/O（通常也会消耗更多的CPU）。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PCTTHRESHOLD, OVERFLOW, and INCLUDING&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;这三个参数用来确保索引的叶块（实际存储索引数据的块）能够有效的存储数据。&lt;br /&gt;a.      OVERFLOW：当行的数据增大的时候，通过OVERFLOW设置另外一个段，可以让行数据OVERFLOW到那个段去。在OVERFLOW中也有PCTUSED，PCTFREE设置，这些都与堆表的相同。&lt;br /&gt;b.      PCTTHRESHOLD：当行的数量超过一定数量的时候，将会将行的一部分存到其他地方。对于8K的BLOCK，如果PCTTHRESHOLD为10，那么当行的大小超过800BYTE的时候，行的部分内容将不会存储在这个索引块上了。&lt;br /&gt;c.      INCLUDING：INCLUDING指定的列以及前面的列，都存储到索引块中，其他的列存储到溢出块中。&lt;br /&gt;&lt;br /&gt;这几个参数是创建IOT的重要参数，可以根据列的访问频率考虑是否需要将其放到OVERFLOW中去，可以根据一块要存储的行数来计算PCCTHRESHOLD。&lt;br /&gt;可以在IOT表上创建索引。由于IOT表的行与堆表的行不同，经常移动。IOT表中的行根据主健的值在索引结构中确定位置，当索引本身的大小和形状改变的时候，位置也会更改。所以，ORACLE采用了逻辑ROWID，ROWID基于IOT的主健。IOT表上的索引效率通常比堆表的索引低。&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-5944392343764011583?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/5944392343764011583/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=5944392343764011583' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5944392343764011583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/5944392343764011583'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/expert-one-on-one-oracle-2.html' title='《Expert one on one Oracle》- 表- 笔记-2'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6249669414717905418</id><published>2007-06-28T19:45:00.000-07:00</published><updated>2007-06-28T20:05:24.151-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='行迁移'/><category scheme='http://www.blogger.com/atom/ns#' term='PCTUSED'/><category scheme='http://www.blogger.com/atom/ns#' term='PCTFREE'/><category scheme='http://www.blogger.com/atom/ns#' term='FREELIST'/><category scheme='http://www.blogger.com/atom/ns#' term='HWM'/><category scheme='http://www.blogger.com/atom/ns#' term='表'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>《Expert one on one Oracle》- 表- 笔记-1</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;术语&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;高水位标示（HIGH WATER MARKET）&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;HWM是已经使用过的存储空间和未使用过的存储空间之间的分界线。在表刚创建的时候，HWM从第一数据块开始。随着数据插入的增多，HWM会上升。如果删除数据行，虽然部分被删除的哪些块不再包含数据，但是这些块仍然在HWM之下，HWM位置不会改变，直到HWM被重建或者TRUNCATE。ORACLE会扫描HWM下所有的块，即使这些块已经不包含数据。所以，这也会影响到性能。如果需要删除表中所有的行，尝试使用TRUNCATE。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;FREELISTS&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;对于HWM下那些还有空闲空间的块，ORACLE使用FREELIST来记录。每个对象至少有一个FREELISTS。只有在HWM下的块才可以在FREELIST中找到。如果FREELISTS已经为空，那么HWM就会上移，新增块到FREELIST。一个对象可以拥有多个FREELIST。如果一个对象只有一个FREELIST，那么对于并发访问同一些的块，就会发生块等待事件。&lt;br /&gt;&lt;br /&gt;但是也不是将FREELISTS设置越多越好。因为当一个进程用完一个FREELIST空闲块的时候，并不去使用这个对象的其他FREELIST的空闲块，而是上移HWM。如果当前的EXTENT不够，将会使用其他的EXTENT。所以，设置太多的FREELIST会造成空间上的浪费。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PCTFREE 和PCTUSED&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;这两个参数用来控制什么条件下将块加入FREELIST和从FREELIST中移除。PCTFREE默认的大小为10，意味着当块被使用了90%之后，将会从FREELIST中移除。剩下的10%的空间用于块中数据行的更新。PCTUSED的默认的大小为40，意味着对于那些不在FREELIST中的块，如果其空余空间达到61%的时候，ORACLE会将这些块重新加入到FREELIST中去。怎样设置这两个值需要根据数据处理情况，例如对于那些很少更新的数据，设置过大的PCTFREE是空间的浪费。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;行迁移&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;由于行的更新，使得行所占用的空间增大，当行原来所在数据块空间不够容纳更新后的行，行必须迁移到新的数据块上。行迁移的过程，会将行的数据迁移到新的块，同时在原来块中保留指向新行的指针。这是因为索引的物理指针仍然需要知道原来数据行的地址。由于这样，行迁移会带来更多的I/O访问（访问原来所在块，然后再通过指针访问前以后所在的块）。&lt;br /&gt;&lt;br /&gt;已经迁移到新块的行，由于被再次更新，新块的空余空间也不能容纳，这行将会再次迁移。如果原来的块中现在有足够的空间了，这行将会迁移回去。否则，将会迁移到第三个块上去。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;PCTFREE 和PCTUSED设置&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;下面的例子看设置PCTFREE和PCTUSED怎样影响FREELIST。&lt;br /&gt;SQL&gt; create table t ( x int, y char(1000) default 'x' );&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace procedure measure_usage&lt;br /&gt;2 as&lt;br /&gt;3 l_free_blks number;&lt;br /&gt;4 l_total_blocks number;&lt;br /&gt;5 l_total_bytes number;&lt;br /&gt;6 l_unused_blocks number;&lt;br /&gt;7 l_unused_bytes number;&lt;br /&gt;8 l_LastUsedExtFileId number;&lt;br /&gt;9 l_LastUsedExtBlockId number;&lt;br /&gt;10 l_LAST_USED_BLOCK number;&lt;br /&gt;11&lt;br /&gt;12 procedure get_data&lt;br /&gt;13 is&lt;br /&gt;14 begin&lt;br /&gt;15 dbms_space.free_blocks&lt;br /&gt;16 ( segment_owner =&gt; USER,&lt;br /&gt;17 segment_name =&gt; 'T',&lt;br /&gt;18 segment_type =&gt; 'TABLE',&lt;br /&gt;19 FREELIST_group_id =&gt; 0,&lt;br /&gt;20 free_blks =&gt; l_free_blks );&lt;br /&gt;21&lt;br /&gt;22 dbms_space.unused_space&lt;br /&gt;23 ( segment_owner =&gt; USER,&lt;br /&gt;24 segment_name =&gt; 'T',&lt;br /&gt;25 segment_type =&gt; 'TABLE',&lt;br /&gt;26 total_blocks =&gt; l_total_blocks,&lt;br /&gt;27 total_bytes =&gt; l_total_bytes,&lt;br /&gt;28 unused_blocks =&gt; l_unused_blocks,&lt;br /&gt;29 unused_bytes =&gt; l_unused_bytes,&lt;br /&gt;30 LAST_USED_EXTENT_FILE_ID =&gt; l_LastUsedExtFileId,&lt;br /&gt;31 LAST_USED_EXTENT_BLOCK_ID =&gt; l_LastUsedExtBlockId,&lt;br /&gt;32 LAST_USED_BLOCK =&gt; l_last_used_block ) ;&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35 dbms_output.put_line( L_free_blks ' on FREELIST, '&lt;br /&gt;36 to_number(l_total_blocks-l_unused_blocks-1 )&lt;br /&gt;&lt;br /&gt;37 ' used by table' );&lt;br /&gt;38 end;&lt;br /&gt;39 begin&lt;br /&gt;40 for i in 0 .. 10&lt;br /&gt;41 loop&lt;br /&gt;42 dbms_output.put( 'insert ' to_char(i,'00') ' ' );&lt;br /&gt;43 get_data;&lt;br /&gt;44 insert into t (x) values ( i );&lt;br /&gt;45 commit ;&lt;br /&gt;46 end loop;&lt;br /&gt;47&lt;br /&gt;48&lt;br /&gt;49 for i in 0 .. 10&lt;br /&gt;50 loop&lt;br /&gt;51 dbms_output.put( 'update ' to_char(i,'00') ' ' );&lt;br /&gt;52 get_data;&lt;br /&gt;53 update t set y = null where x = i;&lt;br /&gt;54 commit;&lt;br /&gt;55 end loop;&lt;br /&gt;56 end;&lt;br /&gt;57 /&lt;br /&gt;Procedure created.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec measure_usage&lt;br /&gt;insert 00 0 on FREELIST, 0 used by table&lt;br /&gt;insert 01 1 on FREELIST, 1 used by table&lt;br /&gt;insert 02 1 on FREELIST, 1 used by table&lt;br /&gt;insert 03 1 on FREELIST, 1 used by table&lt;br /&gt;insert 04 1 on FREELIST, 1 used by table&lt;br /&gt;insert 05 1 on FREELIST, 1 used by table&lt;br /&gt;insert 06 1 on FREELIST, 1 used by table&lt;br /&gt;insert 07 1 on FREELIST, 1 used by table&lt;br /&gt;insert 08 1 on FREELIST, 2 used by table&lt;span style="color:#ff0000;"&gt;--插入到第八行数据的时候，由于原来块上的空间不足，新增一个块供使用&lt;br /&gt;&lt;/span&gt;insert 09 1 on FREELIST, 2 used by table&lt;br /&gt;insert 10 1 on FREELIST, 2 used by table&lt;br /&gt;update 00 1 on FREELIST, 2 used by table&lt;br /&gt;update 01 1 on FREELIST, 2 used by table&lt;br /&gt;update 02 1 on FREELIST, 2 used by table&lt;br /&gt;update 03 1 on FREELIST, 2 used by table&lt;br /&gt;update 04 2 on FREELIST, 2 used by table&lt;span style="color:#ff0000;"&gt;--更新到第四行的时候，将空间返回给FREELIST&lt;br /&gt;&lt;/span&gt;update 05 2 on FREELIST, 2 used by table&lt;br /&gt;update 06 2 on FREELIST, 2 used by table&lt;br /&gt;update 07 2 on FREELIST, 2 used by table&lt;br /&gt;update 08 2 on FREELIST, 2 used by table&lt;br /&gt;update 09 2 on FREELIST, 2 used by table&lt;br /&gt;update 10 2 on FREELIST, 2 used by table&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;INITIAL, NEXT, PCTINCREASE&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;定义初始EXTENT的大小以及后续EXTENT的大小。例如：INITIAL为1，NEXT为2，PCTINCREASE为为50，那么从EXTENT的一次大小为：1M，2M，3M，4.5M。如果数据库使用本地管理的表空间，EXTENT设置为UNIFORM的，那么INITIAL等于NEXT，PCTINCREASE没有意义。如果没有使用本地管理的表空间，也建议设置INITIAL等于NEXT，将PCTINCREASE设置为0。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MINEXTENTS，MAXEXTENTS&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;设置一个对象拥有最小和最大的EXTENT。当然，最大的EXTENT表空间的限制。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;LOGGING，NOLOGGING&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;LOGGING，创建表的时候产生重做日志。使用NOLOGGING，创建表不产生重做日志，但是插入等操作仍然产生重做日志。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;INITRANS，MAXTRANS&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;对象的每个块都有一个块头。块头中有一张事务表。在这张事务表中记录那些事务锁住了这个块上的那些行。初始值由INITRANS指定，最大值有MAXTRANS指定。&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6249669414717905418?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6249669414717905418/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6249669414717905418' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6249669414717905418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6249669414717905418'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/expert-one-on-one-oracle-1_28.html' title='《Expert one on one Oracle》- 表- 笔记-1'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-7152406173311759747</id><published>2007-06-27T14:10:00.000-07:00</published><updated>2007-06-27T14:20:53.248-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SET TRANSACTION'/><category scheme='http://www.blogger.com/atom/ns#' term='ORA-01555'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>《Expert one on one Oracle》- 重做回滚- 笔记-3</title><content type='html'>&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;临时表以及重做/回滚&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Oracle不会为临时表的数据块产生重做日志，所以临时表上的操作都是不可“恢复”的。当对临时标的数据块进行更改的时候，更改的纪录不会在重做日志中记录。然而，临时表会产生回滚，回滚信息会被重做日志纪录。所以，临时表会产生重做日志。临时表之所以会产生回滚信息，这是为了支持事务中回滚。例如：临时表和普通表一样也有约束（constrain），所以当不满足约束的数据更新或者插入的临时表的时候，必须能够回滚。&lt;br /&gt;&lt;br /&gt;插入临时表产生的回滚数据非常少，查询临时表不产生回滚数据。但是更新和删除临时表数据将会产生较多的回滚信息。&lt;br /&gt;&lt;br /&gt;SQL&gt; create table perm&lt;br /&gt;  2  ( x char(2000) default 'x',&lt;br /&gt;  3    y char(2000) default 'y',&lt;br /&gt;  4    z char(2000) default 'z' )&lt;br /&gt;  5  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; create global temporary table temp&lt;br /&gt;  2  ( x char(2000) default 'x',&lt;br /&gt;  3    y char(2000) default 'y',&lt;br /&gt;  4    z char(2000) default 'z' )&lt;br /&gt;  5  on commit preserve rows&lt;br /&gt;  6  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace procedure do_sql( p_sql in varchar2 )&lt;br /&gt;  2  as&lt;br /&gt;  3      l_start_redo    number;&lt;br /&gt;  4      l_redo            number;&lt;br /&gt;  5  begin&lt;br /&gt;  6      select value into l_start_redo from redo_size;&lt;br /&gt;  7&lt;br /&gt;  8      execute immediate p_sql;&lt;br /&gt;  9      commit;&lt;br /&gt; 10&lt;br /&gt; 11      select value-l_start_redo into l_redo from redo_size;&lt;br /&gt; 12&lt;br /&gt; 13      dbms_output.put_line&lt;br /&gt; 14      ( to_char(l_redo,'9,999,999') ' bytes of redo generated for "'&lt;br /&gt; 15        substr( replace( p_sql, chr(10), ' '), 1, 25 )  '"...' );&lt;br /&gt; 16  end;&lt;br /&gt; 17  /&lt;br /&gt;&lt;br /&gt;Procedure created.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; set serveroutput on format wrapped&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; begin&lt;br /&gt;  2      do_sql( 'insert into perm (x,y,z)&lt;br /&gt;  3               select 1,1,1&lt;br /&gt;  4                 from all_objects&lt;br /&gt;  5                where rownum &lt;= 500' );&lt;br /&gt;  6&lt;br /&gt;  7      do_sql( 'insert into temp (x,y,z)&lt;br /&gt;  8               select 1,1,1&lt;br /&gt;  9                 from all_objects&lt;br /&gt; 10                where rownum &lt;= 500' );&lt;br /&gt; 11&lt;br /&gt; 12      do_sql( 'update perm set x = 2' );&lt;br /&gt; 13      do_sql( 'update temp set x = 2' );&lt;br /&gt; 14&lt;br /&gt; 15      do_sql( 'delete from perm' );&lt;br /&gt; 16      do_sql( 'delete from temp' );&lt;br /&gt; 17  end;&lt;br /&gt; 18  /&lt;br /&gt; 3,263,576 bytes of redo generated for "insert into perm (x,y,z) "...&lt;br /&gt;    58,428 bytes of redo generated for "insert into temp (x,y,z) "...&lt;br /&gt; 2,160,600 bytes of redo generated for "update perm set x = 2"...&lt;br /&gt; 1,082,848 bytes of redo generated for "update temp set x = 2"...&lt;br /&gt; 3,353,108 bytes of redo generated for "delete from perm"...&lt;br /&gt; 3,253,220 bytes of redo generated for "delete from temp"...&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;通过如上可以看到，插入非临时表产生大量的重做日志，插入临时表则只有回滚段的“重做”日志产生，所以非常小。&lt;br /&gt;&lt;br /&gt;更新非临时表产生大概两倍于更新临时表的“重做”日志。对于临时表，“镜像”前的更新被保存，而“镜像”后的更新无需保存。&lt;br /&gt;&lt;br /&gt;删除在临时表和非临时表上产生的重做日志大小基本相同。这是因为，删除操作产生大量的回滚数据，而产生的更改块的重做日志非常小。&lt;br /&gt;&lt;br /&gt;对于临时表，总结起来有如下规则：&lt;br /&gt;a.      插入操作产生相当少的回滚/重做活动。&lt;br /&gt;b.      删除操作产生的重做数量基本等于非临时表。&lt;br /&gt;c.      更新操作产生的重做数量是更新非临时表的一半（如果字段的所有的值为空，以2000bytes的值更新这个字段，那么产生的重做类似于插入操作。反之，如果字段几乎所有的值有2000bytes，全部以NULL更新，那么产生的重做类似于DELETE）。&lt;br /&gt;&lt;br /&gt;拥有如上知识后，在临时表实际的应用中，尽量只使用INSERT和SELECT操作。避免删除临时表，而是使用TRUNCATE命令或者让临时表在提交之后自行清空表。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;分析表&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;可以通过LogMiner能够将重做日志载入系统的动态表（V$），从而能够方便的查询日志。可以看到执行DML语句之后，列值的变化；可以看到重做和回滚事务的SQL；可以当删除一个表的时候Oracle在OBJ$表上删除操作。这些都有利于DBA进行分析，找到恢复所需要的数据和时间点。&lt;br /&gt;回滚&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;什么操作产生最少/最多UNDO&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;INSERT操作产生很少的UNDO，因为ORACLE只需要记录需要删除的ROW ID。UPDATE操作通常列第二位，因为ORACLE需要纪录更改的BYTES，而UPDATE通常只更新整行的部分字段。DELETE操作一般意义来说，产生最多的UNDO。因为需要纪录删除前整行的数据。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SET TRANSACTION&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;通过这个语句可以指定事务运行所使用的回滚段。一般不用使用这种方式，而是将MAXEXTENTS设置足够大，然ORACLE自动区扩展回滚段。如果需要，设置参数使得回滚段在扩展到一定大小之后，再自动缩减到一定大小。&lt;br /&gt;&lt;br /&gt;使用打得回滚段的一个主要问题就是——不能阻止其他事务使用这个回滚段。所以最好的方式是让系统挑选回滚段，并让其能够自动扩展。同时，有些工具并不支持指定回滚段。IMP不支持，SQLLDR不支持，SNAPSHOT的刷新支持。&lt;br /&gt;&lt;br /&gt;如果确实存在有一次性的大量的数据需要使用大的回滚段，也可以创建一个，然后进行处理，然后再置为OFFLINE，然后再删除。对于这种情况，将标分为几个部分，然后采用多个任务同时更新，这样各自的任务能够使用各自的回滚段，也许更有效。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ORA-01555：回滚段太旧&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;如下三个原因会造成这个错误：&lt;br /&gt;a.      回滚段太小&lt;br /&gt;b.      程序跨COMMITS取数&lt;br /&gt;c.      块清除&lt;br /&gt;&lt;br /&gt;前面两个都和ORACLE持续读相关。ORACLE使用回滚段来回滚那些查询开始后已经更改的块。通过这种方式，ORACLE提供一个连续的数据库的快照。通过两个Session来验证：&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#660000;"&gt;&lt;span style="color:#3333ff;"&gt;步骤1：&lt;br /&gt;Session 1:创建表，插入数据，更新一条数据不提交&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;SQL&gt; create table t1 ( a number );&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t1 values(1);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; update t1 set a = 10 where a = 1;&lt;br /&gt;1 row updated.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;步骤2：&lt;br /&gt;Session 2:插入数据&lt;/span&gt;&lt;br /&gt;SQL&gt; insert into t1 select *  from t1 where a = 1;&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;步骤3：&lt;br /&gt;Session 1:提交更新结果，查询表数据&lt;br /&gt;&lt;/span&gt;SQL&gt; commit;&lt;br /&gt;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;步骤4：&lt;br /&gt;Session 2: 提交插入，查询数据表&lt;/span&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from t1;&lt;span style="color:#ff0000;"&gt;--&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;由于一致性读，步骤2仍然能够插入数据&lt;br /&gt;&lt;/span&gt;         A&lt;br /&gt;----------&lt;br /&gt;        10&lt;br /&gt;         1&lt;br /&gt;&lt;br /&gt;处理这种ORA-01555的方法有：&lt;br /&gt;a.      分析表，进行块清除。&lt;br /&gt;b.      分配更大的回滚段。&lt;br /&gt;c.      优化查询SQL。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;回滚段太小造成ORA-01555的错误&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;重现错误:&lt;br /&gt;a.      Session A 发起一个查询。&lt;br /&gt;b.      Session B 发起一个更新并且提交。相关回滚信息记录在回滚段，同时因为已经提交，回滚段信息在需要的时候可能被覆盖。假定第1000个数据块被修改了。&lt;br /&gt;c.      Session A 继续运行，查询到第800个数据块。由于其他的一些操作，占用了大量的回滚段，回滚段的空间不够，特别地，1000个数据块更改的回滚信息被覆盖。&lt;br /&gt;d.      Session A 查询到1000个数据块的时候，发现数据块已经被更改，尝试查找回滚信息来保证一致性读，发现回滚信息已经被覆盖，从而引发了了ORA-01555错误。&lt;br /&gt;即使将会滚段的MAXEXTENT设置足够大，但是由于查询语句并不自动扩展（更新语句能够自动扩展），所以通常还是在查询的时候会出现ORA-01555的错误。所以，不要让其自动扩展，而是通过手工调节。&lt;br /&gt;&lt;br /&gt;对于9i的数据库，因为是自动管理回滚段，所以需要将其更改为手动管理之后，重新启动之后，才能运行如下的例子。&lt;br /&gt;alter system set undo_management= manual scope=spfile;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;步骤1：&lt;br /&gt;Session1:创建很小的回滚段，创建测试表，执行更新语句&lt;br /&gt;&lt;/span&gt;SQL&gt; create rollback segment rbs_small&lt;span style="color:#ff0000;"&gt;--创建一个很小的回滚段&lt;br /&gt;&lt;/span&gt;  2  storage&lt;br /&gt;  3  ( initial 8k next 8k&lt;br /&gt;  4    minextents 2 maxextents 3 )&lt;br /&gt;  5  --tablespace rbs_test&lt;br /&gt;  6  /&lt;br /&gt;Rollback segment created.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter rollback segment rbs_small online;&lt;span style="color:#ff0000;"&gt;--设置为online&lt;/span&gt;&lt;br /&gt;Rollback segment altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t&lt;br /&gt;  2  as&lt;br /&gt;  3  select *&lt;br /&gt;  4    from all_objects&lt;br /&gt;  5  /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create index t_idx on t(object_id)&lt;br /&gt;  2  /&lt;br /&gt;Index created.&lt;br /&gt;&lt;br /&gt;SQL&gt; begin&lt;br /&gt;  2          for x in ( select rowid rid from t )&lt;span style="color:#ff0000;"&gt;--执行更新语句，更新过程全表扫描&lt;/span&gt;&lt;br /&gt;  3          loop&lt;br /&gt;  4                  commit;&lt;br /&gt;  5                  set transaction use rollback segment rbs_small;&lt;span style="color:#ff0000;"&gt;--设置事务使用刚才建立回滚段&lt;br /&gt;&lt;/span&gt;  6                  update t&lt;br /&gt;  7                     set object_name = lower(object_name)&lt;br /&gt;  8                   where rowid = x.rid;&lt;br /&gt;  9          end loop;&lt;br /&gt; 10          commit;&lt;br /&gt; 11  end;&lt;br /&gt; 12  /&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;步骤2：&lt;br /&gt;Session2：执行查询语句（要确保步骤1的更新还未完成的时候运行）&lt;br /&gt;&lt;/span&gt;SQL&gt; select object_name from t where object_id &gt; 0 order by object_id;&lt;br /&gt;…….&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;ERROR: 出现ORA-01555错误&lt;br /&gt;ORA-01555: snapshot too old: rollback segment number 11 with name "RBS_SMALL"&lt;br /&gt;too small&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;由于步骤2中的查询是通过索引，所以其访问数据块是顺序是随机的，查询访问那些步骤1中被更新的快的几率会增大，从而可能造成ORA-01555的错误。如果是步骤2中使用全表扫描查询（通过RULE指定），那么由于步骤2的查询比步骤1的更新所花费的时间更少，所以经常是查询完成再去更新，从而产生ORA-01555错误的几率将会非常小。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;交叉提交造成ORA-01555的错误&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;如下的例子中，将会每100行更新之后就提交一次。就有可能，查询会重新访问已经提交更新的块。而由于回滚段的信息已经被覆盖，所以也会造成ORA-01555错误。&lt;br /&gt;&lt;br /&gt;SQL&gt; declare&lt;br /&gt;  2          l_cnt number default 0;&lt;br /&gt;  3  begin&lt;br /&gt;  4          for x in ( select rowid rid, t.* from t where object_id &gt; 0 )&lt;br /&gt;  5          loop&lt;br /&gt;  6                  if ( mod(l_cnt,100) = 0 )&lt;br /&gt;  7                  then&lt;br /&gt;  8                          commit;&lt;br /&gt;  9                          set transaction use rollback segment rbs_small;&lt;br /&gt; 10                  end if;&lt;br /&gt; 11                  update t&lt;br /&gt; 12                     set object_name = lower(object_name)&lt;br /&gt; 13                   where rowid = x.rid;&lt;br /&gt; 14                  l_cnt := l_cnt + 1;&lt;br /&gt; 15          end loop;&lt;br /&gt; 16      commit;&lt;br /&gt; 17  end;&lt;br /&gt; 18  /&lt;br /&gt;declare&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;ORA-01555: snapshot too old: rollback segment number 11 with name "RBS_SMALL"&lt;br /&gt;too small&lt;br /&gt;ORA-06512: at line 4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;块延迟清除造成ORA-01555的错误&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;造成错误的原因是非常严格的，所以现实情况中由这种原因而造成的ORA-01555非常少，需要满足如下条件：&lt;br /&gt;a.      一个更新被提交，部分块没有被自动清除事务标示。&lt;br /&gt;b.      在某个SQL访问这些块前，这些块不被其他的SESSION访问。&lt;br /&gt;c.      这个SQL开始运行，其SCN为T1。这个SQL最终会访问到上述没有被清除事务标示的块。&lt;br /&gt;d.      系统中又有许多其它的事务提交，但这些事务并不访问上述的块。&lt;br /&gt;e.      由于其他事务的提交，最初的更改数据事务的事务实体被循环重用。&lt;br /&gt;f.        最终，回滚段中最小的SCN号已经大于T1。这个时候，SQL访问这些块的时候，不能判断COMMIT SCN是大于T1（如果大于T1，回滚）还是小于T1（如果小于T1，SQL将会使用这个块）。&lt;br /&gt;&lt;br /&gt;参考：&lt;a href="http://blog.csdn.net/biti_rainy/archive/2004/07/03/32810.aspx"&gt;回滚段探究&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-7152406173311759747?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/7152406173311759747/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=7152406173311759747' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7152406173311759747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7152406173311759747'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/expert-one-on-one-oracle-3.html' title='《Expert one on one Oracle》- 重做回滚- 笔记-3'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-7457748793959799175</id><published>2007-06-26T14:52:00.000-07:00</published><updated>2007-08-08T13:02:26.131-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delayed block cleanout'/><category scheme='http://www.blogger.com/atom/ns#' term='block cleanout'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert one on one Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='fast commit'/><title type='text'>《Expert one on one Oracle》- 重做回滚- 笔记-2</title><content type='html'>&lt;strong&gt;块清除&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;当Oracle更改数据块时，会对这个数据块进行跟踪。在提交的时候，将会重新访问这个块并将更改标记为已经提交。但是只标示那些还没有从db_block_buffers中清除的块。而且，如果更改了太多的块，那么也只有前面少数的块（db_block_buffers的10%）被重新访问。&lt;br /&gt;&lt;br /&gt;当提交的时候，如果这些块还在缓存中，那么Oracle将会进行fast commit，清除块头部的事务信息。对于那些已经从db_block_buffers中清除，被写入磁盘的数据块，Oracle将会忽略这些块。当下次的DML或者查询语句再访问这些块的时候，由这些语句负责清除，这就是所谓的delayed block cleanout。所以，即使是查询语句也可能产生重做日志。&lt;br /&gt;&lt;br /&gt;通过如下的方法来验证：&lt;br /&gt;a. 创建表，保证一块只能存储一行，在8K大小数据块中，创建每行大小为6K的数据库；&lt;br /&gt;b. 插入499行纪录，使用499个数据块，其大小已经超过30（也即300的10%）；&lt;br /&gt;c. 提交；&lt;br /&gt;d. 对于在db_block_buffers的数据块（同时保证小于db_block_buffers 10%），Oracle执行fast commit，对于其他的数据块Oracle将忽略；&lt;br /&gt;e. 执行全表扫描的查询语句。这条语句将会重新访问步骤d中没有被清除的块，对这些块头的事务信息进行清除，这个步骤将会产生重做日志。&lt;br /&gt;f. 检查通过步骤e查询所产生的重做日志。&lt;br /&gt;g. 执行新的查询，由于步骤e已经清除块头的事务信息，这个时候查询将不会需要清除块，也不会产生重做日志。&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t &lt;span style="color:#ff0000;"&gt;--保证一块只能存储一行&lt;/span&gt;&lt;br /&gt;2 ( x char(2000) default 'x',&lt;br /&gt;3 y char(2000) default 'y',&lt;br /&gt;4 z char(2000) default 'z' )&lt;br /&gt;5 /&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; insert into t &lt;span style="color:#ff0000;"&gt;--插入499行纪录，使用499个数据块&lt;/span&gt;&lt;br /&gt;2 select 'x','y','z'&lt;br /&gt;3 from all_objects where rownum &lt;500&lt;br /&gt;SQL&gt; commit;-- 提交，插入过程中部分快会执行fast commit，部分块被忽略&lt;br /&gt;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; column value new_value old_value&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; select * from redo_size;&lt;br /&gt;&lt;br /&gt;VALUE&lt;br /&gt;----------&lt;br /&gt;3332424&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; select *&lt;br /&gt;2 from t&lt;br /&gt;3 where x = y;&lt;br /&gt;&lt;br /&gt;no rows selected&lt;br /&gt;&lt;br /&gt;SQL&gt; select value-&amp;old_value REDO_GENERATED from redo_size;&lt;br /&gt;old 1: select value-&amp;old_value REDO_GENERATED from redo_size&lt;br /&gt;new 1: select value- 3332424 REDO_GENERATED from redo_size&lt;br /&gt;&lt;br /&gt;REDO_GENERATED&lt;br /&gt;--------------&lt;br /&gt;10740 &lt;span style="color:#ff0000;"&gt;--查询过程产生了重做日志，证明进行了块清除操作&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; select value from redo_size;&lt;br /&gt;&lt;br /&gt;VALUE&lt;br /&gt;----------&lt;br /&gt;3343164&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; select *&lt;br /&gt;2 from t&lt;br /&gt;3 where x = y;&lt;br /&gt;&lt;br /&gt;no rows selected&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; select value-&amp;old_value REDO_GENERATED from redo_size;&lt;br /&gt;old 1: select value-&amp;amp;old_value REDO_GENERATED from redo_size&lt;br /&gt;new 1: select value- 3343164 REDO_GENERATED from redo_size&lt;br /&gt;&lt;br /&gt;REDO_GENERATED&lt;br /&gt;--------------&lt;br /&gt;0&lt;span style="color:#ff0000;"&gt;--查询过程没有产生重做日志，前面的查询已经清除块，第二次查询不再有清除动作&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;上面的第一个查询产生了重做日志，有可能促使这些块被DBWR重写。Oracle必须采用delayed clear out的策略，否则在提交的时候必须重新访问更新块，还可能从磁盘中读取快，这将会是相当耗时的工作。&lt;br /&gt;&lt;br /&gt;有些事务创建“干净的”数据块，例如：CREATE TABLE AS SELECT。&lt;br /&gt;&lt;br /&gt;在某些情况下，进行大量的数据更新之后，也可以主动访问数据块，让最终用户访问的时候速度会更快。例如通过ANALYZE命令，可以清除块。&lt;br /&gt;&lt;br /&gt;参考：&lt;br /&gt;&lt;a href="http://www.jlcomp.demon.co.uk/cleanout.html"&gt;Block cleanout - fast or delayed&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-7457748793959799175?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/7457748793959799175/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=7457748793959799175' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7457748793959799175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/7457748793959799175'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/expert-one-on-one-oracle-2-expert.html' title='《Expert one on one Oracle》- 重做回滚- 笔记-2'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6378042878651779753</id><published>2007-06-25T14:39:00.000-07:00</published><updated>2007-08-08T13:03:59.377-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='undo'/><category scheme='http://www.blogger.com/atom/ns#' term='Expert one on one Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='ORA- 01034'/><category scheme='http://www.blogger.com/atom/ns#' term='redo'/><title type='text'>《Expert one on one Oracle》- 重做回滚- 笔记-1</title><content type='html'>“重做”允许Oracle重做事务。“回滚”则允许Oracle撤销或者回滚事务。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;重做&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;重做日志文件是数据库的事务日志，只用来恢复数据库。Oracle有两种类型重做日志文件：在线重做日志和归档重做日志。在线重做日志以循环的方式来写入，当其中一个日志文件写满，就会切换写另外的日志文件，循环往复。归档日至是当在线日志写满的时候，将在线日志拷贝到另外一个地方。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;COMMIT&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;COMMIT语句的执行并不消耗太多时间，而且并不是事务越大COMMIT所消耗的时间越多。实际的情况是，在COMMIT执行之前，Oracle已经完成所要提交事务的大部分工作。&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t ( x int );&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; set serveroutput on&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; declare&lt;br /&gt;2 l_start number default dbms_utility.get_time;&lt;br /&gt;3 begin&lt;br /&gt;4 for i in 1 .. 10000&lt;br /&gt;5 loop&lt;br /&gt;6 insert into t values ( 1 );&lt;br /&gt;7 end loop;&lt;br /&gt;8 commit;&lt;br /&gt;9 dbms_output.put_line&lt;br /&gt;10 ( dbms_utility.get_time-l_start ' hsecs' );&lt;br /&gt;11 end;&lt;br /&gt;12 /&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;135 hsecs&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; declare&lt;br /&gt;2 l_start number default dbms_utility.get_time;&lt;br /&gt;3 begin&lt;br /&gt;4 for i in 1 .. 10000&lt;br /&gt;5 loop&lt;br /&gt;6 insert into t values ( 1 );&lt;br /&gt;7 commit;&lt;br /&gt;8 end loop;&lt;br /&gt;9 dbms_output.put_line&lt;br /&gt;10 ( dbms_utility.get_time-l_start ' hsecs' );&lt;br /&gt;11 end;&lt;br /&gt;12 /&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;161 hsecs&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;从上面可以看到，插入多样的数据一次提交比进行多次提交消耗更少的时间。所以，提交的响应时间和事务大小并无太大关系。因为提交之前，Oracle已经完成99%的工作，具体为：&lt;br /&gt;a. 回滚段的纪录已经在SGA中产生。&lt;br /&gt;b. 更改的数据块已经在SGA中产生。&lt;br /&gt;c. 上述两项的缓存的REDO已经在SGA产生。&lt;br /&gt;d. 基于如上三项的的大小以及所消耗时间，上述数据的部分已经写入磁盘。&lt;br /&gt;e. 已经获取所有需要的锁。&lt;br /&gt;&lt;br /&gt;那么提交的时候，需要完成如下工作：&lt;br /&gt;a. 为事务产生SCN。&lt;br /&gt;b. LGWR将余下的缓存的重做日志写入磁盘，同时将SCN好记入到重做日志文件。完成这一步之后，事务实际上已经提交。事务实体被移除。在V$TRANSACTION表中找不到事物的相关纪录。&lt;br /&gt;c. Session所持有的锁被释放。&lt;br /&gt;d. 如果被事务所修改的快还在缓存中，那么大多数将被访问以及被“清除”。&lt;br /&gt;&lt;br /&gt;真正消耗时间的在于LGWR将重做日志写入磁盘，因为这是物理的I/O访问。但是COMMIT之后，LGWR并不是将所有的 内容写入重做日志。在COMMIT之前，LGWR已经持续的写重做日志。当如下条件满足的时候，LGWR写重做日志：&lt;br /&gt;a. 每三秒&lt;br /&gt;b. 当达到1/3或者1MB大小&lt;br /&gt;c. 当COMMIT的时候&lt;br /&gt;&lt;br /&gt;SCN是ORACLE用户保证事务的顺序，确保数据库能被正确恢复。同时，它也用来保证数据库的读一至性以及检查点（checkpointing）。每当事务提交，SCN号增一。&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t&lt;br /&gt;2 as&lt;br /&gt;3 select * from all_objects&lt;br /&gt;4 /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t select * from t;&lt;br /&gt;29257 rows created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t select * from t;&lt;br /&gt;58514 rows created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into t select * from t where rownum &lt;  12000;&lt;br /&gt;11999 rows created.&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;&lt;br /&gt;Commit complete.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; create or replace procedure do_commit( p_rows in number )&lt;br /&gt;2 as&lt;br /&gt;3 l_start number;&lt;br /&gt;4 l_after_redo number;&lt;br /&gt;5 l_before_redo number;&lt;br /&gt;6 begin&lt;br /&gt;7 select v$mystat.value into l_before_redo&lt;br /&gt;8 from v$mystat, v$statname&lt;br /&gt;9 where v$mystat.statistic# = v$statname.statistic#&lt;br /&gt;10 and v$statname.name = 'redo size';&lt;br /&gt;11&lt;br /&gt;12 l_start := dbms_utility.get_time;&lt;br /&gt;13 insert into t select * from t where rownum &lt; name =" 'redo"&gt;&lt;br /&gt;SQL&gt; set serveroutput on format wrapped&lt;br /&gt;SQL&gt; begin&lt;br /&gt;2 for i in 1 .. 5&lt;br /&gt;3 loop&lt;br /&gt;4 do_commit( power(10,i) );&lt;br /&gt;5 end loop;&lt;br /&gt;6 end;&lt;br /&gt;7 /&lt;br /&gt;9 rows created&lt;br /&gt;Time to INSERT: .05 seconds&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Time to COMMIT: .00 seconds&lt;/span&gt;&lt;br /&gt;Generated 1,368 bytes of redo&lt;br /&gt;99 rows created&lt;br /&gt;Time to INSERT: .00 seconds&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Time to COMMIT: .00 seconds&lt;br /&gt;Generated 11,596 bytes of redo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;999 rows created&lt;br /&gt;Time to INSERT: .03 seconds&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Time to COMMIT: .00 seconds&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Generated 116,732 bytes of redo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;9999 rows created&lt;br /&gt;Time to INSERT: 1.34 seconds&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Time to COMMIT: .00 seconds&lt;br /&gt;Generated 1,079,844 bytes of redo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;99999 rows created&lt;br /&gt;Time to INSERT: 5.56 seconds&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Time to COMMIT: .00 seconds&lt;br /&gt;Generated 11,175,056 bytes of redo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;从上述运行结果可以看到，随着插入数据量的增大，产生的重做日志也逐渐增大，插入所消耗的时间也增多，但是COMMIT所消耗的时间仍然相当的少。所以，也验证了上述结论：在COMMIT之前，ORACLE已经完成了绝大多数的工作，所以COMMIT锁耗用的时间是相当少的。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;回滚&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;将上述程序的COMMIT（23，25行）替换成ROLLBACK，再执行察看回滚所消耗的时间。&lt;br /&gt;&lt;br /&gt;Time to INSERT: .04 seconds&lt;br /&gt;Time to ROLLBACK: .00 seconds&lt;br /&gt;Generated 1,504 bytes of redo&lt;br /&gt;&lt;br /&gt;99 rows created&lt;br /&gt;Time to INSERT: .00 seconds&lt;br /&gt;Time to ROLLBACK: .00 seconds&lt;br /&gt;Generated 12,288 bytes of redo&lt;br /&gt;&lt;br /&gt;999 rows created&lt;br /&gt;Time to INSERT: .03 seconds&lt;br /&gt;Time to ROLLBACK: .00 seconds&lt;br /&gt;Generated 123,736 bytes of redo&lt;br /&gt;9999 rows created&lt;br /&gt;Time to INSERT: .42 seconds&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Time to ROLLBACK: .00 seconds&lt;br /&gt;Generated 1,146,652 bytes of redo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;99999 rows created&lt;br /&gt;Time to INSERT: 3.99 seconds&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Time to ROLLBACK: 1.64 seconds&lt;br /&gt;Generated 11,883,064 bytes of redo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;从上述运行结果可知，与COMMIT不同，随着数据量的增大，回滚所消耗的时间也增加。这是因为回滚是一个消耗时间的操作。&lt;br /&gt;&lt;br /&gt;回滚之前，数据库所完成的工作与提交部分（可以参考上述COMMIT部分）相同。&lt;br /&gt;回滚时，ORACLE所需要完成的工作为：&lt;br /&gt;a. 回滚所有的更改。从回滚段中读取数据，并执行与原来相反的操作。例如，如果原来插入一行，回滚时便删除一行。如果更新一行，回滚时候必须更新回去。&lt;br /&gt;b. Session所持有的锁被释放。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;测量产生的日志数量&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;创建如下的一个视图，可以方便的查询系统中的重做日志。&lt;br /&gt;create or replace view redo_size&lt;br /&gt;as&lt;br /&gt;select value&lt;br /&gt;from v$mystat, v$statname&lt;br /&gt;where v$mystat.statistic# = v$statname.statistic#&lt;br /&gt;and v$statname.name = 'redo size';&lt;br /&gt;&lt;br /&gt;通过测试脚本，可以看到：通过一条语句更新N行，与通过N条语句来更新N行，所产生的重做日志的数量大致相同。对于删除操作，结果也类似。但对于更新操作，批量更新产生的重做日志更小一些。&lt;br /&gt;&lt;br /&gt;还有，如果我们插入2000bytes的行，实际每行产生的重做日志要高于2000bytes。对于删除操作也类似。对于更新操作，将会是2000betys的两倍数量（需要记录数据以及回滚）。&lt;br /&gt;&lt;br /&gt;触发器对重做日志的影响：&lt;br /&gt;a. 删除操作的BEFORE和AFTER触发器不会增加额外的重做日志。&lt;br /&gt;b. 插入操作的BEFORE和AFTER触发器都会增加额外的重做日志。&lt;br /&gt;c. 更下操作的BEFORE触发器产生额外重做日志，而AFTER触发器不产生。&lt;br /&gt;d. 行的大小影响插入过程额外重做日志，更新操作不受影响。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;能否关闭重做日志&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;尽量不要关闭重做日志功能，有些语句NOLOGGING因子，但是实际上还是会产生重做日志。这些日志因为记录数据词典更改而产生的。多于NOLOGGING，有如下几点需要注意：&lt;br /&gt;a. 即使使用NOLOGGING，还是会产生少量的重做日志，这用来保护数据词典。&lt;br /&gt;b. NOLOGGING之影响当前操作。例如如果在创建表的语句中使用了NOLOGGING，那么只是在创建表的过程中不产生重做日志。后续对于标的插入删除以及更新还是会产生日志。其他的特殊操作例如INSERT /*+ APPEND */和SQLLDR插入数据不会产生日志。&lt;br /&gt;c. 在以归档模式运行的数据库中，一旦使用NOLOGGING，那么尽快将受影响的文件备份。&lt;br /&gt;&lt;br /&gt;待续....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6378042878651779753?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6378042878651779753/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6378042878651779753' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6378042878651779753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6378042878651779753'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/expert-one-on-one-oracle-1.html' title='《Expert one on one Oracle》- 重做回滚- 笔记-1'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6017726367364906389</id><published>2007-06-22T09:09:00.000-07:00</published><updated>2007-06-22T09:15:43.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='事务'/><category scheme='http://www.blogger.com/atom/ns#' term='transaction'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>《Expert one on one Oracle》- 事务 - 笔记</title><content type='html'>&lt;p&gt;&lt;span style="font-size:85%;"&gt;事务的四个属性ACID（Atomicity，Consistency，Isolation，Durability）。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.1 事务控制语句&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Oracle中没有“开始事务”的语句，当第一条更改数据的语句（第一个获取TX锁语句）执行的时候，便隐式地开始了一个事物。&lt;br /&gt;&lt;br /&gt;可以通过COMMIT或者ROLLBACK来显式结束事务。否则，你使用的工具将会为你结束事务。例如在SQL*PLUS中，退出session时SQL*PLUS就会替你提交事务，而在PRO*C中会替你回滚事务。&lt;br /&gt;&lt;br /&gt;相关控制语句语句有COMMIT，ROLLBACK，SAVEPOINT，ROLLBACK TO &lt;savepoint&gt;，SET TRANSACTION。通过语句SET TRANSACTION可以指定事务的隔离级别，是否只读，以及使用的回滚段。&lt;br /&gt;&lt;br /&gt;Oracle中事务具有Atomicity，语句也具有Atomicity。单条语句的失败，不会影响到前面已经执行语句的回滚。察看下面例子：&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t( a int check(a&gt;0 ) );&lt;br /&gt;Table created.&lt;br /&gt;SQL&gt; insert into t values(1);&lt;br /&gt;1 row created.&lt;br /&gt;SQL&gt; insert into t values(-1);&lt;br /&gt;insert into t values(-1)&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-02290: check constraint (SCOTT.SYS_C003586) violated&lt;br /&gt;SQL&gt; select * from t;&lt;br /&gt;A&lt;br /&gt;----------&lt;br /&gt;1&lt;br /&gt;SQL&gt;&lt;br /&gt;&lt;br /&gt;上面例子，显示即使单条语句也具有原子性，第二条语句执行失败，但是第一条语句仍然成功。实际上Oracle处理上述语句的时候，隐式的按照如下方式执行：&lt;br /&gt;&lt;br /&gt;Savepoint statement1;&lt;br /&gt;Insert into t values ( 1 );&lt;br /&gt;If error then rollback to statement1;&lt;br /&gt;Savepoint statement2;&lt;br /&gt;Insert into t values ( ‐1 );&lt;br /&gt;If error then rollback to statement2;&lt;br /&gt;&lt;br /&gt;另为对于存储过程的调用Oracle也将其作为原子性语句来执行。&lt;br /&gt;&lt;br /&gt;SQL&gt; create table t( a int check(a&gt;0 ) );&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create or replace procedure p1&lt;br /&gt;2 as&lt;br /&gt;3 begin&lt;br /&gt;4 insert into t values (1);&lt;br /&gt;5 insert into t values (-1);&lt;br /&gt;6 end;&lt;br /&gt;7 /&lt;br /&gt;Procedure created.&lt;br /&gt;&lt;br /&gt;SQL&gt; begin p1; end;&lt;br /&gt;2 /&lt;br /&gt;begin p1; end;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-02290: check constraint (SCOTT.SYS_C003588) violated&lt;br /&gt;ORA-06512: at "SCOTT.P1", line 5&lt;br /&gt;ORA-06512: at line 1&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from t;&lt;br /&gt;no rows selected&lt;br /&gt;&lt;br /&gt;由于整个存储过程的调用作为一个原子性操作，所以第一条插入语句也被回滚。Oracle默认在调用存储过程之前插入了一个SAVEPOINT，所以P1调用失败，标回滚到调用P1之前，所以第一条插入语句也被回滚。&lt;br /&gt;&lt;br /&gt;如果采用另外一段语句来调用P1：&lt;br /&gt;&lt;br /&gt;SQL&gt; begin p1;&lt;br /&gt;2 exception&lt;br /&gt;3 when others then null;&lt;br /&gt;4 end;&lt;br /&gt;5 /&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;SQL&gt; select * from t;&lt;br /&gt;A&lt;br /&gt;----------&lt;br /&gt;1&lt;br /&gt;&lt;br /&gt;这是因为在调用过程中增加了异常处理函数。虽然捕获异常不做任何处理，Oracle还是认为执行成功了。这个时候，“如果错误，那么回滚”的原则在这里将不起作用。同时，在P1中，由于两条插入语句也是原子性操作，这个时候P1是提交这两条语句的Oracle客户端，所以第一条语句执行成功。&lt;br /&gt;&lt;br /&gt;从上可以看到，在开发程序的过程中，对事物的控制是多么的重要。如果上述P1的例子的业务要求两次插入要么全部成功要么全部失败，增加异常处理语句而实际不做任何处理，将会带来与业务需求相悖的结果。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.2 事务与完整约束性检查：&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;a. 是SQL语句的而不是语句的完整约束性检查。如果一个存储过程中包含多个SQL语句，那么每条SQL语句执行完成的时候，都需要检查。&lt;br /&gt;&lt;br /&gt;b. 是在语句执行完成之后检查，而不是在执行过程中。如果更新10行纪录，那么是要等到10行记录更新之后才检查，而不是更新其中的某几条就检查。&lt;br /&gt;&lt;br /&gt;c. 可以通过DEFERRED选项来延迟约束性检查。&lt;br /&gt;DEFERRABLE INITIALLY DEFERRED：允许延迟验证约束，默认方式为延迟，等待提交后验证，可以修改为第二种状态。&lt;br /&gt;DEFERRABLE INITIALLY IMMEDIATE： 允许延迟验证约束，默认方式为立即，处理完一条记录就立即验证，可以修改为第一种状态&lt;br /&gt;NOT DEFERRABLE：不允许延迟验证约束，不能与上面两种状态进行转换。&lt;br /&gt;&lt;br /&gt;SQL&gt; create table pt&lt;br /&gt;2 ( pk int primary key )&lt;br /&gt;3 /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; create table ct&lt;br /&gt;2 ( fk int constraint c_fk&lt;br /&gt;3 references pt(pk)&lt;br /&gt;4 deferrable&lt;br /&gt;5 initially immediate -- 立即检查&lt;br /&gt;6 )&lt;br /&gt;7 /&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into pt values (1);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into ct values (1);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into ct values (2);--如果是立即检查，一旦不符合完整性约束，就会出错&lt;br /&gt;insert into ct values (2)&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-02291: integrity constraint (SCOTT.C_FK) violated - parent key not found&lt;br /&gt;&lt;br /&gt;SQL&gt; rollback;&lt;br /&gt;Rollback complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into pt values (1);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; set constraint c_fk deferred;--更换成提交的时候再检查&lt;br /&gt;Constraint set.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into ct values (2);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; commit;--直到提交的时候才检查&lt;br /&gt;commit&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-02091: transaction rolled back&lt;br /&gt;ORA-02291: integrity constraint (SCOTT.C_FK) violated - parent key not found&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.3 编程的坏习惯&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;两个坏习惯&lt;br /&gt;a. 可以一次提交的事务而多次提交。&lt;br /&gt;b. 不设定足够大的回滚段。&lt;br /&gt;&lt;br /&gt;关于第一点的测试，可以编写循环，在循环中多次提交，同一次提交所耗用的时间进行对比。&lt;br /&gt;&lt;br /&gt;对于第二点的测试，可以将原来的rollback置为offline的状态，创建小的回滚段，执行循环更新的语句，检查结果是否报ORA‐01555错误。&lt;br /&gt;&lt;br /&gt;对于ODBC和JDBC，默认都是自动提交。ODBC最初由SQL Server的开发人员设计。而在SQL Server中，锁是稀少资源，所以被设置为自动提交。而对于JDBC，在开发的时候最好将其设置为不自动提交。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.4 分布式事务&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Oracle能够透明的处理分布式事务，采用2PC协议来实现。通过DBLink，不同数据库之间可以相互访问。客户端最初登录的那个数据库，将作为事务的协调者。这样，这个数据库会询问其他数据库是否准备提交，其他的数据库就会反馈状态。如果都是YES，那么这个事务将会提交。如果有一个数据库反馈NO，那么整个事务就会回滚。&lt;br /&gt;&lt;br /&gt;通常作为事务协调者的数据库如果出现故障，那么其他的数据库事务就会挂起等待。这个时候，需要手工在其他的数据库上进行提交或者回滚（因为有回滚段的存在）。&lt;br /&gt;&lt;br /&gt;DBLink的使用有如下的限制：&lt;br /&gt;a. 不能通过DB Link提交Commit语句。&lt;br /&gt;b. 不能通过DB Link执行DDL语句。&lt;br /&gt;c. 不能通过DB Link创建SAVEPOINT。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.5 Redo和Undo&lt;br /&gt;&lt;/strong&gt;待续………….&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6017726367364906389?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6017726367364906389/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6017726367364906389' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6017726367364906389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6017726367364906389'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/expert-one-on-one-oracle.html' title='《Expert one on one Oracle》- 事务 - 笔记'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6519450786436726795</id><published>2007-06-21T11:16:00.000-07:00</published><updated>2007-06-22T16:34:52.509-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trace'/><category scheme='http://www.blogger.com/atom/ns#' term='tkprof'/><category scheme='http://www.blogger.com/atom/ns#' term='Row Source Operation'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>执行计划中Row 数量为0，为什么</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;strong&gt;从Metalink中找到答案&lt;/strong&gt;&lt;br /&gt;如果游标没有关闭，那么通过TKPROF生成的输出将不会包含精确的执行计划，在原始的trace文件中要么没有STAT行，或则行数量遗失。当然可以通过EXPLAIN选项来产生执行计划，但这个时候产生的执行计划不一定是正确的。如果游标关闭，STAT行写入原始的trace文件。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;&lt;br /&gt;可以通过执行其他无关的SQL来关闭游标或通过dbms_session.reset_package过程来完成。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;验证方法：&lt;br /&gt;&lt;/strong&gt;对比两种不同方式，检查在游标关闭和非关闭两种情况下，是否生成了对应的执行计划。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;验证过程：&lt;/strong&gt;&lt;br /&gt;1. 创建一个过程，在过程中打开一个游标，执行某些操作，然后关闭游标。&lt;br /&gt;&lt;br /&gt;创建表：&lt;br /&gt;&lt;div id="script"&gt;&lt;br /&gt;SQL&gt; desc t_plan;&lt;br /&gt;Name Null? Type&lt;br /&gt;----------------------------------------- -------- --------------------&lt;br /&gt;&lt;br /&gt;OWNER NOT NULL VARCHAR2(30)&lt;br /&gt;OBJECT_NAME NOT NULL VARCHAR2(30)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;创建过程：&lt;br /&gt;CREATE OR REPLACE PROCEDURE scott.tkprof_test&lt;br /&gt;AS&lt;br /&gt;counts NUMBER;&lt;br /&gt;&lt;br /&gt;CURSOR c1&lt;br /&gt;IS&lt;br /&gt;SELECT COUNT (*)&lt;br /&gt;FROM t_plan&lt;br /&gt;GROUP BY owner;&lt;br /&gt;BEGIN&lt;br /&gt;OPEN c1;&lt;br /&gt;&lt;br /&gt;LOOP&lt;br /&gt;FETCH c1&lt;br /&gt;INTO counts;&lt;br /&gt;EXIT WHEN c1%NOTFOUND;&lt;br /&gt;DBMS_OUTPUT.put_line ('counts:' counts);&lt;br /&gt;END LOOP;&lt;br /&gt;&lt;br /&gt;CLOSE c1;&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;2. 登录SQL*PLUS，打开一个session，设置SQL_TRACE为true，执行步骤1中创建的过程，不执行reset_package过程，设置SQL_TRACE为false。&lt;br /&gt;SQL&gt; alter session set sql_trace=true;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec tkprof_test;&lt;br /&gt;counts:99&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter session set sql_trace=false;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;3. 通过TKPROF命令，检查步骤2输出文件。&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;br /&gt;SELECT COUNT (*)&lt;br /&gt;FROM t_plan&lt;br /&gt;GROUP BY owner&lt;br /&gt;&lt;br /&gt;call count cpu elapsed disk query current rows&lt;br /&gt;------- ------ -------- ---------- ---------- ---------- ---------- ----------&lt;br /&gt;Parse 1 0.00 0.11 0 0 0 0&lt;br /&gt;Execute 1 0.00 0.00 0 0 0 0&lt;br /&gt;Fetch 2 0.00 0.00 0 4 0 1&lt;br /&gt;------- ------ -------- ---------- ---------- ---------- ---------- ----------&lt;br /&gt;total 4 0.00 0.11 0 4 0 1&lt;br /&gt;&lt;br /&gt;Misses in library cache during parse: 0&lt;br /&gt;Optimizer goal: CHOOSE&lt;br /&gt;Parsing user id: 59 (recursive depth: 1)&lt;br /&gt;********************************************************************************&lt;br /&gt;4. 登录SQL*PLUS，打开一个session，设置SQL_TRACE为true，执行步骤1中创建的过程，执行reset_package过程，设置SQL_TRACE为false。&lt;br /&gt;SQL&gt; alter session set sql_trace=true;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec tkprof_test;&lt;br /&gt;counts:99&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec dbms_session.reset_package;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; alter session set sql_trace=false;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;5. 通过TKPROF命令，检查步骤4输出文件。&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;br /&gt;SELECT COUNT (*)&lt;br /&gt;FROM t_plan&lt;br /&gt;GROUP BY owner&lt;br /&gt;&lt;br /&gt;call count cpu elapsed disk query current rows&lt;br /&gt;------- ------ -------- ---------- ---------- ---------- ---------- ----------&lt;br /&gt;Parse 1 0.00 0.03 0 0 0 0&lt;br /&gt;Execute 1 0.00 0.00 0 0 0 0&lt;br /&gt;Fetch 2 0.01 0.00 0 4 0 1&lt;br /&gt;------- ------ -------- ---------- ---------- ---------- ---------- ----------&lt;br /&gt;total 4 0.01 0.03 0 4 0 1&lt;br /&gt;&lt;br /&gt;Misses in library cache during parse: 0&lt;br /&gt;Optimizer goal: CHOOSE&lt;br /&gt;Parsing user id: 59 (recursive depth: 1)&lt;br /&gt;&lt;br /&gt;Rows Row Source Operation&lt;br /&gt;------- ---------------------------------------------------&lt;br /&gt;1 SORT GROUP BY&lt;br /&gt;99 TABLE ACCESS FULL T_PLAN&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;1. 执行reset_package必须在alter session set sql_tracle = false命令之前执行，否则同样不能得到执行计划。&lt;br /&gt;2. 对于单个在SQL*PLUS中执行的语句，执行完成后，可以通过“Select * from dual”或者“alter session set sql_tracle = ture”，游标会立刻关闭。&lt;br /&gt;3. 今天读到Tom的《Oracle Expert one by one》10章的时候，提到通过原始的trace文件判断是否已经生成可信任的执行计划。在原始的trace文件中，STAT行纪录了运行时精确的执行计划，同时也会包含每一步执行计划中关联的正确的记录行数。也提到了只有当相关游标关闭之后，才会产生相关纪录。回过头看一下上面关闭游标的例子，其生成的trace文件相关部分内容为：&lt;br /&gt;&lt;br /&gt;=====================&lt;br /&gt;PARSING IN CURSOR #2 len=61 dep=1 uid=59 oct=3 lid=59 tim=19288630504 hv=2097396184 ad='66c8c0a4'&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#ff0000;"&gt;SELECT COUNT (*)&lt;br /&gt;FROM t_plan&lt;br /&gt;GROUP BY owner&lt;br /&gt;END OF STMT&lt;/span&gt;&lt;br /&gt;PARSE #2:c=0,e=38470,p=0,cr=2,cu=0,mis=0,r=0,dep=1,og=4,tim=19288630498&lt;br /&gt;EXEC #2:c=0,e=50,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=19288660693&lt;br /&gt;FETCH #2:c=15625,e=170,p=0,cr=4,cu=0,mis=0,r=1,dep=1,og=4,tim=19288665392&lt;br /&gt;FETCH #2:c=0,e=17,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=19288670162&lt;br /&gt;EXEC #1:c=15625,e=83199,p=0,cr=6,cu=0,mis=0,r=1,dep=0,og=4,tim=19288675090&lt;br /&gt;=====================&lt;br /&gt;PARSING IN CURSOR #3 len=52 dep=0 uid=59 oct=47 lid=59 tim=19288679793 hv=1697159799 ad='66c61e20'&lt;br /&gt;BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;&lt;br /&gt;END OF STMT&lt;br /&gt;PARSE #3:c=0,e=108,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=19288679789&lt;br /&gt;EXEC #3:c=0,e=209,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=19288702763&lt;br /&gt;*** 2007-06-13 14:35:20.000&lt;br /&gt;=====================&lt;br /&gt;PARSING IN CURSOR #1 len=40 dep=0 uid=59 oct=47 lid=59 tim=19313599313 hv=1443640743 ad='66b81f64'&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;BEGIN dbms_session.reset_package; END;&lt;/span&gt;&lt;br /&gt;END OF STMT&lt;br /&gt;PARSE #1:c=0,e=342,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=19313599304&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#ff0000;"&gt;STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT GROUP BY '&lt;br /&gt;STAT #2 id=2 cnt=99 pid=1 pos=1 obj=30711 op='TABLE ACCESS FULL&lt;/span&gt; T_PLAN '&lt;br /&gt;EXEC #1:c=0,e=21520,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=19313684039&lt;br /&gt;=====================&lt;br /&gt;已经将相关部分highlight，可以看到当查询的SELECT COUNT (*) FROM t_plan GROUP BY owner; 执行完成之后，并没有生成STAT纪录。直到调用dbms_session.reset_package方法之后，生成了STAT相关纪录。从STAT的记录行，可以看到操作以及对应的行数。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6519450786436726795?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6519450786436726795/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6519450786436726795' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6519450786436726795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6519450786436726795'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/row-0.html' title='执行计划中Row 数量为0，为什么'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-8254574586532161475</id><published>2007-06-20T11:13:00.000-07:00</published><updated>2007-06-22T16:37:36.576-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='分析'/><category scheme='http://www.blogger.com/atom/ns#' term='dbms_stats'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>对大表的分析</title><content type='html'>&lt;span style="font-size:85%;"&gt;怎样对数据库中的大表进行分析&lt;br /&gt;1)分析前备份统计信息: dbms_stats.EXPORT_TABLE_STATS&lt;br /&gt;2)察看是否统计：user_table中的last_anaylyzed更新日起，user_index表中也存在对应字段。&lt;br /&gt;3)对于数据量大的表要抽样分析，用dbms_stats分析对表的影响比analyze 更小一些。&lt;br /&gt;4)对于数据变化比较频繁的表，需要定时分析，否则会产生性能问题。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;参考:&lt;/strong&gt;&lt;/span&gt;&lt;a href="http://www.itpub.net/787943,1.html"&gt;&lt;span style="font-size:85%;"&gt;http://www.itpub.net/787943,1.html&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-8254574586532161475?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/8254574586532161475/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=8254574586532161475' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8254574586532161475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8254574586532161475'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/blog-post.html' title='对大表的分析'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-4041759078586989157</id><published>2007-06-19T11:09:00.000-07:00</published><updated>2007-06-22T16:35:30.216-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='V$SESSION_CACHED_CURSOR'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='V$OPEN_CURSOR'/><title type='text'>V$OPEN_CURSOR, V$SESSION_CACHED_CURSOR</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;strong&gt;概念：&lt;br /&gt;&lt;/strong&gt;OPEN_CURSOR，定义每个Session最大能够打开的游标数量。在init.ora文件中定义，可以通过select * from v$parameter where name = 'open_cursors'查询。&lt;br /&gt;V$OPEN_CURSOR，当前Session缓存的游标，而不是曾经打开的游标。&lt;br /&gt;V$SESSION_CACHED_CURSOR，当前Session已经关闭并被缓存的游标。&lt;br /&gt;V$OPEN_CURSOR中显示的当前Session游标缓存中游标，如果要精确查询当前Session打开的游标总数，需要从V$ SESSTAT中查询。&lt;br /&gt;select a.value, s.username, s.sid, s.serial#&lt;br /&gt;from v$sesstat a, v$statname b, v$session s&lt;br /&gt;where a.statistic# = b.statistic# and s.sid=a.sid&lt;br /&gt;and b.name = 'opened cursors current';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Session Cache的原理&lt;br /&gt;&lt;/strong&gt;当设定SESSION_CACHED_CURSOR的值之后，当有parse请求的时候，Oracle会从library cache中查询。如果有超过3次同样的parse请求，这个游标将会存入Session的游标缓存中。对于将来同样的查询，就甚至不要soft parse，直接从Session的游标缓存中取。&lt;br /&gt;&lt;br /&gt;登录两个SQL*PLUS客户端，分别为Session test和Session monitor。&lt;br /&gt;&lt;br /&gt;1. 检查是否参数设置，以及执行的SQL语句是否在V$OPEN_CURSOR找到。&lt;br /&gt;Session Test:&lt;br /&gt;SQL&gt; show parameter session_cached_cursors;&lt;br /&gt;&lt;br /&gt;NAME TYPE VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;session_cached_cursors integer 0&lt;br /&gt;SQL&gt; select sid from v$mystat where rownum=1;&lt;br /&gt;&lt;br /&gt;SID&lt;br /&gt;----------&lt;br /&gt;9&lt;br /&gt;&lt;br /&gt;SQL&gt; select sid from v$mystat where rownum=1;&lt;br /&gt;&lt;br /&gt;SID&lt;br /&gt;----------&lt;br /&gt;9&lt;br /&gt;&lt;br /&gt;通过如上的执行结果可以知道，当前参数设置session_cached_cursors的值为0，不缓存当前Session关闭的游标。当前Session的ID为9。&lt;br /&gt;Session Monitor:&lt;br /&gt;SQL&gt; SELECT SID, n.NAME para_name, s.VALUE used&lt;br /&gt;2 FROM SYS.v_$statname n, SYS.v_$sesstat s&lt;br /&gt;3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')&lt;br /&gt;4 AND s.statistic# = n.statistic#&lt;br /&gt;5 AND SID = 9;&lt;br /&gt;&lt;br /&gt;SID PARA_NAME USED&lt;br /&gt;--- ------------------------------ ----------&lt;br /&gt;9 opened cursors current 1&lt;br /&gt;9 session cursor cache count 0&lt;br /&gt;&lt;br /&gt;SQL&gt; select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;&lt;br /&gt;&lt;br /&gt;SID USER_NAME SQL_TEXT&lt;br /&gt;--- ---------- ------------------------------------------------------------&lt;br /&gt;9 SCOTT select sid from v$mystat where rownum=1&lt;br /&gt;通过如上的执行结果可以知道，当前在V$OPEN_CURSOR存储一个游标，对应SQL为Session Test执行的最后一条语句。V$SESSION_CACHED_CURSOR没有存储游标。&lt;br /&gt;&lt;br /&gt;2. 更改参数V$SESSION_CACHED_CURSOR值。&lt;br /&gt;Session Test:&lt;br /&gt;SQL&gt; alter session set session_cached_cursors = 1;&lt;br /&gt;&lt;br /&gt;Session altered.&lt;br /&gt;&lt;br /&gt;SQL&gt; show parameter session_cached_cursors;&lt;br /&gt;&lt;br /&gt;NAME TYPE VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;session_cached_cursors integer 1&lt;br /&gt;&lt;br /&gt;3. 验证如下结论。&lt;br /&gt;如果游标被存入SESSION_CACHED_CURSOR，前提是游标已经关闭，游标对应的SQL被执行3次以上。OPEN_CURSOR中会存储保存在SESSION_CACHED_CURSOR以及打开的游标（不是精确值）。&lt;br /&gt;Session Test:&lt;br /&gt;SQL&gt; select sid from v$mystat where rownum =1;&lt;br /&gt;&lt;br /&gt;SID&lt;br /&gt;----------&lt;br /&gt;9&lt;br /&gt;&lt;br /&gt;SQL&gt; select sid from v$mystat where rownum =1;&lt;br /&gt;&lt;br /&gt;SID&lt;br /&gt;----------&lt;br /&gt;9&lt;br /&gt;&lt;br /&gt;SQL&gt; select sid from v$mystat where rownum =1;&lt;br /&gt;&lt;br /&gt;SID&lt;br /&gt;----------&lt;br /&gt;9&lt;br /&gt;&lt;br /&gt;Session Monitor:&lt;br /&gt;&lt;br /&gt;SQL&gt; select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;&lt;br /&gt;&lt;br /&gt;SID USER_NAME SQL_TEXT&lt;br /&gt;--- ---------- ------------------------------------------------------------&lt;br /&gt;9 SCOTT select sid from v$mystat where rownum =1&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT SID, n.NAME para_name, s.VALUE used&lt;br /&gt;2 FROM SYS.v_$statname n, SYS.v_$sesstat s&lt;br /&gt;3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')&lt;br /&gt;4 AND s.statistic# = n.statistic#&lt;br /&gt;5 AND SID = 9;&lt;br /&gt;&lt;br /&gt;SID PARA_NAME USED&lt;br /&gt;--- ------------------------------ ----------&lt;br /&gt;9 opened cursors current 1&lt;br /&gt;9 session cursor cache count 0&lt;br /&gt;v$open_cursor dooes not show all open cursors. it shows more than that, the best option to find the number of open cursors is from v$sysstat.&lt;br /&gt;&lt;br /&gt;通过如上的执行结果可以知道，即使同一个游标被打开3次，在SESSION_CACHED_CURSOR的数量仍然为0。下面，将会在Session Test中关闭游标（通过执行一条其他的语句）。&lt;br /&gt;Session Test:&lt;br /&gt;SQL&gt; select * from t where rownum!=7;&lt;br /&gt;&lt;br /&gt;no rows selected&lt;br /&gt;Session Monitor:&lt;br /&gt;SQL&gt; SELECT SID, n.NAME para_name, s.VALUE used&lt;br /&gt;2 FROM SYS.v_$statname n, SYS.v_$sesstat s&lt;br /&gt;3 WHERE n.NAME IN ('opened cursors current', 'session cursor cache count')&lt;br /&gt;4 AND s.statistic# = n.statistic#&lt;br /&gt;5 AND SID = 9;&lt;br /&gt;&lt;br /&gt;SID PARA_NAME USED&lt;br /&gt;--- ------------------------------ ----------&lt;br /&gt;9 opened cursors current 1&lt;br /&gt;9 session cursor cache count 1&lt;br /&gt;&lt;br /&gt;SQL&gt; select SID, USER_NAME,SQL_TEXT from v$open_cursor where sid=9;&lt;br /&gt;&lt;br /&gt;SID USER_NAME SQL_TEXT&lt;br /&gt;--- ---------- ------------------------------------------------------------&lt;br /&gt;9 SCOTT select sid from v$mystat where rownum=1&lt;br /&gt;9 SCOTT select * from t where rownum!=7&lt;br /&gt;通过如上的执行结果可以知道，游标被打开3次之后，如果这个游标关闭之后，游标会被存储到SESSION_CACHED_CURSOR当中。同时，通过OPEN_CURSOR中显示的SQL可以得知，OPEN_CURSOR中会存储保存在SESSION_CACHED_CURSOR以及打开的游标（不是精确值）。&lt;br /&gt;&lt;br /&gt;SESSION_CACHED_CURSOR采用的是LRU算法，如果如果有新的游标需要缓存，而当前游标缓存已经满，最少使用的游标将会被清除出去。&lt;br /&gt;调整SESSION_CACHED_CURSOR参数。通过如下SQL得到从缓存中取游标以及取PARSE的数量，为调整作参考。&lt;br /&gt;select cach.value cache_hits, prs.value all_parses,&lt;br /&gt;prs.value-cach.value sess_cur_cache_not_used&lt;br /&gt;from v$sesstat cach, v$sesstat prs, v$statname nm1, v$statname nm2&lt;br /&gt;where cach.statistic# = nm1.statistic#&lt;br /&gt;and nm1.name = 'session cursor cache hits'&lt;br /&gt;and prs.statistic#=nm2.statistic#&lt;br /&gt;and nm2.name= 'parse count (total)'&lt;br /&gt;and cach.sid= &amp;sid and prs.sid= cach.sid ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;参考：&lt;/strong&gt;&lt;br /&gt;Monitoring Open and Cached Cursors&lt;br /&gt;http://www.orafaq.com/node/758&lt;br /&gt;v$open_cursor与session_cached_cursor&lt;br /&gt;http://wzwanghai.spaces.live.com/Blog/cns!1p6cztYuyVBgutMjvxSWkuhw!151.entry&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-4041759078586989157?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/4041759078586989157/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=4041759078586989157' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4041759078586989157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/4041759078586989157'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/11-vopencursor-vsessioncachedcursoropen.html' title='V$OPEN_CURSOR, V$SESSION_CACHED_CURSOR'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-6330167735683856558</id><published>2007-06-18T11:02:00.000-07:00</published><updated>2007-06-22T16:35:59.353-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jinitiator'/><category scheme='http://www.blogger.com/atom/ns#' term='Cache'/><title type='text'>Jinitiator默认大小</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;br /&gt;Compuware统计结果显示许多instance的launce transaction都显示为red，证明性能没有达到定义的SLA水平。其实这个Launce transaction的动作就是——打开浏览器，输入ERP的Form登录地址，载入显示登录界面。为什么这么简单的事务性能却很差。作为访问ERP客户的Agent离ERP服务器很近，网络不应该是考虑因素。最后定位为Cache问题。通过控制面板中，点开Jinitiator，察看Cache面板，缓存大小为安装默认的50M。察看存放缓存的目录，已经达到48M。因为在这个Agent上会访问很多的Instance，所以会有相当多的Jar需要Cache。然后，在Basic面板，Enable Java Console，这样可以从Console查看Applet载入的过程。打开一个最近很少访问的ERP地址，从Console可以看到有部分Jar文件需要重新Download（因为不在Cache目录中），有部分Jar从Cache目录中删除（因为已经达到Cache目录的最大限制），这些都是消耗时间的步骤。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;解决方法&lt;/strong&gt;：&lt;br /&gt;增大Cache目录大小。选定无限制，这是因为这个Agent还有20G，而只用来测试ERP性能。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;其他：&lt;/strong&gt;&lt;br /&gt;可以通过控制台设定Java使用的Cache大小，如果系统运行过程中发现是因为客户端速度太慢的问题。先观察一下更改Cache后的结果在说。有资料说The caching mechanism uses a smart expansion algorithm to store JAR files in an uncompressed format。找了很久没有找到到底是什么smart expansion algorithm。算了，也不重要了。&lt;br /&gt;&lt;br /&gt;登录Agent后，发现Cache目录的大小刚刚被人改掉了，出手太慢。检查一下Cache目录大小，已经达到61M了。应该和设想的一样。其他性能较差部分，需要再检查一遍QRun的脚本，看到底是服务器性能问题还是脚本问题。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;参考：&lt;br /&gt;&lt;/strong&gt;Metalink: Doc ID: Note:310976.1&lt;br /&gt;http://www.oracle.com/technology/software/products/developer/files/1.3.1.25/readme.html&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-6330167735683856558?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/6330167735683856558/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=6330167735683856558' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6330167735683856558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/6330167735683856558'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/jinitiator.html' title='Jinitiator默认大小'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-1278486445779453515</id><published>2007-06-17T11:12:00.000-07:00</published><updated>2007-06-22T16:36:37.235-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SET_CONTEXT'/><title type='text'>察看当前Session登录的数据库</title><content type='html'>&lt;span style="font-size:85%;"&gt;如果可以访问V$表，可以通过&lt;br /&gt;select instance_name, version from v$instance;&lt;br /&gt;&lt;br /&gt;如果没有相关权限，也可以通过SYS_CONTEXT得到Session登录的数据库。&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'DB_NAME') db_name from dual;&lt;br /&gt;&lt;br /&gt;通过sys_context( namespace, parameter, [ length ] )，可以获取Oracle相关的环境信息。如果需要得到当前session的Oracle相关信息，在namespace的参数值为'USERENV'。还可以通过userenv函数来获取当前session的Oracle相关信息，这是一个遗留函数，Oracle推荐使用sys_context来获取。DBMS_SESSION.set_context设置parameter的值。&lt;br /&gt;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'TERMINAL') terminal from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'LANGUAGE') language from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'SESSIONID') sessionid from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'INSTANCE') instance from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'ENTRYID') entryid from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'ISDBA') isdba from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'NLS_TERRITORY') nls_territory from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'NLS_CURRENCY') nls_currency from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'NLS_CALENDAR') nls_calendar from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'NLS_DATE_FORMAT') nls_date_format from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'NLS_DATE_LANGUAGE') nls_date_language from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'NLS_SORT') nls_sort from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'CURRENT_USER') current_user from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'CURRENT_USERID') current_userid from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'SESSION_USER') session_user from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'SESSION_USERID') session_userid from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'PROXY_USER') proxy_user from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'PROXY_USERID') proxy_userid from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'DB_DOMAIN') db_domain from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'DB_NAME') db_name from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'HOST') host from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'OS_USER') os_user from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'EXTERNAL_NAME') external_name from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'IP_ADDRESS') ip_address from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'NETWORK_PROTOCOL') network_protocol from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'BG_JOB_ID') bg_job_id from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'FG_JOB_ID') fg_job_id from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'AUTHENTICATION_TYPE') authentication_type from dual;&lt;br /&gt;select SYS_CONTEXT('USERENV' ,'AUTHENTICATION_DATA') authentication_data from dual;&lt;br /&gt;&lt;br /&gt;执行DBMS_SESSION的SET_CONTEXT函数&lt;br /&gt;http://www.dbazine.com/blogs/blog-cf/chrisfoot/blogentry.2006-11-18.7319544765&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-1278486445779453515?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/1278486445779453515/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=1278486445779453515' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1278486445779453515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1278486445779453515'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/session.html' title='察看当前Session登录的数据库'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-1715384448183054349</id><published>2007-06-16T11:03:00.000-07:00</published><updated>2007-06-22T16:37:09.993-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='并发程序'/><category scheme='http://www.blogger.com/atom/ns#' term='可执行'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL*PLUS'/><title type='text'>定义SQL*PLUS类型的并发请求</title><content type='html'>&lt;span style="font-size:85%;"&gt;在定义可执行的时候，其中有一种类型为SQL*PLUS。虽然可能使用不频繁，但是这种类型在系统中的确存在。可以通过如下SQL查询当前系统中，各种类型可执行的数量。&lt;br /&gt;SELECT COUNT (*), meaning&lt;br /&gt;FROM fnd_executables_vl fev, fnd_lookups fl&lt;br /&gt;WHERE fev.execution_method_code = fl.lookup_code(+)&lt;br /&gt;AND fl.lookup_type = 'CP_EXECUTION_METHOD_CODE'&lt;br /&gt;GROUP BY meaning;&lt;br /&gt;通过输出结果可以发现，ERP中最多的类型为PL/SQL Stored Procedure，有2000多个，SQL*Plus只有300多个，Java类型的70个。记得Tom曾经说过，如果你的任务能够用SQL完成，那么就选择SQL，其次选在SQL*PLUS，然后PL/SQL，然后Java Procedure，然后C*PROC。Oracle绝大多数的并发请求都通过PL/SQL Stored Procedure实现。&lt;br /&gt;&lt;br /&gt;那么怎样定义一个SQL*PLUS的并发请求呢？&lt;br /&gt;1. 编写SQL*PLUS脚本，后缀为.sql。&lt;br /&gt;clear buffer;&lt;br /&gt;set heading on&lt;br /&gt;set verify off&lt;br /&gt;set feed off&lt;br /&gt;set linesize 80&lt;br /&gt;set pagesize 4&lt;br /&gt;set underline '='&lt;br /&gt;set serveroutput on size 1000000&lt;br /&gt;begin&lt;br /&gt;dbms_output.put_line('this is output by procedure dbms_output');&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;set heading off&lt;br /&gt;prompt&lt;br /&gt;select application_short_name app_name from applsys.fnd_application where rownum &lt;&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-1715384448183054349?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/1715384448183054349/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=1715384448183054349' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1715384448183054349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/1715384448183054349'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/sqlplus.html' title='定义SQL*PLUS类型的并发请求'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-429266944698350812.post-8245886994752326944</id><published>2007-06-15T10:56:00.000-07:00</published><updated>2007-06-26T13:59:32.502-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spfile'/><category scheme='http://www.blogger.com/atom/ns#' term='ORA- 01034'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>手工修改spife出现错误</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;br /&gt;正在阅读到Expert One on One Oracle，想验证log_buffer的最小值为最大数据块的4倍。打开位于${ORACLE_HOME}/database/ SPFILEORA9I.ORA的数据库参数文件，发现没有对应的参数条目，然后手工增加log_buffer=1，通过服务控制台重新启动数据库。然后通过sql/plus连接，发现不能连接数据库。出现的错误为“ORA- 01034 : ORACLE not available”，“ORA-27101 : shared memory realm does not exist”。Google一下，许多人提到这是因为数据库没有启动。手工启动数据库，相关命令如下：&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;c:&gt;sqlplus /nolog &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;sql&gt;conn &lt;/span&gt;&lt;a href="mailto:sys/abcdefg@server"&gt;&lt;span style="font-size:85%;"&gt;sys/abcdefg@server&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; as sysdba &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;sql&gt;startup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;而执行如上语句，能够连接数据库，但是startup的时候，系统却报错：“ora-00600,[][][]”。通过“Database Configuration Assistant”进行参数修改的时候，出现同样的错误。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;解决方法&lt;/strong&gt;：&lt;br /&gt;&lt;br /&gt;Google一下，原来有人和我犯了同样的错误：Sfile是一个二进制文件，不能通过文本的方式修改。如果需要修改，必须通过“alter system set ... scope=.. ”或者先修改，然后通过“create spfile from pfile;”将pfile里的内容复制到spfile里。 参考：&lt;/span&gt;&lt;a href="http://www.itpub.net/226670,1.html"&gt;&lt;span style="font-size:85%;"&gt;http://www.itpub.net/226670,1.html&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;。&lt;br /&gt;&lt;br /&gt;1) 将${ORACLE_HOME}/admin/ora9i/pfile/init.ora.4162007215332文件（这是数据库的pfile参数文件，8i前使用，可以手工编辑）拷贝到${ORACLE_HOME}/database目录下，更名为init.ora。&lt;br /&gt;&lt;br /&gt;2) 运行如下命令，使用Pfile参数文件打开数据库。&lt;br /&gt;sqlplus /nolog&lt;br /&gt;conn &lt;/span&gt;&lt;a href="mailto:sys/abcdefg@server"&gt;&lt;span style="font-size:85%;"&gt;sys/abcdefg@server&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; as sysdba&lt;br /&gt;startup pfile =${ORACLE_HOME}/databaseinit.ora;&lt;br /&gt;&lt;br /&gt;3) 从Pfile重新创建Spfile。create spfile from pfile = 'init.ora';&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Spfile相关内容：&lt;br /&gt;&lt;/strong&gt;找到了eygle关于Spfile的文章（&lt;/span&gt;&lt;a href="http://www.eygle.com/faq/Oracle9i.New.Feature.Spfile.01.htm"&gt;&lt;span style="font-size:85%;"&gt;http://www.eygle.com/faq/Oracle9i.New.Feature.Spfile.01.htm&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;）。&lt;br /&gt;&lt;br /&gt;1). Oracle通过startup时候，搜索参数文件的顺序：&lt;br /&gt;a.spfile${ORACLE_SID}.ora in (NT: ${ORACLE_HOME}/database)&lt;br /&gt;b.spfile.ora in (NT: ${ORACLE_HOME}/database)&lt;br /&gt;c.init${ORACLESID}.ora in (NT: ${ORACLE_HOME}/database or${ORACLE_HOME}/admindb_name/pfile)&lt;br /&gt;&lt;br /&gt;2).修改参数ALTER SYSTEM ，SCOPE参数有三个可选值：MEMORY ,SPFILE , BOTH。&lt;br /&gt;&lt;br /&gt;3).查询是否使用了Spfile。&lt;br /&gt;&lt;br /&gt;SELECT name,value FROM v$parameter WHERE name='spfile';&lt;br /&gt;SHOW PARAMETER spfile;&lt;br /&gt;SELECT COUNT(*) FROM v$spparameter WHERE value IS NOT NULL;&lt;br /&gt;&lt;br /&gt;4).使用Rman备份Spfile。&lt;br /&gt;&lt;br /&gt;5).使用Spfile屏蔽或者更改Oracle行为。alter system set event='10841 trace name context forever' scope=spfile;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;其他问题。&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;解决问题的过程中，使用“Startup pfile”命令的时候还出现过“ORA-01031: insufficient privileges upon instance startup”错误。一般检查两个地方，登录系统的O/S用户是否在ORA_DBA用户组中。另为，是否配置${ORACLE_HOME}/network/admin下的sqlnet.ora文件是否存在，以及是否有“SQLNET.AUTHENTICATION_SERVICES = (NTS)”条目，否在Oracle不能使用O/S认证。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/429266944698350812-8245886994752326944?l=gooply.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gooply.blogspot.com/feeds/8245886994752326944/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=429266944698350812&amp;postID=8245886994752326944' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8245886994752326944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/429266944698350812/posts/default/8245886994752326944'/><link rel='alternate' type='text/html' href='http://gooply.blogspot.com/2007/06/spife.html' title='手工修改spife出现错误'/><author><name>Dreaming Bug</name><uri>http://www.blogger.com/profile/00298973410574940859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/x/blogger/7172/4236/1600/918855/SignLogon.jpg'/></author><thr:total>0</thr:total></entry></feed>
