﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java思维-随笔分类-Oracle Technology</title><link>http://www.blogjava.net/john_yu/category/3524.html</link><description>正在学习中：（</description><language>zh-cn</language><lastBuildDate>Mon, 28 Jan 2008 19:11:07 GMT</lastBuildDate><pubDate>Mon, 28 Jan 2008 19:11:07 GMT</pubDate><ttl>60</ttl><item><title>Oracle 内存分配建议</title><link>http://www.blogjava.net/john_yu/archive/2008/01/28/178286.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Mon, 28 Jan 2008 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2008/01/28/178286.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/178286.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2008/01/28/178286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/178286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/178286.html</trackback:ping><description><![CDATA[<table style="border-collapse: collapse; word-wrap: break-word" cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td align="center" height="25"></strong></font><br />
            </td>
        </tr>
        <tr>
            <td bgcolor="#d2dee2" height="1"></td>
        </tr>
        <tr>
            <td bgcolor="#ffffff" height="1"></td>
        </tr>
        <tr>
            <td align="center">
            <table style="border-collapse: collapse; word-wrap: break-word" cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td width="100%">
                        <div id="art" style="margin: 15px" width="100%">
                        <div align="center">&nbsp;<font style="font-size: 14pt" color="#02368d"><strong>Oracle 内存分配建议</strong></font></div>
                        <div>关于SGA设置的一点总结 </div>
                        <div>本总结不针对特例，仅对服务器只存在OS + ORACLE 为例，如果存在其他应用请酌情考虑<br />
                        写这个也是因为近来这种重复性的问题发生的太多所导致的<br />
                        <br />
                        首先不要迷信STS,SG,OCP,EXPERT 等给出的任何建议、内存百分比的说法<br />
                        基本掌握的原则是， data buffer 通常可以尽可能的大，shared_pool_size 要适度，log_buffer 通常大到几百K到1M就差不多了<br />
                        <br />
                        设置之前，首先要明确2个问题<br />
                        1： 除去OS和一些其他开销，能给ORACLE使用的内存有多大<br />
                        2：oracle是64bit or 32 bit,32bit 通常 SGA有 1.7G 的限制(某些OS的处理或者WINDOWS上有特定设定可以支持到2G以上甚至达到3.7G，本人无这方面经验)<br />
                        <br />
                        下面是我的windows2000下的oracle :<br />
                        <br />
                        SQL&gt; select * from v$version;<br />
                        <br />
                        BANNER<br />
                        ----------------------------------------------------------------<br />
                        Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production<br />
                        PL/SQL Release 8.1.7.0.0 - Production<br />
                        CORE 8.1.7.0.0 Production<br />
                        TNS for 32-bit Windows: Version 8.1.7.0.0 - Production<br />
                        NLSRTL Version 3.4.1.0.0 - Production<br />
                        <br />
                        SQL&gt; <br />
                        <br />
                        windows上存在32bit的限制，如AIX、HP UNIX 等有明确的64BIT OS and ORACLE的版本，32bit oracle可以装在64bit os 上，64 bit oracle不能装在32 bit OS上<br />
                        <br />
                        不管oracle是32 bit ORACLE还是 64 bit 的,假定应用存在没有很好的使用bind var 的情况，也不能设置 shared_pool_size 过大，通常应该控制在200M--300M,如果是 ORACLE ERP 一类的使用了很多存储过程函数、包 ，或者很大的系统，可以考虑增大shared_pool_size ,但是如果超过500M可能是危险的，达到1G可能会造成CPU的严重负担，系统甚至瘫痪。所以shared_pool_size 如果超过300M还命中率不高，那么应该从应用上找原因而不是一味的增加内存，shared_pool_size 过大主要增加了管理负担和latch 的开销。<br />
                        <br />
                        log_buffer : 128K ---- 1M 之间通常问题不大，不应该太大<br />
                        <br />
                        large_pool_size :如果不设置MTS，通常在 RMAN 、OPQ 会使用到，但是在10M --- 50M 应该差不多了。假如设置 MTS,则由于 UGA 放到large_pool_size 的缘故，这个时候依据 session最大数量和 sort_ares_size 等参数设置，必须增大large_pool_size 的设置，可以考虑为 session * (sort_area_size + 2M)。这里要提醒一点，不是必须使用MTS，我们都不主张使用MTS，尤其同时在线用户数小于500的情况下。<br />
                        <br />
                        java_pool_size : 若不使用java，给30M通常就够了<br />
                        <br />
                        data buffer ,在做了前面的设置后，凡可以提供给oracle的内存，都应该给data buffer = (db_block_size * db_block_buffers)<br />
                        在9i 中可以是 db_cache_size<br />
                        <br />
                        还有2个重要参数我们需要注意<br />
                        <br />
                        sort_area_size and hash_area_size <br />
                        这两个参数在非MTS下都是属于PGA ，不属于SGA,是为每个session单独分配的，在我们的服务器上除了OS + SGA,一定要考虑这两部分<br />
                        <br />
                        (****) : OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + 2M) &lt; 总物理RAM 为好<br />
                        <br />
                        <br />
                        这样归结过来，假定oracle是 32 bit ,服务器RAM大于2G ，注意你的PGA的情况，,则建议<br />
                        <br />
                        shared_pool_size + data buffer +large_pool_size + java_pool_size &lt; 1.6G<br />
                        <br />
                        <br />
                        再具体化，注意满足上面(****) 的原则的基础上可以参考如下设置<br />
                        如果512M RAM<br />
                        建议 shared_pool_size = 50M, data buffer = 200M<br />
                        <br />
                        如果1G RAM <br />
                        shared_pool_size = 100M , data buffer = 500M<br />
                        <br />
                        如果2G <br />
                        shared_pool_size = 150M ,data buffer = 1.2G<br />
                        <br />
                        物理内存再大已经跟参数没有关系了<br />
                        <br />
                        <br />
                        假定64 bit ORACLE<br />
                        <br />
                        内存4G <br />
                        shared_pool_size = 200M , data buffer = 2.5G<br />
                        <br />
                        内存8G<br />
                        shared_pool_size = 300M , data buffer = 5G<br />
                        <br />
                        内存 12G<br />
                        shared_pool_size = 300M-----800M , data buffer = 8G<br />
                        <br />
                        <br />
                        <br />
                        以上仅为参考值，不同系统可能差异比较大，需要根据具体情况调整。建议在设置参数的同时，init中使用 lock_sga ，在不同的平台上可能有不同的方式，使得SGA锁定在物理内存中而不被放入 SWAP 中，这样对效率有好处<br />
                        <br />
                        <br />
                        关于内存的设置，要再进行细致的调整，起的作用不大，但可根据statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch 等view信息来考虑微调</div>
                        </div>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table><img src ="http://www.blogjava.net/john_yu/aggbug/178286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2008-01-28 23:58 <a href="http://www.blogjava.net/john_yu/archive/2008/01/28/178286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 回滚段空间回收步骤</title><link>http://www.blogjava.net/john_yu/archive/2007/12/27/170768.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Wed, 26 Dec 2007 16:50:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2007/12/27/170768.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/170768.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2007/12/27/170768.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/170768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/170768.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;是谁"偷偷的"用了那么多空间呢(本来有几十个G的Free磁盘空间的)?检查数据库表空间占用空间情况:                                    SQL&gt; select tablespace_name,sum(bytes)/1024/1024/1024 GB            &nbsp;2&nbsp;from dba...&nbsp;&nbsp;<a href='http://www.blogjava.net/john_yu/archive/2007/12/27/170768.html'>阅读全文</a><img src ="http://www.blogjava.net/john_yu/aggbug/170768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2007-12-27 00:50 <a href="http://www.blogjava.net/john_yu/archive/2007/12/27/170768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle安装的一些问题收集</title><link>http://www.blogjava.net/john_yu/archive/2007/10/24/155670.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Wed, 24 Oct 2007 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2007/10/24/155670.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/155670.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2007/10/24/155670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/155670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/155670.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在安装过程中出现的一些问题的解决办法。值得收藏与学习。比如在安装的时候如果有中文的路径则会出现类似这样的提示:加载数据库时出错：areasQueriesOracle的系统要求 企业版：CPU　最低PENTIUM　200M　推荐　PENTIUMIII　1G以上 　　　　内存　最低128M　推荐　512M 　　　　硬盘空间　系统盘140M　安装盘4.5G（FAT32）或2.75G（...&nbsp;&nbsp;<a href='http://www.blogjava.net/john_yu/archive/2007/10/24/155670.html'>阅读全文</a><img src ="http://www.blogjava.net/john_yu/aggbug/155670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2007-10-24 20:50 <a href="http://www.blogjava.net/john_yu/archive/2007/10/24/155670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORA-27121 错误，找了好半天:(</title><link>http://www.blogjava.net/john_yu/archive/2007/07/17/130890.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Tue, 17 Jul 2007 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2007/07/17/130890.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/130890.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2007/07/17/130890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/130890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/130890.html</trackback:ping><description><![CDATA[<p>遇到 ORA-27121 错误<br><font size=2>ORA-01034: ORACLE not available<br>ORA-27121: unable to determine size of shared memory segment<br>Linux Error: 13: Permission denied<br></font>
<p><font size=2>主要是因为oracle安装程序没有给oracle这个可执行程序设置正确的setuid。这样设置一下：</font></p>
<p><font size=2>$ cd $ORACLE_HOME/bin<br>$ chmod 6751 oracle</font></p>
<p><font size=2>结果类似这样就行了。</font></p>
<p><font size=2>$ ls -l $ORACLE_HOME/bin/oracle<br>-rwsr-s--x 1 oracle oinstall 23352783 Aug 14 2001 /home/oracle/app/oracle/product/8.1.6/bin/oracle</font></p>
<br><br>这个错误的典型现象：使用oracle用户一切正常，但是在使用其它用户时，使用sqlplus无法登录，报告上面的错误！<img src ="http://www.blogjava.net/john_yu/aggbug/130890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2007-07-17 17:03 <a href="http://www.blogjava.net/john_yu/archive/2007/07/17/130890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 的Trigger 中不能操作基表(转)</title><link>http://www.blogjava.net/john_yu/archive/2007/04/27/114215.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Fri, 27 Apr 2007 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2007/04/27/114215.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/114215.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2007/04/27/114215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/114215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/114215.html</trackback:ping><description><![CDATA[<div class=textbox-title>
<h4><span id=starid133></span>&nbsp;<a href="http://www.skyage.cn/blog/read.php/133.htm"><u><font color=#0000ff>Oracle 的Trigger 中不能操作基表</font></u></a> </h4>
</div>
<div class=textbox-content id=zoomtext>
<p><font size=2>在将SYBASE的Trigger移植到ORACLE的时候发现一个问题，</font></p>
<p><font size=2>就是在一张表的Trigger中不能含有操作该基表的SQL，</font></p>
<p><font size=2>例如STOCKINFO的Trigger里不有操作STOCKINFO的SQL。</font></p>
<p><font size=2>那加权平均价如何取呢？</font></p>
<p><font size=2>现在只能在原平均价的基础再与新价进行加权平均，结果是一样的。</font></p>
<p><font size=2>注意：</font></p>
<p><font size=2>AFTER UPDATE的Trigger不能操作基表，只有在BEFORE INSERT的Trigger里才能操作基表。</font></p>
<p><font size=2>BEFORE INSERT的Trigger只有用INSERT INTO T1(COL1) VALUES('1');才有效，</font></p>
<p><font size=2>INSERT INTO T1(COL1) SELECT '1'&nbsp;FROM DUAL;也是无效的。</font></p>
<p><font size=2>例如：</font></p>
<p>SQL&gt; insert into t1 values (1,'a'); --先插入一条数据，避免ORA-01403: no data found 错误。<br>1 row inserted<br>SQL&gt; commit;</p>
<p>SQL&gt; create or replace trigger tri_t1<br>2 before insert on t1 for each row<br>3 declare<br>4 cvar varchar2(10);<br>5 begin<br>6 select 'Y' into cvar from t1 WHERE ROWNUM=1;<br>7 end;<br>8 /<br>Trigger created</p>
<p>SQL&gt; insert into t1 values (2,'b'); -- insert into ... values 没有问题<br>1 row inserted</p>
<p>SQL&gt; insert into t1 select '3','c' from dual; -- insert into ... select .. from 报错<br>ORA-04091: table TEST.T1 is mutating, trigger/function may not see it<br>ORA-06512: at "TEST.TRI_T1", line 4<br>ORA-04088: error during execution of trigger 'TEST.TRI_T1'</p>
<p>&nbsp;<font size=2>并且:old和:new只有在行级（for each row）的Trigger有效。</font></p>
<p><font size=2>网上原文：</font></p>
<font size=2>
<h3 class=title>ORA-04091与 table mutating</h3>
<p>近日解决了一个trigger中报ORA-04091错误的问题，补了关于Oracle table mutating的一课：</p>
<p>mutating table 是指一个当前正在被update,delete,insert语句修改的表，如果在一个行级别的trigger中读取或修改一个mutating table，则往往会遇到ORA-04091错误.例如，如果在trigger中使用了select或dml 语句访问trigger所在的表，则就会收到这个错误。</p>
<p>然而，Oracle8i和9i文档中都没有解释清楚before和after 类型的 row trigger 在对待两种不同的insert语句(insert into ... values ... 与 insert into ... select ...)时的差别：</p>
<p>1、对于after 类型的 for each row 级别的triggers，不论哪种insert语句触发了trigger，都不允许在 trigger 中访问本trigger所依赖的table的，测试如下：<br>SQL&gt; create table t1 ( c1 number,c2 varchar2(10));<br>Table created<br>SQL&gt; create or replace trigger tri_t1<br>2 after insert on t1 for each row<br>3 declare<br>4 cvar varchar2(10);<br>5 begin<br>6 select 'Y' into cvar from t1 WHERE ROWNUM=1; --这里访问了trigger 本表<br>7 end;<br>8 /<br>Trigger created</p>
<p>SQL&gt; insert into t1 values (1,'a');<br>ORA-04091: table TEST.T1 is mutating, trigger/function may not see it<br>ORA-06512: at "TEST.TRI_T1", line 4<br>ORA-04088: error during execution of trigger 'TES.TRI_T1'</p>
<p>SQL&gt; insert into t1 select '1','a' from dual;<br>ORA-04091: table TEST.T1 is mutating, trigger/function may not see it<br>ORA-06512: at "TEST.TRI_T1", line 4<br>ORA-04088: error during execution of trigger 'TEST.TRI_T1'</p>
<p>2、对于before 类型的 for each row 级别的triggers，如果使用 insert into ... values 语句触发此trigger ，则在trigger 中访问本table没有问题；<br>但如果使用 insert into select .. from 语句触发此trigger ，则在trigger 中访问本table就报ora-04091错误；<br>只有在Oracle 7标准的开发文档中有这样的说明：<br>From the Application Developers Guide <br>"There is an exception to this restriction;<br>For single row INSERTs, constraining tables are mutating for<br>AFTER row triggers, but not for BEFORE row triggers. <br>INSERT statements that involve more than 1 row are not considered<br>single row inserts." <br>"INSERT INTO &lt;table_name&gt; SELECT ..." are not considered single row <br>inserts, even if they only result in 1 row being inserted.</p>
<p>测试如下：<br>SQL&gt; drop trigger tri_t1;<br>Trigger dropped</p>
<p>SQL&gt; insert into t1 values (1,'a'); --先插入一条数据，避免ORA-01403: no data found 错误。<br>1 row inserted<br>SQL&gt; commit;</p>
<p>SQL&gt; create or replace trigger tri_t1<br>2 before insert on t1 for each row<br>3 declare<br>4 cvar varchar2(10);<br>5 begin<br>6 select 'Y' into cvar from t1 WHERE ROWNUM=1;<br>7 end;<br>8 /<br>Trigger created</p>
<p>SQL&gt; insert into t1 values (2,'b'); -- insert into ... values 没有问题<br>1 row inserted</p>
<p>SQL&gt; insert into t1 select '3','c' from dual; -- insert into ... select .. from 报错<br>ORA-04091: table TEST.T1 is mutating, trigger/function may not see it<br>ORA-06512: at "TEST.TRI_T1", line 4<br>ORA-04088: error during execution of trigger 'TEST.TRI_T1'</p>
<p>我们的开发人员因为不知道这个特别情况，近日在修改一个存储过程时候，将原来的insert values 写法改成了insert select 写法，而trigger 又是before类型的，导致出现了ORA-04091错误，搞得分析了好久也没有头绪。</p>
<p>其实，在metalink中有一篇note说到了：</p>
<p>
<p>文档 ID: 注释:132569.1 <br>主题: ORA-4091 on BEFORE ROW TRIGGER with INSERT statement <br>类型: PROBLEM <br>状态: PUBLISHED <br>内容类型: TEXT/X-HTML <br>创建日期: 16-JAN-2001 <br>上次修订日期: 09-AUG-2004 <br></p>
<p>
<p>Problem Description<br>-------------------</p>
<p>You want to do an insert into a table that has a BEFORE row Trigger.</p>
<p>When you hard code the values into the INSERT statement, the trigger works fine.</p>
<p>For example:<br><br>INSERT <br>INTO content (cont_name,cont_seg,cat_seq)<br>VALUES('blah',100,200);</p>
<p>1 row created.</p>
<p>However, your trigger errors with ERROR ORA-4091 with <br>INSERT INTO...select statement:</p>
<p>INSERT<br>INTO content (cont_name,cont_seq,cat_seq) (select....from category);</p>
<p>ERROR at line 1:<br>ORA-4091: table &lt;schema&gt;.CONTENT is mutating, trigger/function may not see it<br>ORA-6512: at "&lt;schema&gt;.INS_CONTENT", line 4<br>ORA-4088: error during execution of trigger '&lt;schema&gt;.INS_CONTENT'</p>
<p><br>TRIGGER:</p>
<p>CREATE OR REPLACE trigger INS_CONTENT<br>BEFORE INSERT on CONTENT <br>FOR EACH ROW<br>DECLARE <br>max_sort number;<br>BEGIN<br>SELECT max(cont_sort) INTO max_sort FROM CONTENT;<br>IF max_sort IS NOT NULL AND max_sort!= 99999 THEN<br>IF :new.cont_sort IS NULL THEN<br>:new.cont_sort := max_sort +1;<br>END IF;<br>END IF;<br>SELECT SEQ_CONT_SEQ.nextval INTO :new.CONT_SEQ from dual; <br>END;</p>
<p><br>Explanation<br>-----------</p>
<p>Error: ORA 4091<br>Text: table %s.%s is mutating, trigger/function may not see it<br>-------------------------------------------------------------------------------<br>Cause: A trigger (or a user defined PL/SQL function that is referenced in<br>this statement) attempted to look at (or modify) a table that was<br>in the middle of being modified by the statement which fired it.</p>
<p>Action: Rewrite the trigger (or function) so it does not read that table.</p>
<p>Explanation:<br>You cannot look at or modify the table that is mutating.</p>
<p>Note:<br>From the Application Developers Guide <br>"There is an exception to this restriction;<br>For single row INSERTs, constraining tables are mutating for<br>AFTER row triggers, but not for BEFORE row triggers. <br>INSERT statements that involve more than 1 row are not considered<br>single row inserts." <br><br>"INSERT INTO &lt;table_name&gt; SELECT ..." are not considered single row <br>inserts, even if they only result in 1 row being inserted.</p>
<p><br>RELATED DOCUMENTS<br>-----------------</p>
<p>Oracle Application Developer's Guide (A68003-01) <br>Chapter 'Using Database Triggers', page 13-22)</p>
</font></div><img src ="http://www.blogjava.net/john_yu/aggbug/114215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2007-04-27 22:36 <a href="http://www.blogjava.net/john_yu/archive/2007/04/27/114215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle ---管理UNDO表空间</title><link>http://www.blogjava.net/john_yu/archive/2007/04/03/108145.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Tue, 03 Apr 2007 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2007/04/03/108145.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/108145.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2007/04/03/108145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/108145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/108145.html</trackback:ping><description><![CDATA[<p><font size=2><span lang=EN-US>10.</span><span style="FONT-FAMILY: 宋体">管理</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间用于存放</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">当执行</span><span lang=EN-US>DML</span><span style="FONT-FAMILY: 宋体">操作</span><span lang=EN-US>(INSERT,UPDATE</span><span style="FONT-FAMILY: 宋体">和</span><span lang=EN-US>DELETE)</span><span style="FONT-FAMILY: 宋体">时</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">会将这些操作的旧数据写入到</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">在</span><span lang=EN-US>oracle9i</span><span style="FONT-FAMILY: 宋体">之前</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">管理</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据时使用</span><span lang=EN-US>(Rollback Segment)</span><span style="FONT-FAMILY: 宋体">完成的</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">从</span><span lang=EN-US>oracle9i</span><span style="FONT-FAMILY: 宋体">开始</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">管理</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据不仅可以使用回滚段</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">还可以使用</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">因为规划和管理回滚段比较复杂</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">所有</span><span lang=EN-US>oracle database 10g</span><span style="FONT-FAMILY: 宋体">已经完全丢弃用回滚段</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">并且使用</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间来管理</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据也称为回滚</span><span lang=EN-US>(ROLLBACK)</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">它用于确保数据的一致性</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">当执行</span><span lang=EN-US>DML</span><span style="FONT-FAMILY: 宋体">操作时</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">事务操作前的数据被称为</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">记录</span><span lang=EN-US>.UNDO</span><span style="FONT-FAMILY: 宋体">段用于保存事务所修改数据的旧值</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">其中存储着被修改数据块的位置以及修改前数据</span><span lang=EN-US>,</span></font></p>
<p><font size=2><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据的作用</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span lang=EN-US>1,</span><span style="FONT-FAMILY: 宋体">回退事务</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">当执行</span><span lang=EN-US>DML</span><span style="FONT-FAMILY: 宋体">操作修改数据时</span><span lang=EN-US>,UNDO</span><span style="FONT-FAMILY: 宋体">数据被存放到</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">而新数据则被存放到数据段中</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">如果事务操作存在问题</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">旧需要回退事务</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">以取消事务变化</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">假定用户</span><span lang=EN-US>A</span><span style="FONT-FAMILY: 宋体">执行了语句</span><span lang=EN-US>UPDATE emp SET sal=1000 WHERE empno=7788</span><span style="FONT-FAMILY: 宋体">后发现</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">应该修改雇员</span><span lang=EN-US>7963</span><span style="FONT-FAMILY: 宋体">的工资</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">而不是雇员</span><span lang=EN-US>7788</span><span style="FONT-FAMILY: 宋体">的工资</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">那么通过执行</span><span lang=EN-US>ROLLBACK</span><span style="FONT-FAMILY: 宋体">语句可以取消事务变化</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">当执行</span><span lang=EN-US>ROLLBACK</span><span style="FONT-FAMILY: 宋体">命令时</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">会将</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>800</span><span style="FONT-FAMILY: 宋体">写回的数据段中</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span lang=EN-US>2,</span><span style="FONT-FAMILY: 宋体">读一致性</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">用户检索数据库数据时</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">总是使用用户只能看到被提交过的数据</span><span lang=EN-US>(</span><span style="FONT-FAMILY: 宋体">读取提交</span><span lang=EN-US>)</span><span style="FONT-FAMILY: 宋体">或特定时间点的数据</span><span lang=EN-US>(SELECT</span><span style="FONT-FAMILY: 宋体">语句时间点</span><span lang=EN-US>).</span><span style="FONT-FAMILY: 宋体">这样可以确保数据的一致性</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">例如</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">当用户</span><span lang=EN-US>A</span><span style="FONT-FAMILY: 宋体">执行语句</span><span lang=EN-US>UPDATE emp SET sal=1000 WHERE empno=7788</span><span style="FONT-FAMILY: 宋体">时</span><span lang=EN-US>,UNDO</span><span style="FONT-FAMILY: 宋体">记录会被存放到回滚段中</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">而新数据则会存放到</span><span lang=EN-US>EMP</span><span style="FONT-FAMILY: 宋体">段中</span><span lang=EN-US>;</span><span style="FONT-FAMILY: 宋体">假定此时该数据尚未提交</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">并且用户</span><span lang=EN-US>B</span><span style="FONT-FAMILY: 宋体">执行</span><span lang=EN-US>SELECT sal FROM emp WHERE empno=7788,</span><span style="FONT-FAMILY: 宋体">此时用户</span><span lang=EN-US>B</span><span style="FONT-FAMILY: 宋体">将取得</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>800,</span><span style="FONT-FAMILY: 宋体">而该数据正是在</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">记录中取得的</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span lang=EN-US>3,</span><span style="FONT-FAMILY: 宋体">事务恢复</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">事务恢复是例程恢复的一部分</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">它是由</span><span lang=EN-US>oracle server</span><span style="FONT-FAMILY: 宋体">自动完成的</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">如果在数据库运行过程中出现例程失败</span><span lang=EN-US>(</span><span style="FONT-FAMILY: 宋体">如断电</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">内存故障</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">后台进程故障等</span><span lang=EN-US>),</span><span style="FONT-FAMILY: 宋体">那么当重启</span><span lang=EN-US>oracle server</span><span style="FONT-FAMILY: 宋体">时</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">后台进程</span><span lang=EN-US>SMON</span><span style="FONT-FAMILY: 宋体">会自动执行例程恢复</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">执行例程恢复时</span><span lang=EN-US>,oracl</span><span style="FONT-FAMILY: 宋体">会重新做所有未应用的记录</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">回退未提交事务</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span lang=EN-US>4,</span><span style="FONT-FAMILY: 宋体">倒叙查询</span><span lang=EN-US>(FlashBack Query)</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">倒叙查询用于取得特定时间点的数据库数据</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">它是</span><span lang=EN-US>9i</span><span style="FONT-FAMILY: 宋体">新增加的特性</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">假定当前时间为上午</span><span lang=EN-US>11:00,</span><span style="FONT-FAMILY: 宋体">某用户在上午</span><span lang=EN-US>10:00</span><span style="FONT-FAMILY: 宋体">执行</span><span lang=EN-US>UPDATE emp SET sal=3500 WHERE empno=7788</span><span style="FONT-FAMILY: 宋体">语句</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">修改并提交了事务</span><span lang=EN-US>(</span><span style="FONT-FAMILY: 宋体">雇员原工资为</span><span lang=EN-US>3000),</span><span style="FONT-FAMILY: 宋体">为了取得</span><span lang=EN-US>10:00</span><span style="FONT-FAMILY: 宋体">之前的雇员工资</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">用户可以使用倒叙查询特征</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">参数</span></font></p>
<p><span lang=EN-US><font size=2>1,UNDO_MANAGEMENT</font></span></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">该初始化参数用于指定</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据的管理方式</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">如果要使用自动管理模式</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">必须设置该参数为</span><span lang=EN-US>AUTO,</span><span style="FONT-FAMILY: 宋体">如果使用手工管理模式</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">必须设置该参数为</span><span lang=EN-US>MANUAL,</span><span style="FONT-FAMILY: 宋体">使用自动管理模式时</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">会使用</span><span lang=EN-US>undo</span><span style="FONT-FAMILY: 宋体">表空间管理</span><span lang=EN-US>undo</span><span style="FONT-FAMILY: 宋体">管理</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">使用手工管理模式时</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">会使用回滚段管理</span><span lang=EN-US>undo</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>,</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">需要注意</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">使用自动管理模式时</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">如果没有配置初始化参数</span><span lang=EN-US>UNDO_TABLESPACE,oracle</span><span style="FONT-FAMILY: 宋体">会自动选择第一个可用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间存放</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">如果没有可用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">会使用</span><span lang=EN-US>SYSTEM</span><span style="FONT-FAMILY: 宋体">回滚段存放</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">记录</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">并在</span><span lang=EN-US>ALTER</span><span style="FONT-FAMILY: 宋体">文件中记载警告</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2>2,UNDO_TABLESPACE</font></span></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">该初始化参数用于指定例程所要使用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">使用自动</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">管理模式时</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">通过配置该参数可以指定例程所要使用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">在</span><span lang=EN-US>RAC(Real Application Cluster)</span><span style="FONT-FAMILY: 宋体">结构中</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">因为一个</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间不能由多个例程同时使用</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">所有必须为每个例程配置一个独立的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2>3,UNDO_RETENTION</font></span></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">该初始化参数用于控制</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据的最大保留时间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">其默认值为</span><span lang=EN-US>900</span><span style="FONT-FAMILY: 宋体">秒</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">从</span><span lang=EN-US>9i</span><span style="FONT-FAMILY: 宋体">开始</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">通过配置该初始化参数</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">可以指定</span><span lang=EN-US>undo</span><span style="FONT-FAMILY: 宋体">数据的保留时间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">从而确定倒叙查询特征</span><span lang=EN-US>(Flashback Query)</span><span style="FONT-FAMILY: 宋体">可以查看到的最早时间点</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">建立</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span></font></p>
<p><font size=2><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间专门用于存放</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">并且在</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间尚不能建立任何数据对象</span><span lang=EN-US>(</span><span style="FONT-FAMILY: 宋体">表</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">索引</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">簇</span><span lang=EN-US>)</span></font></p>
<p><font size=2><span lang=EN-US>1,</span><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>CREATE DATABASE</span><span style="FONT-FAMILY: 宋体">命令建立</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span lang=EN-US><span></span></span><span style="FONT-FAMILY: 宋体">当使用</span><span lang=EN-US>CREATE DATABASE</span><span style="FONT-FAMILY: 宋体">命令建立数据库时</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">通过指定</span><span lang=EN-US>UNDO TABLESPACE</span><span style="FONT-FAMILY: 宋体">选项</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">可以建立</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">示例如下</span><span lang=EN-US>:</span></font></p>
<p><span lang=EN-US><font size=2>CREATE DATABASE db01</font></span></p>
<p><span lang=EN-US><font size=2>&#8230;</font></span></p>
<p><span lang=EN-US><font size=2>UNDO TABLESPACE undotbs_01</font></span></p>
<p><span lang=EN-US><font size=2>DATAFILE &#8216;/u01/oracle/rbdb1/undo0101.dbf&#8217; SIZE 30M;</font></span></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">注意</span><span lang=EN-US>:UNDO TABLESPACE </span><span style="FONT-FAMILY: 宋体">子句不是必须的</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">如果使用自动</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">管理模式</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">并且没有指定该子句</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">那么建立数据库时会自动生成名为</span><span lang=EN-US>SYS_UNDOTBS</span><span style="FONT-FAMILY: 宋体">的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>2,</span><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>CREATE UNDO TABLESPACE</span><span style="FONT-FAMILY: 宋体">命令建立</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2>CREATE UNDO TABLESPACE undotbs3</font></span></p>
<p><span lang=EN-US><font size=2>DATAFILE &#8216;D:demoundotbs3.dbf&#8217; SIZE 10M;</font></span></p>
<p><font size=2></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">修改</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>ALTER TABLESPACE</span><span style="FONT-FAMILY: 宋体">命令修改</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">当事务用尽了</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间后</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>ALTER TABLESPACE &#8230; ADD DATAFILE</span><span style="FONT-FAMILY: 宋体">增加数据文件</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">当</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间所在的磁盘填满是</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>ALTER TABLESPACE &#8230; RENAME DATAFIEL </span><span style="FONT-FAMILY: 宋体">命令移动数据文件到其他磁盘上</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>ALTER DATABASE &#8230; OFFLINE/ONLINE</span><span style="FONT-FAMILY: 宋体">使表空间脱机</span><span lang=EN-US>/</span><span style="FONT-FAMILY: 宋体">联机</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">当数据库处于</span><span lang=EN-US>ARCHIVELOG</span><span style="FONT-FAMILY: 宋体">模式时</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">使用</span><span lang=EN-US>ALTER TABLESPACE &#8230;BEGIN BACKUP/END BACKUP</span><span style="FONT-FAMILY: 宋体">命令备份</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">切换</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">启动例程并打开数据库后</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">同一时刻特定例程只能使用一个</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">切换</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间是指停止例程当前使用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">并启动其他</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">下面以启用</span><span lang=EN-US>undotbs2</span><span style="FONT-FAMILY: 宋体">表空间为例</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">说明切换</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间的方法</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2>ALTER SYSTEM SET undo_tablespace=undotbs02;</font></span></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">在</span><span lang=EN-US>RAC(Real Application Cluster)</span><span style="FONT-FAMILY: 宋体">机构中</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">不同例程必须使用独立的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">而不能共用同一个</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">删除</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">当前例程正在使用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间是不能被删除的</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">如果确定要删除当前例程正在使用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">应首先切换</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">然后删除相应的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2>DROP TABLESPACE undotbs3;</font></span></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>1,</span><span style="FONT-FAMILY: 宋体">确定当前例程正在使用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p style="TEXT-INDENT: 36.75pt"><span lang=EN-US><font size=2>Show parameter undo_tablespace</font></span></p>
<p style="TEXT-INDENT: 36.75pt"><font size=2></font></p>
<p><font size=2><span lang=EN-US>2,</span><span style="FONT-FAMILY: 宋体">显示数据库的所有</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2><span></span>SELECT tablespace_name FROMdba_tablespaces WHERE contents=&#8217;UNDO&#8217;;</font></span></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>3,</span><span style="FONT-FAMILY: 宋体">显示</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间统计信息</span><span lang=EN-US>.</span></font></p>
<p style="TEXT-INDENT: 21pt"><font size=2><span style="FONT-FAMILY: 宋体">使用自动</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">管理模式时</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">需要合理地设置</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间的尺寸</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">为例合理规划</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间尺寸</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">应在数据库运行的高峰阶段搜集</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间的统计信息</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">最终根据该统计信息确定</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间的尺寸</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">通过查询动态性能视图</span><span lang=EN-US>V%UNDOSTAT,</span><span style="FONT-FAMILY: 宋体">可以搜集</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">统计信息</span><span lang=EN-US>.</span></font></p>
<p style="TEXT-INDENT: 21pt"><span lang=EN-US><font size=2>SELECT TO_CHAR(BEGIN_TIME,&#8217;HH24:MI:SS&#8217;) BEGIN_TIME,</font></span></p>
<p style="TEXT-INDENT: 21pt"><span lang=EN-US><font size=2><span></span>TO_CHAR(END_TIME,&#8217;HH24:MI:SS&#8217;) END_TIME,</font></span></p>
<p style="TEXT-INDENT: 21pt"><span lang=EN-US><font size=2><span></span>UNDOBLKS</font></span></p>
<p style="TEXT-INDENT: 21pt"><span lang=EN-US><font size=2>FROM V$UNDOSTAT;</font></span></p>
<p><font size=2><span lang=EN-US>BEGIN_TIME</span><span style="FONT-FAMILY: 宋体">用于标识起始统计时间</span><span lang=EN-US>,END_TIME</span><span style="FONT-FAMILY: 宋体">用于标识结束统计时间</span><span lang=EN-US>,UNDOBLKS</span><span style="FONT-FAMILY: 宋体">用于标识</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">数据所占用的数据块个数</span><span lang=EN-US>.oracle</span><span style="FONT-FAMILY: 宋体">每隔</span><span lang=EN-US>10</span><span style="FONT-FAMILY: 宋体">分钟生成一行统计信息</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>4,</span><span style="FONT-FAMILY: 宋体">显示</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段统计信息</span><span lang=EN-US>.</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">使用自动</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">管理模式时</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">会在</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间上自动建立</span><span lang=EN-US>10</span><span style="FONT-FAMILY: 宋体">个</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">通过查询动态信息视图</span><span lang=EN-US>V$ROLLNAME,</span><span style="FONT-FAMILY: 宋体">可以显示所有联机</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段的名称</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">通过查询动态性能视图</span><span lang=EN-US>V$ROLLLISTAT,</span><span style="FONT-FAMILY: 宋体">可以显示</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段的统计信息</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">通过在</span><span lang=EN-US>V$ROLLNAME</span><span style="FONT-FAMILY: 宋体">和</span><span lang=EN-US>V$ROLLLISTAT</span><span style="FONT-FAMILY: 宋体">之间执行连接查询</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">可以监视特定</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段的特定信息</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2>SELECT a.name, b.xacts, b.writes, b.extents</font></span></p>
<p><span lang=EN-US><font size=2>FROM v$rollname a, v$rollstat b</font></span></p>
<p><span lang=EN-US><font size=2>WHERE<span> </span>a.usn=b.usn;</font></span></p>
<p><font size=2><span lang=EN-US>Name</span><span style="FONT-FAMILY: 宋体">用于标识</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段的名称</span><span lang=EN-US>,xacts</span><span style="FONT-FAMILY: 宋体">用于标识</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段所包含的活动事务个数</span><span lang=EN-US>,</span></font></p>
<p><font size=2><span lang=EN-US>Writes</span><span style="FONT-FAMILY: 宋体">用于标识在</span><span lang=EN-US>undo</span><span style="FONT-FAMILY: 宋体">段上所写入的字节数</span><span lang=EN-US>,extents</span><span style="FONT-FAMILY: 宋体">用于标识</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段的区个数</span><span lang=EN-US>.</span></font></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>5,</span><span style="FONT-FAMILY: 宋体">显示活动事务信息</span><span lang=EN-US>.</span></font></p>
<p style="TEXT-INDENT: 26.25pt"><font size=2><span style="FONT-FAMILY: 宋体">当执行</span><span lang=EN-US>DML</span><span style="FONT-FAMILY: 宋体">操作时</span><span lang=EN-US>,oracle</span><span style="FONT-FAMILY: 宋体">会将这些操作的旧数据放到</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段中</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">动态性能视图</span><span lang=EN-US>v$session</span><span style="FONT-FAMILY: 宋体">用于显示会话的详细信息</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">动态性能视图</span><span lang=EN-US>v$transaction</span><span style="FONT-FAMILY: 宋体">用于显示事务的详细信息</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">动态性能视图</span><span lang=EN-US>v$rollname</span><span style="FONT-FAMILY: 宋体">用于显示联机</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段的名称</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">通过在这</span><span lang=EN-US>3</span><span style="FONT-FAMILY: 宋体">个动态性能视图之间执行连接查询</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">可以确定正在执行事务操作的会话</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">事务所使用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">段</span><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体">以及事务所占用的</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">块个数</span><span lang=EN-US>.</span></font></p>
<p style="TEXT-INDENT: 26.25pt"><font size=2>Col<span lang=EN-US> username format a10</span></font></p>
<p style="TEXT-INDENT: 26.25pt"><font size=2>Col<span lang=EN-US> name format a10</span></font></p>
<p style="TEXT-INDENT: 26.25pt"><span lang=EN-US><font size=2>SELECT a.username, b.name, c.used_ublk</font></span></p>
<p style="TEXT-INDENT: 26.25pt"><span lang=EN-US><font size=2>FROM v$session a, v$rollname b, v$transaction c</font></span></p>
<p style="TEXT-INDENT: 26.25pt"><span lang=EN-US><font size=2>WHERE a.saddr=c.ses_addr AND b.usn=c.xidusn</font></span></p>
<p style="TEXT-INDENT: 26.25pt"><span lang=EN-US><font size=2><span></span>AND a.username=&#8217;SCOTT&#8217;;</font></span></p>
<p><font size=2></font></p>
<p><font size=2><span lang=EN-US>6,</span><span style="FONT-FAMILY: 宋体">显示</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">区信息</span></font></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">数据字典视图</span><span lang=EN-US>dba_undo_extents</span><span style="FONT-FAMILY: 宋体">用于显示</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">表空间所有区的详细信息</span><span lang=EN-US>.</span><span style="FONT-FAMILY: 宋体">包括</span><span lang=EN-US>UNDO</span><span style="FONT-FAMILY: 宋体">区尺寸和状态等信息</span><span lang=EN-US>.</span></font></p>
<p><span lang=EN-US><font size=2>SELECT extend_id, bytes, status FROM dba_undo_extents</font></span></p>
<p><span lang=EN-US><font size=2>WHERE segment_name&#8217;_SYSSMU5$&#8217;;</font></span></p>
<p><font size=2><span style="FONT-FAMILY: 宋体">其中</span><span lang=EN-US>,extent_id</span><span style="FONT-FAMILY: 宋体">用于标识区编号</span><span lang=EN-US>,bytes</span><span style="FONT-FAMILY: 宋体">用于标识区尺寸</span><span lang=EN-US>,status</span><span style="FONT-FAMILY: 宋体">用于标识区状态</span><span lang=EN-US>(ACTIVE:</span><span style="FONT-FAMILY: 宋体">表示该区处于活动状态</span><span lang=EN-US>,EXPIRED:</span><span style="FONT-FAMILY: 宋体">标识该区未用</span><span lang=EN-US>).</span></font></p>
<p><font size=2></font></p>
<br><img src ="http://www.blogjava.net/john_yu/aggbug/108145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2007-04-03 10:52 <a href="http://www.blogjava.net/john_yu/archive/2007/04/03/108145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改oracle监听占用的8080端口 </title><link>http://www.blogjava.net/john_yu/archive/2007/03/21/105352.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Wed, 21 Mar 2007 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2007/03/21/105352.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/105352.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2007/03/21/105352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/105352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/105352.html</trackback:ping><description><![CDATA[sqlplus /nolog<br /> <br />SQL*Plus: Release 9.2.0.4.0 - Production on Sat Aug 6 14:24:49 2005<br /> <br />Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.<br /> <br />SQL&gt; connect / as sysdba;<br />Connected.<br />-- 把HTTP/WEBDAV端口从8080改到8081<br />SQL&gt; call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),<br />  2  '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081))<br />  3  /<br /> <br />Call completed.<br />-- 把FTP端口从2100改到2111 <br />SQL&gt;  call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),<br />  2  '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111))<br />  3  /<br /> <br />Call completed.<br /> <br />SQL&gt; commit;<br /> <br />Commit complete.<br /> <br />SQL&gt;  exec dbms_xdb.cfg_refresh;<br /> <br />PL/SQL procedure successfully completed.<br />-- 检查修改是否已经成功 <br />SQL&gt; select dbms_xdb.cfg_get from dual;<br /> <br />CFG_GET<br />--------------------------------------------------------------------------------<br />&lt;xdbconfig xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd" xmlns:xsi="http://w<br /> <br /><img src ="http://www.blogjava.net/john_yu/aggbug/105352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2007-03-21 19:41 <a href="http://www.blogjava.net/john_yu/archive/2007/03/21/105352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更改Oracle的默认监听端口 1521</title><link>http://www.blogjava.net/john_yu/archive/2006/12/26/90178.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Tue, 26 Dec 2006 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2006/12/26/90178.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/90178.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2006/12/26/90178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/90178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/90178.html</trackback:ping><description><![CDATA[<span style="COLOR: red">
				<font size="2">如何更改Oracle的默认监听端口（1521）</font>
		</span>
		<div align="left">
				<span style="FONT-SIZE: 9pt">Oracle</span>
				<span style="FONT-SIZE: 9pt">的默认监听端口为1521，你可以方便的依照下列步骤修改为其他端口：<br />[oracle@dbserver2 admin]$ cd $ORACLE_HOME/network/admin <br />[oracle@dbserver2 admin]$ vi listener.ora <br />修改这个文档中的1521端口为你需要的端口your port <br />[oracle@dbserver2 admin]$ lsnrctl stop <br />[oracle@dbserver2 admin]$ lsnrctl start <br />修改客户端的连接</span>
		</div><img src ="http://www.blogjava.net/john_yu/aggbug/90178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2006-12-26 22:05 <a href="http://www.blogjava.net/john_yu/archive/2006/12/26/90178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改 Oracle9i 8080端口问题</title><link>http://www.blogjava.net/john_yu/archive/2006/12/26/90177.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Tue, 26 Dec 2006 13:59:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2006/12/26/90177.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/90177.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2006/12/26/90177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/90177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/90177.html</trackback:ping><description><![CDATA[<h2>
				<a id="viewpost1_TitleUrl" href="/Victor/archive/2005/06/04/5554.html">
						<font color="#90be8c">修改 Oracle9i 8080端口问题</font>
				</a>
		</h2>Oracle 9i开始，创建数据库时默认包含了XDB特性。一旦启动了数据库和Listener，Oracle XDB的http服务就占用8080端口，刚好和JBoss、Tomcat等默认端口冲突。除了修改Tomcat等外，还可以修改XDB的配置。<br />Oracle XDB的端口设置不在配置文件中，而是在数据库里。修改XDB的http和ftp服务端口的方法有3种： 
<p>1.使用sys登录Oracle，利用dbms_xdb修改端口设置</p><p>  SQL&gt; -- Change the HTTP/WEBDAV port from 8080 to 8081<br />  SQL&gt; call dbms_xdb.cfg_update(updateXML(<br />    2        dbms_xdb.cfg_get()<br />    3      , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'<br />    4      , 8081))<br />    5  /</p><p>  Call completed. </p><p><br />  SQL&gt; -- Change the FTP port from 2100 to 2111<br />  SQL&gt; call dbms_xdb.cfg_update(updateXML(<br />    2         dbms_xdb.cfg_get()<br />    3       , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'<br />    4       , 2111))<br />    5  /</p><p>  Call completed. </p><p><br />  SQL&gt; COMMIT;</p><p>  Commit complete. </p><p><br />  SQL&gt; EXEC dbms_xdb.cfg_refresh;</p><p>  PL/SQL procedure successfully completed.</p><p><br />2.使用OEM console，选择数据库，XML Database，Configuration。更改XDB的有关设置。</p><p>3.去掉数据库的初始化参数：  dispatchers='(PROTOCOL=TCP) (SERVICE=XDB)'，将会禁止XDB的http和ftp服务。<br /></p><img src ="http://www.blogjava.net/john_yu/aggbug/90177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2006-12-26 21:59 <a href="http://www.blogjava.net/john_yu/archive/2006/12/26/90177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PCC-S-02014, Encountered the symbol "..." when expecting one of the following:</title><link>http://www.blogjava.net/john_yu/archive/2006/11/24/83200.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Fri, 24 Nov 2006 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2006/11/24/83200.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/83200.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2006/11/24/83200.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/83200.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/83200.html</trackback:ping><description><![CDATA[<p>proc cpp_suffix=cpp code=cpp txsPublic.pcc define=__linux UNSAFE_NULL=YES MODE=ORACLE DBMS=V8 CHAR_MAP=STRING INCLUDE=/home/tax/100/src/public/include INCLUDE=/home/tax/100/src/server/include INCLUDE=/usr/oracle/product/9.2.0/precomp/public</p>
		<p>Pro*C/C++: Release 9.2.0.6.0 - Production on Fri Nov 24 17:07:54 2006<br />Syntax error at line 52, column 37, file /usr/include/c++/3.4.3/bits/concept_check.h:<br />Error at line 52, column 37 in file /usr/include/c++/3.4.3/bits/concept_check.h<br />#define __glibcxx_function_requires(...)<br />....................................1<br />PCC-S-02014, Encountered the symbol "..." when expecting one of the following:</p>
		<p>   ) an identifier, define, elif, else, endif, error, if, ifdef,<br />   ifndef,<br />解决方法：<br />1、配置好 $ORACLE_HOME/precomp/admin/pcscfg.cfg 文件 <br />   根据你的系统不同，大概像这样</p>
		<pre>
				<br />sys_include=(/usr/lib/gcclib/i386redhatlinux/3.2.2/include,/u01/oracle/product/8.1.7/precomp/public,/usr/include,/usr/include/sys)
<br />include=(/u01/oracle/product/8.1.7/precomp/public)
<br />include=/u01/oracle/product/8.1.7/precomp/hdrs
<br />include=/u01/oracle/product/8.1.7/tpcc2x_2/src
<br />include=/u01/oracle/product/8.1.7/precomp/precomp/include
<br />include=/u01/oracle/product/8.1.7/precomp/oracore/include
<br />include=/u01/oracle/product/8.1.7/precomp/oracore/public
<br />include=/u01/oracle/product/8.1.7/precomp/rdbms/include
<br />include=/u01/oracle/product/8.1.7/precomp/rdbms/public
<br />include=/u01/oracle/product/8.1.7/precomp/rdbms/demo
<br />include=/u01/oracle/product/8.1.7/precomp/nlsrtl/include
<br />include=/u01/oracle/product/8.1.7/precomp/nlsrtl/public
<br />include=/u01/oracle/product/8.1.7/precomp/network_src/include
<br />include=/u01/oracle/product/8.1.7/precomp/network_src/public
<br />include=/u01/oracle/product/8.1.7/precomp/network/include
<br />include=/u01/oracle/product/8.1.7/precomp/network/public
<br />include=/u01/oracle/product/8.1.7/precomp/plsql/public
<br />ltype=short</pre>
		<br />
		<br />    <br />2、预编译的时候加上 parse=none 选项 <br />    proc iname=***  parse=none <br /><br />3、编译的时候要链接oracle的库文件， 加选项 -lclntsh <br />     下面是我参照别的网友的一个makefile文件， <br />   <pre><br />INCLDIR= -I. -I/u01/oracle/product/8.1.7/precomp/public -I/u01/oracle/product/8.1.7/rdbms/public -I/u01/oracle/product/8.1.7/rdbms/demo -I/u01/oracle/product/8.1.7/plsql/public -I/u01/oracle/product/8.1.7/network/public 
<br /><br />DFLAGS= -DPRECOMP -DLINUX -D_GNU_SOURCE -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS
<br /><br />CFLAGS= -O3
<br /><br />LIBPATH= -L/u01/oracle/product/8.1.7/lib/
<br /><br />LIBS=-lclntsh `cat /u01/oracle/product/8.1.7/lib/sysliblist` -ldl -lm
<br /><br />myproc:myproc.pc
<br />	proc parse=no iname=myproc.pc include=$(ORACLE_HOME)/precomp/public
<br />	gcc  -o $@ $@.c -I$(ORACLE_HOME)/precomp/public -L$(ORACLE_HOME)/lib -lclntsh -lclient8 $(LIBPATH) $(LIBS)
<br /><br />clean:
<br />	rm *.lis myproc.c myproc</pre><br /><img src ="http://www.blogjava.net/john_yu/aggbug/83200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2006-11-24 11:04 <a href="http://www.blogjava.net/john_yu/archive/2006/11/24/83200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle9i 2.0.4在Red Hat Enterprise Linux AS 3上的安装</title><link>http://www.blogjava.net/john_yu/archive/2006/02/09/30066.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Thu, 09 Feb 2006 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2006/02/09/30066.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/30066.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2006/02/09/30066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/30066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/30066.html</trackback:ping><description><![CDATA[<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="96%" border=0>
<TBODY>
<TR>
<TD width=7 height=7><IMG alt="" src="http://www.cublog.cn/templates/tech/images/w_left_top.gif" border=0></TD>
<TD width="100%" bgColor=#f3f3f3></TD>
<TD width=7 height=7><IMG alt="" src="http://www.cublog.cn/templates/tech/images/w_right_top.gif" border=0></TD></TR>
<TR>
<TD align=middle bgColor=#f3f3f3 colSpan=3>
<TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=middle height=25><STRONG><FONT color=#02368d size=5>Oracle9i 2.0.4在Red Hat Enterprise Linux AS 3上的安装</FONT></STRONG><BR></TD></TR>
<TR>
<TD bgColor=#d2dee2 height=1></TD></TR>
<TR>
<TD bgColor=#ffffff height=1></TD></TR>
<TR>
<TD align=middle>
<TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width=580>
<DIV id=art style="MARGIN: 15px; LINE-HEIGHT: 150%" width="100%"><PRE><P>Oracle9i 2.0.4在Red Hat Enterprise Linux AS 3上的安装</P><P>(我测试了两遍都OK)</P><P>1、确认安装了以下软件包<BR>&nbsp;&nbsp; [oracle@Gledeson oracle]$ rpm -qa | grep openmotif<BR>&nbsp;&nbsp; openmotif21-2.1.30-8<BR>&nbsp;&nbsp; openmotif-devel-2.2.3-3.RHEL3<BR>&nbsp;&nbsp; openmotif-2.2.3-3.RHEL3<BR>&nbsp;&nbsp; [oracle@Gledeson oracle]$ rpm -qa |grep setarch<BR>&nbsp;&nbsp; setarch-1.3-1<BR>&nbsp;&nbsp; [oracle@Gledeson oracle]$ rpm -qa|grep compat<BR>&nbsp;&nbsp; compat-gcc-c++-7.3-2.96.128<BR>&nbsp;&nbsp; compat-glibc-7.x-2.2.4.32.6<BR>&nbsp;&nbsp; compat-slang-1.4.5-5<BR>&nbsp;&nbsp; compat-pwdb-0.62-3<BR>&nbsp;&nbsp; compat-libstdc++-devel-7.3-2.96.128<BR>&nbsp;&nbsp; compat-db-4.0.14-5<BR>&nbsp;&nbsp; compat-gcc-7.3-2.96.128<BR>&nbsp;&nbsp; compat-libstdc++-7.3-2.96.128<BR></P><P><P>2、建立Oracle帐号<BR>&nbsp;&nbsp; groupadd dba<BR>&nbsp;&nbsp; groupadd oinstall<BR>&nbsp;&nbsp; useradd -c "Oracle software owner" -g oinstall -G dba oracle<BR>&nbsp;&nbsp; passwd oracle</P><P>3、建立文件目录<BR>&nbsp;&nbsp; su root<BR>&nbsp;&nbsp; mkdir /u01<BR>&nbsp;&nbsp; mkdir /u01/oracle<BR>&nbsp;&nbsp; mkdir /u01/oracle/product<BR>&nbsp;&nbsp; mkdir /u01/oracle/product/9.2.0<BR>&nbsp;&nbsp; chown -R oracle.oinstall /u01/oracle<BR>&nbsp;&nbsp; mkdir /var/opt/oracle<BR>&nbsp;&nbsp; chown oracle.dba /var/opt/oracle<BR>&nbsp;&nbsp; chmod 755 /var/opt/oracle</P><P>4、设置环境变量<BR>&nbsp;&nbsp; 用Oracle帐号执行下列命令：(或直接copy到.bash_profile文件中)<BR>&nbsp;# Set the LD_ASSUME_KERNEL environment variable only for Red Hat 9, <BR>&nbsp;# RHEL AS 3, and RHEL AS 4 !!<BR>&nbsp;# Use the "Linuxthreads with floating stacks" implementation instead of NPTL:<BR>&nbsp;#export LD_ASSUME_KERNEL=2.4.1&nbsp;&nbsp;&nbsp; # for RH 9 and RHEL AS 3<BR>&nbsp;#export LD_ASSUME_KERNEL=2.4.19&nbsp;&nbsp; # for RHEL AS 4<BR>&nbsp;export LD_ASSUME_KERNEL=2.4.1<BR>&nbsp;export ORACLE_BASE=/u01/oracle<BR>&nbsp;export ORACLE_HOME=$ORACLE_BASE/product/9.2.0<BR>&nbsp;export ORACLE_SID=ORADB01<BR>&nbsp;export ORACLE_TERM=xterm<BR>&nbsp;export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data<BR>&nbsp;LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib<BR>&nbsp;LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib<BR>&nbsp;export LD_LIBRARY_PATH<BR>&nbsp;# Set shell search paths<BR>&nbsp;export PATH=$PATH:$ORACLE_HOME/bin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保存后退出. 执行： source .bash_profile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后。退出登录，再次进入，这时候oracle的环境就已经生效了</P><P>5、设置内核参数<BR>su root<BR>&nbsp;&nbsp; 修改 /etc/sysctl.conf 这个文件，加入以下的语句：<BR>kernel.shmmax = 2147483648 <BR>kernel.shmmni = 4096&nbsp; <BR>kernel.shmall = 2097152&nbsp; <BR>kernel.sem = 250 32000 100 128&nbsp; <BR>fs.file-max = 65536&nbsp; <BR>net.ipv4.ip_local_port_range = 1024 65000&nbsp; </P><P>参数说明：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sem&nbsp; 4个参数依次为SEMMSL(每个用户拥有信号量最大数)；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEMMNS(系统信号量最大数)；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEMOPM(每次semopm系统调用操作数)；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEMMNI(系统辛苦量集数最大数).<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shmmax 最大共享内存2GB 物理内存如果小的话可以设置成 536870912.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shmmni&nbsp; 最小共享内存 4096KB.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shmall&nbsp;&nbsp; 所有内存大小.</P><P>6、安装补丁<BR>(ORACLE9i 9204版，只需在运行runInstall前打p3006854_9204_LINUX.zip 补丁即可，<BR>其他补丁不用再打) <BR>&nbsp;&nbsp; 安装补丁前，却换到root用户的控制台，打补丁前执行以下语句：<BR>su root<BR>mv /usr/bin/gcc&nbsp;&nbsp; /usr/bin/gcc323<BR>ln -s /usr/bin/gcc296&nbsp;&nbsp; /usr/bin/gcc<BR>mv /usr/bin/g++296&nbsp;&nbsp; /usr/bin/g++<BR>ln -s /usr/bin/g++ /usr/bin/g++296</P><P>[root@localhost /]# sh rhel3_pre_install.sh<BR>Applying patch...<BR>Ensuring permissions are correctly set...<BR>Done.<BR>Patch successfully applied</P><P>7、解压文件<BR>&nbsp; zcat ship_9204_linux_disk1.cpio | cpio -idmv <BR>&nbsp; zcat ship_9204_linux_disk2.cpio | cpio -idmv <BR>&nbsp; zcat ship_9204_linux_disk3.cpio | cpio -idmv <BR>&nbsp; <BR>&nbsp; 这时生成三个目录：Disk1、Disk2、Disk3</P><P>8、cd到Disk1中<BR>&nbsp; cd /Disk1<BR>&nbsp; ./runInstall.sh</P></PRE></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/john_yu/aggbug/30066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2006-02-09 23:22 <a href="http://www.blogjava.net/john_yu/archive/2006/02/09/30066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建从MS SQLServer 采用创建链接服务器以访问 Oracle 数据库实例的步骤 </title><link>http://www.blogjava.net/john_yu/archive/2005/10/12/15339.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Wed, 12 Oct 2005 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2005/10/12/15339.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/15339.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2005/10/12/15339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/15339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/15339.html</trackback:ping><description><![CDATA[<OL>
<LI>确保运行 SQL Server 的服务器上的 <FONT style="BACKGROUND-COLOR: #ffffff">Oracle</FONT> 客户端软件已达到提供程序所要求的级别。用于<FONT style="BACKGROUND-COLOR: #ffffff"> Oracle 的 Microsoft OLE DB 提供程序要求 Oracle 客户端软件支持文件的版本为 7.3.3.4.0 或更高版本，并且 SQL*Net 的版本为 2.3.3.0.4。<BR><BR></FONT>
<LI><FONT style="BACKGROUND-COLOR: #ffffff">在运行 SQL Server 的服务器上创建指向 Oracle 数据库实例的 SQL*Net 别名。有关更多信息，请参见 Oracle 文档。<BR><BR></FONT>
<LI><FONT style="BACKGROUND-COLOR: #ffffff">执行 <B>sp_addlinkedserver</B> 创建链接服务器，指定 <B>MSDAORA</B> 为 <I>provider_name</I>，指定用于 Oracle 数据库实例的 SQL*Net 别名为 <I>data_ source</I>。 </FONT>
<P class=tl><FONT style="BACKGROUND-COLOR: #ffffff">以下示例假设已将一个 SQL*Net 别名定义为 <B>OracleDB</B>。</FONT></P><PRE><FONT style="BACKGROUND-COLOR: #ffffff">sp_addlinkedserver 'OrclDB', 'Oracle', 'MSDAORA', 'OracleDB'
</FONT></PRE>
<LI><FONT style="BACKGROUND-COLOR: #ffffff">使用 <B>sp_addlinkedsrvlogin</B> 创建从 SQL Server 登录到 Oracle 登录的登录映射。 </FONT>
<P class=tl><FONT style="BACKGROUND-COLOR: #ffffff">以下示例通过 Oracle 登录名 OrclUsr 和密码 OrclPwd 将 SQL Server 登录 <B>Joe </B>映射到步骤 3 中定义的链接服务器：</FONT></P><PRE><FONT style="BACKGROUND-COLOR: #ffffff">sp_addlinkedsrvlogin 'OrclDB', false, 'Joe', 'OrclUsr', 'OrclPwd'</FONT>
</PRE>
<LI><PRE><P><FONT style="BACKGROUND-COLOR: #ffffff">每个 Oracle 数据库实例仅有一个名称为空的目录。Oracle 链接服务器中的表必须使用四部分名称格式 <I>OracleLinkedServerName..OwnerUserName.TableName</I> 进行引用。例如，以下 SELECT 语句引用 Oracle 用户 <B>MARY </B>在 OrclDB 链接服务器映射的服务器上所拥有的表 SALES。</FONT></P><PRE><FONT style="BACKGROUND-COLOR: #ffffff">SELECT *
FROM OrclDB..MARY.SALES</FONT></PRE></PRE>
<LI><PRE><PRE>注意需要 修改 注册表 ：对于win2k/oracle 8i ,修改的内容为：</PRE></PRE>
<LI><PRE><PRE>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI]<BR>"OracleXaLib"="oraclient8.dll"<BR>"OracleSqlLib"="orasql8.dll"<BR>"OracleOciLib"="oci.dll"</PRE></PRE>
<LI><PRE><PRE>其它事项：启动mstdc服务</PRE></PRE></LI></OL><PRE><PRE>&nbsp;</PRE></PRE>
<!-- Search Google -->
<center>
<form method="get" action="http://www.google.com/custom" target="google_window">
<table bgcolor="#cccccc">
<tr><td nowrap="nowrap" valign="top" align="left" height="32">
<a href="http://www.google.com/">
<img src="http://www.google.com/logos/Logo_25gry.gif" border="0" alt="Google" align="middle"></img></a>
<input type="text" name="q" size="31" maxlength="255" value=""></input>
<input type="submit" name="sa" value="搜索"></input>
<input type="hidden" name="client" value="pub-7732967276450787"></input>
<input type="hidden" name="forid" value="1"></input>
<input type="hidden" name="channel" value="2967664569"></input>
<input type="hidden" name="ie" value="GB2312"></input>
<input type="hidden" name="oe" value="GB2312"></input>
<input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1;"></input>
<input type="hidden" name="hl" value="zh-CN"></input>
</td></tr></table>
</form>
</center>
<!-- Search Google --><img src ="http://www.blogjava.net/john_yu/aggbug/15339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2005-10-12 16:36 <a href="http://www.blogjava.net/john_yu/archive/2005/10/12/15339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 强行修改服务端字符集</title><link>http://www.blogjava.net/john_yu/archive/2005/10/06/14900.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Thu, 06 Oct 2005 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2005/10/06/14900.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/14900.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2005/10/06/14900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/14900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/14900.html</trackback:ping><description><![CDATA[<P><FONT style="BACKGROUND-COLOR: #ffffff"></FONT>说明：<BR>建议在刚安装完的时候进行修改，对已经投产的系统，风险太大！<BR></P>
<P><FONT size=2>步骤如下： <BR></FONT><FONT size=3>1. Make sure the parallel_server parameter in INIT.ORA is set to false <BR>or it is not set at all. </FONT></P>
<P>2. Execute the following commands in Server Manager (svrmgrl): </P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>SVRMGR&gt; SHUTDOWN IMMEDIATE; -- or NORMAL </FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000><DO backup database full a></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>SVRMGR&gt; STARTUP MOUNT; <BR>SVRMGR&gt; ALTER SYSTEM ENABLE RESTRICTED SESSION; <BR>SVRMGR&gt; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; <BR>SVRMGR&gt; ALTER SYSTEM SET AQ_TM_PROCESSES=0; <BR>SVRMGR&gt; ALTER DATABASE OPEN; <BR>SVRMGR&gt; ALTER DATABASE [NATIONAL] CHARACTER SET INTERNAL_USE <NEW_CHARACTER_SET>; <BR>SVRMGR&gt; SHUTDOWN IMMEDIATE; -- OR NORMAL <BR>SVRMGR&gt; STARTUP RESTRICT; </FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>3. Restore the parallel_server parameter in INIT.ORA, if necessary. </FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>4. Execute the following commands in Server Manager: </FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>SVRMGR&gt; SHUTDOWN IMMEDIATE; -- OR NORMAL <BR>SVRMGR&gt; STARTUP; </FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>如果没有登陆，首先执行 <BR>SVRMGR&gt; connect internal;<BR><BR></FONT></P>
<script type="text/javascript"><!--
google_ad_client = "pub-7732967276450787";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel ="7171629881";
google_color_border = "CC99CC";
google_color_bg = "E7C6E8";
google_color_link = "000000";
google_color_url = "00008B";
google_color_text = "663366";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>


<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</SCRIPT>
<!-- Search Google -->
<CENTER>
<FORM action=http://www.google.com/custom method=get target=google_window>
<TABLE bgColor=#cccccc>
<TBODY>
<TR>
<TD vAlign=top noWrap align=left height=32><A href="http://www.google.com/"><IMG alt=Google src="http://www.google.com/logos/Logo_25gry.gif" align=middle border=0></IMG></A> <INPUT maxLength=255 size=31 name=q></INPUT> <INPUT type=submit value=搜索 name=sa></INPUT> <INPUT type=hidden value=pub-7732967276450787 name=client></INPUT> <INPUT type=hidden value=1 name=forid></INPUT> <INPUT type=hidden value=2967664569 name=channel></INPUT> <INPUT type=hidden value=GB2312 name=ie></INPUT> <INPUT type=hidden value=GB2312 name=oe></INPUT> <INPUT type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1; name=cof></INPUT> <INPUT type=hidden value=zh-CN name=hl></INPUT> </TD></TR></TBODY></TABLE></FORM></CENTER><!-- Search Google --><img src ="http://www.blogjava.net/john_yu/aggbug/14900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2005-10-06 22:43 <a href="http://www.blogjava.net/john_yu/archive/2005/10/06/14900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows 下彻底删除oracle </title><link>http://www.blogjava.net/john_yu/archive/2005/10/06/14895.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Thu, 06 Oct 2005 12:07:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2005/10/06/14895.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/14895.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2005/10/06/14895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/14895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/14895.html</trackback:ping><description><![CDATA[<P><FONT size=2><FONT face=Verdana><FONT color=#0000ff>软件环境：</FONT>&nbsp;<BR></FONT><FONT face=Verdana><FONT color=#000080><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;&nbsp;&nbsp; 1、Windows 2000+ORACLE<BR>&nbsp;&nbsp;&nbsp; 2、ORACLE安装路径为：C:\ORACLE</FONT><BR></FONT><FONT color=#0000ff>实现方法：</FONT> <BR></FONT><FONT face=Verdana color=#000080>&nbsp;&nbsp;&nbsp; 1、 开始－＞设置－＞控制面板－＞管理工具－＞服务停止所有Oracle服务。<BR>&nbsp;&nbsp;&nbsp; 2、 开始－＞程序－＞Oracle - OraHome81－＞Oracle Installation Products－＞Universal Installer卸装所有Oracle产品，但Universal Installer本身不能被删除<BR>&nbsp;&nbsp;&nbsp; 5、 运行regedit，选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE，按del键删除这个入口。<BR>&nbsp;&nbsp;&nbsp; 6、 运行regedit，选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，滚动这个列表，删除所有Oracle入口。<BR>&nbsp;&nbsp;&nbsp; 7、 运行refedit，HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application，<BR>删除所有Oracle入口。<BR>&nbsp;&nbsp;&nbsp; 8、 开始－＞设置－＞控制面板－＞系统－＞高级－＞环境变量删除环境变量CLASSPATH和PATH中有关Oracle的设定<BR>&nbsp;&nbsp;&nbsp; 9、 从桌面上、STARTUP（启动）组、程序菜单中，删除所有有关Oracle的组和图标<BR>&nbsp;&nbsp;&nbsp; 10、 删除\Program Files\Oracle目录<BR>&nbsp;&nbsp;&nbsp; 11、 重新启动计算机，重起后才能完全删除Oracle所在目录<BR>&nbsp;&nbsp;&nbsp; 12、 删除与Oracle有关的文件，选择Oracle所在的缺省目录C:\Oracle，删除这个入口目录及所有子目录，并从C:\WINNT下删除以下文件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等。<BR>&nbsp;&nbsp;&nbsp; 13、 WIN.INI文件中若有[ORACLE]的标记段，删除该段<BR>&nbsp;&nbsp;&nbsp; 14、 如有必要，删除所有Oracle相关的ODBC的DSN<BR>&nbsp;&nbsp;&nbsp; 15、 到事件查看器中，删除Oracle相关的日志<BR><BR></FONT><FONT face=Verdana><FONT color=#0000ff>说明：<BR></FONT><FONT color=#808080>&nbsp;&nbsp;&nbsp; 如果有个别DLL文件无法删除的情况，则不用理会，重新启动，开始新的安装，安装时，选择一个新的目录，则，安装完毕并重新启动后，老的目录及文件就可以删除掉了。</FONT></FONT></FONT></P>

<script type="text/javascript"><!--
google_ad_client = "pub-7732967276450787";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel ="7171629881";
google_color_border = "CC99CC";
google_color_bg = "E7C6E8";
google_color_link = "000000";
google_color_url = "00008B";
google_color_text = "663366";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

<!-- Search Google -->
<CENTER>
<FORM action=http://www.google.com/custom method=get target=google_window>
<TABLE bgColor=#cccccc>
<TBODY>
<TR>
<TD vAlign=top noWrap align=left height=32><A href="http://www.google.com/"><IMG alt=Google src="http://www.google.com/logos/Logo_25gry.gif" align=middle border=0></IMG></A> <INPUT maxLength=255 size=31 name=q></INPUT> <INPUT type=submit value=搜索 name=sa></INPUT> <INPUT type=hidden value=pub-7732967276450787 name=client></INPUT> <INPUT type=hidden value=1 name=forid></INPUT> <INPUT type=hidden value=2967664569 name=channel></INPUT> <INPUT type=hidden value=GB2312 name=ie></INPUT> <INPUT type=hidden value=GB2312 name=oe></INPUT> <INPUT type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1; name=cof></INPUT> <INPUT type=hidden value=zh-CN name=hl></INPUT> </TD></TR></TBODY></TABLE></FORM></CENTER><!-- Search Google --><img src ="http://www.blogjava.net/john_yu/aggbug/14895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2005-10-06 20:07 <a href="http://www.blogjava.net/john_yu/archive/2005/10/06/14895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pro*c and vc++ error :C2079: 'SQLSTM" uses undefined struct 'SQLEXD'</title><link>http://www.blogjava.net/john_yu/archive/2005/09/24/13949.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Sat, 24 Sep 2005 12:28:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2005/09/24/13949.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/13949.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2005/09/24/13949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/13949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/13949.html</trackback:ping><description><![CDATA[pro*c and vc++ error<BR><BR><BR>From the oracle metalink -<BR><BR>Problem Description<BR>-------------------<BR><BR>You are trying to compile a precompiled Pro*C application.<BR>You are using Microsoft Visual C++ 6.0.&nbsp; At compile time,<BR>you get the error message:<BR><BR>C2079: 'SQLSTM" uses undefined struct 'SQLEXD'<BR><BR><BR>Solution Description<BR>--------------------<BR><BR>In Visual C++, under Project -&gt; Settings -&gt; Precompiled Headers,<BR>set this to "Automatic Use of Precompiled Headers", with the "Through<BR>Header"<BR>option left blank.<BR><BR>HTH.,<BR>Ora600<BR><BR><BR>"Glen" <GLEN@WIJOJO.COM.AU>wrote in message<BR>news:69867261.0110312021.3ba2f3ee@posting.google.com...<BR>&gt; Hi,<BR>&gt;<BR>&gt; I have precompiled some pro*c code which worked fine and outputted a<BR>&gt; c++ file which is included in my project. I have included the<BR>&gt; orasql8.lib and when I try to compile the project receive the<BR>&gt; following error:<BR>&gt;<BR>&gt; error C2079: 'sqlstm' uses undefined struct 'sqlexd'<BR>&gt;<BR>&gt; I don't understand why, the following code appears before where the<BR>&gt; error is encountered.<BR>&gt;<BR>&gt; static struct sqlexd {<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; sqlvsn;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; arrsiz;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; iters;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; offset;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned short selerr;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned short sqlety;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; occurs;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const short *cud;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned char&nbsp; *sqlest;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char&nbsp; *stmt;<BR>&gt;&nbsp;&nbsp;&nbsp; sqladts *sqladtp;<BR>&gt;&nbsp;&nbsp;&nbsp; sqltdss *sqltdsp;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void&nbsp; **sqphsv;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; *sqphsl;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; *sqphss;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void&nbsp; **sqpind;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; *sqpins;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; *sqparm;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; **sqparc;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned short&nbsp; *sqpadto;<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned short&nbsp; *sqptdso;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void&nbsp; *sqhstv[4];<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; sqhstl[4];<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; sqhsts[4];<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void&nbsp; *sqindv[4];<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; sqinds[4];<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; sqharm[4];<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; *sqharc[4];<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned short&nbsp; sqadto[4];<BR>&gt;&nbsp;&nbsp;&nbsp; unsigned short&nbsp; sqtdso[4];<BR>&gt; } sqlstm = {10,4};<BR>&gt;<BR>&gt; If anyone has any ideas i would be most appreciative.<BR>&gt;<BR>&gt; Cheers<BR>&gt; Glen<BR>
<script type="text/javascript"><!--
google_ad_client = "pub-7732967276450787";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel ="7171629881";
google_color_border = "CC99CC";
google_color_bg = "E7C6E8";
google_color_link = "000000";
google_color_url = "00008B";
google_color_text = "663366";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>


<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</SCRIPT>
<!-- Search Google -->
<CENTER>
<FORM action=http://www.google.com/custom method=get target=google_window>
<TABLE bgColor=#cccccc>
<TBODY>
<TR>
<TD vAlign=top noWrap align=left height=32><A href="http://www.google.com/"><IMG alt=Google src="http://www.google.com/logos/Logo_25gry.gif" align=middle border=0></IMG></A> <INPUT maxLength=255 size=31 name=q></INPUT> <INPUT type=submit value=搜索 name=sa></INPUT> <INPUT type=hidden value=pub-7732967276450787 name=client></INPUT> <INPUT type=hidden value=1 name=forid></INPUT> <INPUT type=hidden value=2967664569 name=channel></INPUT> <INPUT type=hidden value=GB2312 name=ie></INPUT> <INPUT type=hidden value=GB2312 name=oe></INPUT> <INPUT type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1; name=cof></INPUT> <INPUT type=hidden value=zh-CN name=hl></INPUT> </TD></TR></TBODY></TABLE></FORM></CENTER><!-- Search Google --><img src ="http://www.blogjava.net/john_yu/aggbug/13949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2005-09-24 20:28 <a href="http://www.blogjava.net/john_yu/archive/2005/09/24/13949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VC开发基于ORACLE数据库方法</title><link>http://www.blogjava.net/john_yu/archive/2005/09/23/13824.html</link><dc:creator>john</dc:creator><author>john</author><pubDate>Fri, 23 Sep 2005 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/john_yu/archive/2005/09/23/13824.html</guid><wfw:comment>http://www.blogjava.net/john_yu/comments/13824.html</wfw:comment><comments>http://www.blogjava.net/john_yu/archive/2005/09/23/13824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/john_yu/comments/commentRss/13824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/john_yu/services/trackbacks/13824.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="BORDER-BOTTOM: #0080ff 1px dashed" align=middle height=50><STRONG class=f16>用VC开发基于ORACLE数据库方法</STRONG></TD></TR>
<TR>
<TD align=middle height=40>作者：黎杰 麦中凡 更新时间： 2005-05-07 </TD>
<TD style="BORDER-RIGHT: #0080ff 1px solid" vAlign=top rowSpan=6>&nbsp; </TD></TR>
<TR>
<TD height=40>&nbsp;</TD></TR>
<TR>
<TD>
<TABLE class=pagefont cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="PADDING-TOP: 5px">1. 引言 <BR>　　 ORACLE 公司自1979 年推出基于SQL 标准的关系数据库产品到1997 年版本8 的推出，ORACLE 数据库以其支持大数据库、多用户的高性能事务处理，对业界各项工业标准的支持，完整的安全和完整性控制，支持分布式数据库和分布处理，具有可移植性、可兼容性和可连接性等突出优点倍受用户喜爱，根据IDG1992 年全球UNIX 数据库的市场报告，ORACLE 占市场销售量的50%。而在客户端的开发工具方面，Visual C++ 也因其强大的功能和高度的灵活性等特点深受广大程序员的喜爱，因此本文旨在介绍使用Visual C++ 开发基于ORACLE 数据库应用程序的两种方法。 <BR><BR>　　 2. 使用PRO*C 开发数据库应用 <BR><BR>　　 2.1 PRO*C 工作原理 <BR><BR>　　 PRO 系列是ORACLE 公司提供的在第三代高级程序设计语言中嵌入SQL 语句来访问数据库的一套预编译程序，包括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和PRO*PL/I 六种。程序员用相应的高级语言编写嵌入SQL 语句的PRO 源程序（若用C 语言则称为PRO*C 源程序）后运行相应的预编译程序，把嵌入的SQL 语句转换为标准的ORACLE 调用并生成目标源程序，即纯高级语言格式的源程序，然后就可以将这些源程序加入用户的程序中调用，其处理过程如下图。 <BR><BR>　　 ORACLE 预编译程序提供如下功能： <BR><BR>　　 ⑴能用六种通用的高级程序设计语言中的任何一种编写应用程序。 <BR><BR>　　 ⑵遵循ANSI 标准，在高级语言中嵌入SQL 语句。 <BR><BR>　　 ⑶可采用动态SQL 方法，让程序在运行时接受或构造一个有效的SQL 语句。 <BR><BR>　　 ⑷实现ORACLE 内部数据类型和高级语言数据类型之间的自动转换。 <BR><BR>　　 ⑸可通过在应用程序中嵌入PL/SQL 事物处理块来改进性能。 <BR><BR>　　 ⑹能在程序行和命令行上指定所需要的预编译可选项，并可在预编译的过程中改变它们的值。 <BR><BR>　　 ⑺能全面检查嵌入的SQL 数据操纵语句和PL/SQL 块的文法和语义。 <BR><BR>　　 ⑻可用SQL*Net 并行存取多个地点的ORACLE 数据库。 <BR><BR>　　 ⑼可把数组作为输入和输出程序变量使用。 <BR><BR>　　 ⑽能对应用程序中的代码段进行条件预编译。 <BR><BR>　　 ⑾提供了较强的异常处理功能。 <BR><BR>　　 由此可见，通过预编译程序与其它高级语言的结合，既可以利用SQL 强有力的功能和灵活性为数据库应用系统的开发提供强有力的手段，又可以充分利用高级语言自身在系统开发方面的优势，从而提供一个完备的基于ORACLE 数据库应用程序的开发解决方案。 <BR><BR>2.2 在VC 中使用PRO*C <BR><BR>　　 每个PRO*C 源文件一般由程序头和程序体两部分组成。程序头包含宿主变量（SQL 语句中所包含的变量）说明、通讯区定义和C 外部表示符的说明等。程序体一般是由若干函数组成，这些函数内含有SQL 语句（以EXEC SQL 起头的语句）。 <BR><BR>　　 PRO*C 支持的数据类型包括VARCHAR2( 变长字符串)、NUMBER( 二进制数）、INTGER( 有符号整数)、FLOAT( 浮点数)、STRING( 以NULL 结尾的字符串)、VARNUM( 变长二进制数)、LONG( 变长字符串)、VARCHAR( 变长字符串)、ROWID( 二进制值)、DATE( 定长日期/ 时间值)、VARRAW( 变长二进制数据)、RAW( 定长二进制数据) 、LONGRAW( 变长二进制数据)、UNSIGNED( 无符号整数)、LONGVARCHAR( 变长字符串)、LONGVARRAW( 变长二进制数据)、CHAR( 定长字符串)、CHARZ(C 中定长以NULL 结尾的字符串)、MLSLABEL( 变长二进制数据)。 <BR><BR>　　 在PRO*C 中不能使用'l' 或'u' 作词尾或'0x' 作词头修饰常量；在SQL 语句中使用单引号来定义字符串，用双引号来定义特殊的或小写字符的标识符( 如表名等)；SQL 语句中不允许使用C 中的寻址、间接、位逻辑、复合赋值、?=、-、++、%、&lt;&lt;、&gt;&gt; 操作符并且用NOT、AND、OR、= 代替!、&amp;&amp;、||、==。 <BR><BR>　　 下面的程序是一个联结数据库的PRO*C 源程序例子。 <BR><BR>#include &lt; sqlca.h &gt; //声明SQL通讯区 <BR>#include &lt; string.h &gt; <BR>#include &lt; afxwin.h &gt; <BR>EXEC SQL BEGIN DECLARE SECTION; <BR>VARCHAR username[20]; //声明宿主变量 <BR>VARCHAR password[20]; <BR>VARCHAR dbname[20]; <BR>EXEC SQL END DECLARE SECTION; <BR>void db_connect() <BR>{ <BR>strcpy((char *)username.arr,"SCOTT"); <BR>username.len = strlen((char *)username.arr); <BR>strcpy((char *)password.arr,"TIGER"); <BR>password.len = strlen((char *)password.arr); <BR>strcpy((char *)dbname.arr,"SUNDB"); <BR>dbname.len = strlen((char *)dbname.arr); <BR>EXEC SQL WHENEVER SQLERROR STOP; //隐式异常处理 <BR>EXEC SQL CONNECT :username <BR>IDENTIFIED BY :password USING :dbname; <BR>/*if (sqlca.sqlcode != 0) //显式异常处理 <BR>{ <BR>AfxMessageBox("\n与Oracle数据库连接失败!"); <BR>return; <BR>}*/ <BR>} <BR><BR>　　 在VC 中使用PRO*C 时，先用PRO*C 编写所需的操作数据库的子程序，再运行PRO*C 预编译程序把PRO*C 源程序转成相应的CPP 源程序，将该程序插入到用户工程文件中并在需要对插入函数进行调用的模块中说明函数，然后就可以在此模块中调用所需的函数。 <BR><BR>　　 3. 使用ODBC 中间件访问数据库 <BR><BR>　　 3.1 ODBC 工作原理 <BR><BR>　　 DBC 是Open Database Connect 即开放数据库互连的简称，它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准，是应用程序和数据库系统之间的中间件。它通过使用相应应用平台上和所需数据库对应的驱动程序与应用程序的交互来实现对数据库的操作，避免了在应用程序中直接调用与数据库相关的操作，从而提供了数据库的独立性。 <BR><BR>　　 ODBC 主要由驱动程序和驱动程序管理器组成。驱动程序是一个用以支持ODBC 函数调用的模块（在WIN95 下通常是一个DLL），每个驱动程序对应于相应的数据库，当应用程序从基于一个数据库系统移植到另一个时，只需更改应用程序中由ODBC 管理程序设定的与相应数据库系统对应的别名即可。驱动程序管理器（包含在ODBC32.DLL 中）可链接到所有ODBC 应用程序中，它负责管理应用程序中ODBC 函数与DLL 中函数的绑定。 <BR><BR>　　 ODBC 使用层次的方法来管理数据库，在数据库通信结构的每一层，对可能出现依赖数据库产品自身特性的地方，ODBC 都引入一个公共接口以解决潜在的不一致性，从而很好地解决了基于数据库系统应用程序的相对独立性，这也是ODBC 一经推出就获得巨大成功的重要原因之一。 <BR><BR>　　 从结构上分，ODBC 分为单束式和多束式两类。 <BR><BR>　　 ⑴单束式驱动程序 <BR><BR>　　 单束式驱动程序介于应用程序和数据库之间，像中介驱动程序一样数据提供一个统一的数据访问方式。 <BR><BR>　　 当用户进行数据库操作时，应用程序传递一个ODBC 函数调用给ODBC 驱动程序管理器，由ODBC API 判断该调用是由它直接处理并将结果返回还是送交驱动程序执行并将结果返回。 <BR><BR>　　 由上可见，单束式驱动程序本身是一个数据库引擎，由它直接可完成对数据库的操作，尽管该数据库可能位于网络的任何地方。 <BR><BR>　　 ⑵多束式驱动程序 <BR><BR>　　 多束式驱动程序负责在数据库引擎和客户应用程序之间传送命令和数据，它本身并不执行数据处理操作而用于远程操作的网络通信协议的一个界面。 <BR><BR>　　 前端应用程序提出对数据库处理的请求，该请求转给ODBC 驱动程序管理器，驱动程序管理器依据请求的情况，就地完成或传给多束驱动程序，多束式驱动程序将请求翻译为特定厂家的数据库通信接口（如Oracle 的SQLNet）所能理解的形式并交于接口去处理，接口把请求经网络传送给服务器上的数据引擎，服务器处理完后把结果发回给数据库通信接口，数据库接口将结果传给多束式ODBC 驱动程序，再由驱动程序将结果传给应用程序。 <BR><BR>　　 3.2 在VC 中使用ODBC <BR><BR>　　 Visual C++ 中提供了CDatabase、CRecordset、CRecordView、CDBException 和CFieldExchange 五个类，这些类封装了ODBC SDK 函数，从而使用户可以无需了解SDK 函数就可以很方便地操作支持ODBC 的数据库。 <BR><BR>　　 CDatabase 类：封装了与数据库建立连接，控制事务的提交和回滚及执行SQL 语句的方法。 <BR><BR>　　 CRecordset 类：封装了大部分操纵数据库的方法，包括浏览、修改记录，控制游标移动，排序等操作。 <BR><BR>　　 CRecordView 类：提供了与recordset 对象相连接的视，可以建立视中的控件与数据库数据的对应，同时支持移动游标，修改记录等操作。 <BR><BR>　　 CDBException 类：提供了对数据库操作的异常处理，可以获得操作异常的相关返回代码。 <BR><BR>　　 CFieldExchange 类：提供了用户变量与数据库字段之间的数据交换，如果不需要使用自定义类型，你将不用直接调用该类的函数，MFC Wizard 将自动为程序员建立连接。 <BR><BR>　　 4. 两种方法的比较 <BR><BR>　　 综上所述，使用这两种方法在Visual C++ 中都可以很方便地开发出基于ORACLE 数据库的应用程序，同时，这两种方法又各有其优缺点。ODBC 由于有MFC 强大的类库支持而使得编程实现非常方便，同时可移植性也很强，在异构的数据库之间移植也只需更改很少的一部分程序，但是，由ODBC 的实现机制我们可以看到，与PRO*C 相比，应用程序需要经过ODBC 驱动程序管理器和ODBC 驱动程序两层才能和数据库通信接口建立联系，而PRO*C 是直接与通信接口联系，因此建立在ODBC 上应用程序的执行效率会相对低一些。PRO*C 具有执行效率高，支持嵌入式PL/SQL 块等ORACLE 自身特有的优点，但正因为有了这些优点，使得用PRO*C 开发出的应用程序无法向异构数据库平台移植。</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<script type="text/javascript"><!--
google_ad_client = "pub-7732967276450787";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel ="7171629881";
google_color_border = "CC99CC";
google_color_bg = "E7C6E8";
google_color_link = "000000";
google_color_url = "00008B";
google_color_text = "663366";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</SCRIPT>
<!-- Search Google -->
<CENTER>
<FORM action=http://www.google.com/custom method=get target=google_window>
<TABLE bgColor=#cccccc>
<TBODY>
<TR>
<TD vAlign=top noWrap align=left height=32><A href="http://www.google.com/"><IMG alt=Google src="http://www.google.com/logos/Logo_25gry.gif" align=middle border=0></IMG></A> <INPUT maxLength=255 size=31 name=q></INPUT> <INPUT type=submit value=搜索 name=sa></INPUT> <INPUT type=hidden value=pub-7732967276450787 name=client></INPUT> <INPUT type=hidden value=1 name=forid></INPUT> <INPUT type=hidden value=2967664569 name=channel></INPUT> <INPUT type=hidden value=GB2312 name=ie></INPUT> <INPUT type=hidden value=GB2312 name=oe></INPUT> <INPUT type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1; name=cof></INPUT> <INPUT type=hidden value=zh-CN name=hl></INPUT> </TD></TR></TBODY></TABLE></FORM></CENTER><!-- Search Google --><img src ="http://www.blogjava.net/john_yu/aggbug/13824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/john_yu/" target="_blank">john</a> 2005-09-23 11:41 <a href="http://www.blogjava.net/john_yu/archive/2005/09/23/13824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>