﻿<?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-初一七月-随笔分类-DB</title><link>http://www.blogjava.net/caojianhua/category/47353.html</link><description>你必须承认，我们生存的这个世界取决于自身的能力而非别人的保护(AW)</description><language>zh-cn</language><lastBuildDate>Fri, 13 Jul 2012 17:51:29 GMT</lastBuildDate><pubDate>Fri, 13 Jul 2012 17:51:29 GMT</pubDate><ttl>60</ttl><item><title>oracle分页查找时，start与size在ibatis中的设置</title><link>http://www.blogjava.net/caojianhua/archive/2012/07/13/383018.html</link><dc:creator>初一七月</dc:creator><author>初一七月</author><pubDate>Fri, 13 Jul 2012 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/caojianhua/archive/2012/07/13/383018.html</guid><wfw:comment>http://www.blogjava.net/caojianhua/comments/383018.html</wfw:comment><comments>http://www.blogjava.net/caojianhua/archive/2012/07/13/383018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caojianhua/comments/commentRss/383018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caojianhua/services/trackbacks/383018.html</trackback:ping><description><![CDATA[使用oracle + ibatis进行数据分页查找时，对传入的参数start与size，进行如下查找语句<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span><br />&nbsp;&nbsp;(<span style="color: #0000FF; ">select</span>&nbsp;t.<span style="color: #808080; ">*</span>,&nbsp;romnum&nbsp;rn&nbsp;<span style="color: #0000FF; ">from</span><br />&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;<span style="color: #FF00FF; ">user</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;score&nbsp;<span style="color: #808080; ">&gt;</span>&nbsp;#score#&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">order</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;$orderby$<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;t&nbsp;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;rownum&nbsp;<span style="color: #808080; ">&lt;=</span>&nbsp;#start#&nbsp;<span style="color: #808080; ">+</span>&nbsp;#<font color="#0000ff">size</font>#&nbsp;)<br /><span style="color: #0000FF; ">where</span>&nbsp;rn&nbsp;<span style="color: #808080; ">&gt;</span>&nbsp;#start#</div>在数据量较少时，以上语句没有问题，但是在达到500w+数据量时，就会发生急剧的性能下降，经过测试，发现应该改为以下的语句，就可以避免，在千万数据以上仍可以在百毫秒得出结果<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span><br />&nbsp;&nbsp;(<span style="color: #0000FF; ">select</span>&nbsp;t.<span style="color: #808080; ">*</span>,&nbsp;romnum&nbsp;rn&nbsp;<span style="color: #0000FF; ">from</span><br />&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;<span style="color: #FF00FF; ">user</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;score&nbsp;<span style="color: #808080; ">&gt;</span>&nbsp;#score#&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">order</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;$orderby$<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;t&nbsp;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;rownum&nbsp;<span style="color: #808080; ">&lt;=</span>&nbsp;$start$&nbsp;<span style="color: #808080; ">+</span>&nbsp;$<span style="color: #0000FF; ">end</span>$&nbsp;)<br /><span style="color: #0000FF; ">where</span>&nbsp;rn&nbsp;<span style="color: #808080; ">&gt;</span>&nbsp;#start#</div><br />因为ibatis会将#xxx#参数解析为PreparedStatement中的？，但是如果使用#start#+#size#，会产生?+?的语句，影响oracle语句动态解析，实际上这个参数在执行时完全可以先计算和，再作为一个值传入语句，采用$start$+$size$正是做到了这点，大大加快了执行速度<br /><br /><img src ="http://www.blogjava.net/caojianhua/aggbug/383018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caojianhua/" target="_blank">初一七月</a> 2012-07-13 14:41 <a href="http://www.blogjava.net/caojianhua/archive/2012/07/13/383018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据类型之number</title><link>http://www.blogjava.net/caojianhua/archive/2011/01/24/343461.html</link><dc:creator>初一七月</dc:creator><author>初一七月</author><pubDate>Mon, 24 Jan 2011 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/caojianhua/archive/2011/01/24/343461.html</guid><wfw:comment>http://www.blogjava.net/caojianhua/comments/343461.html</wfw:comment><comments>http://www.blogjava.net/caojianhua/archive/2011/01/24/343461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caojianhua/comments/commentRss/343461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caojianhua/services/trackbacks/343461.html</trackback:ping><description><![CDATA[oracle的number类型是oracle的内置类型之一，是oracle的最基础数值数据类型。在9iR2及其以前的版本中只支持一种适合存储数值数据的固有数据类型，在10g以后，才出现了两种新的数值类型，即推出本地浮点数据类型(Native Floating-Point Data Types): BINARY_FLOAT(单精度32位)和BINARY_DOUBLE(双精度64位). 这些新数据类型都是基于IEEE二进制浮点运算标准,ANSI/IEEE Std 754-1985 [IEEE 754]，使用这些类型时要加上文字f(BINARY_FLOAT)或者d(BINARY_DOUBLE)，比如2.07f、3.000094d。
<br />
<br />
<strong>number数据类型</strong><br />
<br />
number类型的语法很简单：number(p,s)：<br />
p：精度位，precision，是总有效数据位数，取值范围是38，默认是38，可以用字符*表示38。<br />
s：小数位，scale，是小数点右边的位数，取值范围是-84~127，默认值取决于p，如果没有指定p，那么s是最大范围，如果指定了p，那么s=0。<br />
p：is the precision,or the total number of digits. Oracle guarantees the portability of numbers with precision ranging from 1 to 38.<br />
s：is the scale, or the number of digits to the right of the decimal point. The scale can range from -84 to 127. <br />
<br />
number类型的p和s，与其底层存储完全没有关系，根本不会影响数据在磁盘上如何存储，它只会影响允许哪些值以及数值如何舍入，你可以认为其是对数据的&#8220;编辑&#8221;。简单的说，精度位p表示数值最多能有多少个有效数字，而小数位s表示最多能有多少位小数。换句话说，p表示一共有多少位有效数字（即小数点左边最多有p-s位有效数字），s表示小数点右边有s位有效数字。如number(5,2)类型的数据，就表示小数点左边最多有3位有效数字，右边最多有2位有效数字，加起来就是最多有5位有效数字，超过这个范围的数字就不能正确的存储下来，注意这里说的是不能正确存储，但并不是不能存储。<br />
<br />
最高整数位数＝p-s <br />
s正数，小数点右边指定位置开始四舍五入 <br />
s负数，小数点左边指定位置开始四舍五入 <br />
s是0或者未指定，四舍五入到最近整数 <br />
当p小于s时候，表示数字是绝对值小于1的数字，且从小数点右边开始的前s-p位必须是0，保留s位小数。 <br />
<br />
p&gt;0，对s分2种情况： <br />
1. s&gt;0 <br />
精确到小数点右边s位，并四舍五入。然后检验有效数位是否&lt;=p；如果s&gt;p，小数点右边至少有s-p个0填充。 <br />
2. s&lt;0 <br />
精确到小数点左边s位，并四舍五入。然后检验有效数位是否&lt;=p+|s| <br />
<br />
具体数据可参考下表<br />
<br />
<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: Tahoma,Verdana,Arial,Helvetica,sans-serif,宋体; font-size: 14px; line-height: 25px; text-align: left;">
<table style="width: 423px; height: 711px;" class="MsoNormalTable" align="center" border="1" cellpadding="0">
    <thead>
        <tr>
            <td style="padding: 0.75pt; background-color: white; width: 148px;" valign="bottom" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><strong><span style="font-size: 10pt; color: maroon; font-family: Arial;" lang="EN-US">Value</span></strong></p>
            </td>
            <td style="padding: 0.75pt; background-color: white; width: 135px;" valign="bottom" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><strong><span style="font-size: 10pt; color: maroon; font-family: Arial;" lang="EN-US">Datatype</span></strong></p>
            </td>
            <td style="padding: 0.75pt; background-color: white; width: 118px;" valign="bottom" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><strong><span style="font-size: 10pt; color: maroon; font-family: Arial;" lang="EN-US">Stored Value</span></strong></p>
            </td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">123.2564</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">123.2564</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1234.9876</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(6,2)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1234.99</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">12345.12345</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(6,2)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Error</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1234.9876</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(6)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1235</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">12345.345</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(5,-2)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">12300</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1234567</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(5,-2)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1234600</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">12345678</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(5,-2)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Error</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">123456789</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(5,-4)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">123460000</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1234567890</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(5,-4)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Error</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">12345.58</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(*, 1)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">12345.6</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">0.1</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(4,5)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Error</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">0.01234567</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(4,5)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">0.01235</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">0.09999</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(4,5)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">0.09999</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm; width: 150px; background-color: transparent;" valign="top" width="24%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">0.099996</span></p>
            </td>
            <td style="padding: 0cm; width: 137px; background-color: transparent;" valign="top" width="22%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">NUMBER(4,5)</span></p>
            </td>
            <td style="padding: 0cm; width: 120px; background-color: transparent;" valign="top" width="19%">
            <p class="table-para" style="margin-top: 5px; margin-bottom: 10px;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Error</span></p>
            </td>
        </tr>
    </tbody>
</table>
</span></span><br />
里面发生错误的行有的是因为源数据超过了可以表示的范围，有的是因为进行小数四舍五入后超过了可以表示的范围。<br />
<br />
以下是一些例子<br />
<br />
1. s&gt;0 <br />
<br />
精确到小数点右边s位，并四舍五入。然后检验有效数位是否&lt;=p； <br />
<br />
ZWF.YUDONG&gt;create table t_n(id number(5,2)); <br />
<br />
Table created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(123.45); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(123.455); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;select * from t_n; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID <br />
---------- <br />
&nbsp;&nbsp;&nbsp; 123.45 <br />
&nbsp;&nbsp;&nbsp; 123.46 <br />
<br />
2 rows selected. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(1.234); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;select * from t_n; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID <br />
---------- <br />
&nbsp;&nbsp;&nbsp; 123.45 <br />
&nbsp;&nbsp;&nbsp; 123.46 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.23 <br />
<br />
3 rows selected. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(.001); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;select * from t_n; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID <br />
---------- <br />
&nbsp;&nbsp;&nbsp; 123.45 <br />
&nbsp;&nbsp;&nbsp; 123.46 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.23 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 <br />
<br />
4 rows selected. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(1234.56); <br />
insert into t_n values(1234.56) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br />
ERROR at line 1: <br />
ORA-01438: value larger than specified precision allowed for this column <br />
<br />
<br />
如果s&gt;p，小数点右边至少有s-p个0填充。 <br />
<br />
ZWF.YUDONG&gt;create table t_n(id number(4,5)); <br />
<br />
Table created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(1); <br />
insert into t_n values(1) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br />
ERROR at line 1: <br />
ORA-01438: value larger than specified precision allowed for this column <br />
<br />
<br />
ZWF.YUDONG&gt;insert into t_n values(.1); <br />
insert into t_n values(.1) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br />
ERROR at line 1: <br />
ORA-01438: value larger than specified precision allowed for this column <br />
<br />
<br />
ZWF.YUDONG&gt;insert into t_n values(.01); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;commit; <br />
<br />
Commit complete. <br />
<br />
ZWF.YUDONG&gt;select * from t_n; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID <br />
---------- <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .01 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(.001); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(.0001); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(.00001); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(.000001);&nbsp;&nbsp; --超过刻度存储0 <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;select * from t_n; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID <br />
---------- <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .01 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .001 <br />
&nbsp;&nbsp;&nbsp;&nbsp; .0001 <br />
&nbsp;&nbsp;&nbsp; .00001 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 <br />
<br />
<br />
10 rows selected. <br />
<br />
ZWF.YUDONG&gt;col dp for a50 <br />
ZWF.YUDONG&gt;select id,dump(id) dp,length(id),vsize(id) from t_n;&nbsp; --vsize和dump的是字节数，length是数值实际位数（含小数点） <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID DP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LENGTH(ID)&nbsp; VSIZE(ID) <br />
---------- -------------------------------------------------- ---------- ---------- <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .01 Typ=2 Len=2: 192,2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .001 Typ=2 Len=2: 191,11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 <br />
&nbsp;&nbsp;&nbsp;&nbsp; .0001 Typ=2 Len=2: 191,2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 <br />
&nbsp;&nbsp;&nbsp; .00001 Typ=2 Len=2: 190,11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 Typ=2 Len=1: 128&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 <br />
<br />
5 rows selected. <br />
<br />
<br />
2. s&lt;0 <br />
<br />
精确到小数点左边s位，并四舍五入。然后检验有效数位是否&lt;=p+|s| <br />
<br />
ZWF.YUDONG&gt;create table t_n(id number(5,-2)); <br />
<br />
Table created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(12345); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;select * from t_n; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID <br />
---------- <br />
&nbsp;&nbsp;&nbsp;&nbsp; 12300 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(123456); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(1234567); <br />
<br />
1 row created. <br />
<br />
ZWF.YUDONG&gt;select * from t_n; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID <br />
---------- <br />
&nbsp;&nbsp;&nbsp;&nbsp; 12300 <br />
&nbsp;&nbsp;&nbsp; 123500 <br />
&nbsp;&nbsp; 1234600 <br />
<br />
3 rows selected. <br />
<br />
ZWF.YUDONG&gt;insert into t_n values(12345678); <br />
insert into t_n values(12345678) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br />
ERROR at line 1: <br />
ORA-01438: value larger than specified precision allowed for this column <br />
<br />
<strong>oracle的number类型存储结构</strong><br />
<br />
oracle采用变长存储number数据类型（按一定规则进行转换成2进制编码格式存储）。 <br />
<br />
oracle数据库中存储的number类型包含3个部分: HEAD部分, DATA部分, 符号位。 <br />
<br />
对正数来说, 符号位省略, 对0来说, oracle存储的是X80（128）。 <br />
<br />
ZWF.YUDONG&gt;select dump(0) from dual; <br />
<br />
DUMP(0) <br />
---------------- <br />
Typ=2 Len=1: 128 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(1) from dual; <br />
<br />
DUMP(1) <br />
------------------ <br />
Typ=2 Len=2: 193,2 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(-1) from dual; <br />
<br />
DUMP(-1) <br />
----------------------- <br />
Typ=2 Len=3: 62,100,102&nbsp;&nbsp; <br />
<br />
1 row selected. <br />
<br />
HEAD部分为一个字节8位, 就是前面看到的128, 193，62。由该部分我们可以看出number类型的基本信息，因为设计这种存储格式的时候, oracle希望以十六进制00-FF来表示所有 <br />
的number, 所以为了编码的对称, 首先将number分为正负, 所以以00-FF的中间位置80, 也就是十进制的128来表示0, HEAD部分小于80,即为负数,大于80即为正数。ORACLE再次对 <br />
00-80, 80-FF进行对分： <br />
<br />
00-3E 表示: number &lt;= -1 <br />
3F-7F 表示: -1 &lt; number &lt; 0 <br />
81-C0 表示: 0 &lt; number &lt; 1 <br />
C1-FF 表示：number &gt;= 1 <br />
<br />
从HEAD部分我们可以也看出数据的位数信息，是否含有小数，可以根据HEAD的信息判断小数点的位置。由于数据部分低位2的n次方位个0是不被存储的，数据展现的时候oracle <br />
根据HEAD的信息给补充末位的0。 <br />
<br />
ZWF.YUDONG&gt;select dump(123456789) from dual; <br />
<br />
DUMP(123456789) <br />
------------------------------ <br />
Typ=2 Len=6: 197,2,24,46,68,90 --197（C5）的含义：表示数字123456789大于1，197-193(数字1占用2个字节该值为193) = 4 ，所以该数字占用6（2+4）个字节。 <br />
<br />
1 row selected. <br />
<br />
<br />
然后,我们再来看数据部分, ORACLE对十进制的数字(整数部分,小数部分正好相反)是两位两位进行存储的(从右往左的顺序), 例如对1234, ORACLE会分别对12, 34进行存储. <br />
所以只需要对(+-)1-99进行编码 <br />
<br />
1 --- 99 分别用十六进制2-64表示，就是2-100, <br />
<br />
-1--- -99 用十六进制64-2表示，就是100-2 <br />
<br />
ZWF.YUDONG&gt;select dump(12345) from dual; <br />
<br />
DUMP(12345) <br />
------------------------ <br />
Typ=2 Len=4: 195,2,24,46&nbsp; --数据部分2,24,46 表示 （2-1=1，24-1=23，46-1=45）；HEAD部分表示12345 &gt;= 1,占用195-193+2=4字节。 <br />
<br />
1 row selected. <br />
<br />
<br />
SYS.YUDONG&gt;select dump(1100) from dual;&nbsp; <br />
<br />
DUMP(1100) <br />
------------------- <br />
Typ=2 Len=2: 194,12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --如果从右边起，连续2的n次方位为0，oracle一次排触（不存储）只是位数加1。可以对比dump(11)的情况看看。 <br />
<br />
1 row selected. <br />
<br />
SYS.YUDONG&gt;select dump(11) from dual; <br />
<br />
DUMP(11) <br />
------------------- <br />
Typ=2 Len=2: 193,12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --这里数据部分和1100是一样的，末位的2个0没有实际存储，长度193比194小1。 <br />
<br />
1 row selected. <br />
<br />
--对于含小数(负数、整数2种情况)的情况： <br />
<br />
1、负数 <br />
<br />
SYS.YUDONG&gt;select dump(-1.2) from dual; <br />
<br />
DUMP(-1.2) <br />
-------------------------- <br />
Typ=2 Len=4: 62,100,81,102&nbsp;&nbsp;&nbsp; --HEAD=62（3E）表示该数值小于等于-1;数据部分：整数部分的-1存储为100，小数部分从左往右2位一结合，不足2位后边补一个1。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应关系变为9，8...1表示1，2...9，看下面几个例子，如果足2位，还是按照上边说的规律（-1--- -99 用十六进制64-2表示，就是100-2）。 <br />
<br />
1 row selected. <br />
<br />
<br />
ZWF.YUDONG&gt;select dump(-2.1) from dual; <br />
<br />
DUMP(-2.1) <br />
------------------------- <br />
Typ=2 Len=4: 62,99,91,102 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(-2.2) from dual; <br />
<br />
DUMP(-2.2) <br />
------------------------- <br />
Typ=2 Len=4: 62,99,81,102 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(-2.9) from dual; <br />
<br />
DUMP(-2.9) <br />
------------------------- <br />
Typ=2 Len=4: 62,99,11,102 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(-2.12) from dual; <br />
<br />
DUMP(-2.12) <br />
------------------------- <br />
Typ=2 Len=4: 62,99,89,102 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(-2.13) from dual; <br />
<br />
DUMP(-2.13) <br />
------------------------- <br />
Typ=2 Len=4: 62,99,88,102 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(-2.123) from dual; <br />
<br />
DUMP(-2.123) <br />
---------------------------- <br />
Typ=2 Len=5: 62,99,89,71,102 <br />
<br />
1 row selected. <br />
<br />
<br />
2、正数 <br />
<br />
SYS.YUDONG&gt;select dump(1.222) from dual; <br />
<br />
DUMP(1.222) <br />
------------------------ <br />
Typ=2 Len=4: 193,2,23,21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --HEAD=193(C1)表示该数字大于等于1;数据部分:整数部分存储2(2-1=1),小数部分从左往右2位一结合,23(23-1=22)表示22,后边还剩下一个2, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不足2位的末尾补充一个1,也就是等于1.2220 <br />
<br />
1 row selected. <br />
<br />
ZWF.YUDONG&gt;select dump(1.2220) from dual; <br />
<br />
DUMP(1.2220) <br />
------------------------ <br />
Typ=2 Len=4: 193,2,23,21 <br />
<br />
1 row selected. <br />
<br />
<br />
符号位： 用的是(+-)1-99都不可能用到的编码66(102)来表示，有资料说为了处理排序问题（未加考证）。根据HEAD部分可以做初步判断，根据我们说的HEAD部分的四个范围， <br />
如果2个数值不在一个范围，立即可以看出大小，如果在一个范围其实也可以根据其正负+绝对值来进行排序了，正数绝对值大的就大，负数则相反，为何还要用到这个符号位？<br />
<br />
<strong>本地浮点类型</strong><br />
<br />
另外再说一下两个数值类型本地浮点数据类型（binary_float与binary_double）<br />
<br />
本地浮点数据类型最大的特点就是比NUMBER类型效率更高<br />
硬件运算/数学运算快 5&#8211; 10 倍<br />
占用更少的内存/磁盘空间（5/9 字节与 1 &#8211; 22 字节）<br />
BINARY_DOUBLE 值范围更大（e308 与 e125）<br />
无需类型转换（使用与字节顺序无关的存储格式）<br />
<br />
下面程序是使用欧拉级数计算圆周率&#8719;:<br />
&#8719; = sqrt ( 6 * ( 1 + 1/2*2 + 1/3*2 + ... ) )<br />
<br />
方法一：使用NUMBER类型<br />
<br />
create or replace procedure Euler_Pi_Number is<br />
<br />
subtype My_Number is number;<br />
<br />
zero constant My_Number := 0.0;<br />
one constant My_Number := 1.0;<br />
two constant My_Number := 2.0;<br />
six constant My_Number := 6.0;<br />
toler constant My_Number := 0.00000000001;<br />
root_toler constant My_Number := toler/1000.0;<br />
<br />
root My_Number;<br />
prev_root My_Number;<br />
prod_over_six My_Number;<br />
prod My_Number;<br />
pi My_Number;<br />
prev_pi My_Number;<br />
step My_Number;<br />
<br />
begin<br />
pi := one;<br />
prev_pi := zero;<br />
prod_over_six := zero;<br />
step := zero;<br />
while pi - prev_pi &gt; toler<br />
loop<br />
prev_pi := pi;<br />
step := step + one;<br />
prod_over_six := prod_over_six + one/(step*step);<br />
prod := six*prod_over_six;<br />
prev_root := prod;<br />
root := prod/two; <br />
while Abs(root - prev_root) &gt; root_toler<br />
loop<br />
prev_root := root;<br />
root := (root + prod/root)/two;<br />
end loop;<br />
pi := root;<br />
end loop;<br />
end Euler_Pi_Number;<br />
/<br />
<br />
<br />
方法二：使用BINARY_DOUBLE类型<br />
<br />
create or replace procedure Euler_Pi_Binary is<br />
<br />
subtype My_Number is binary_double;<br />
<br />
zero constant My_Number := 0.0d;<br />
one constant My_Number := 1.0d;<br />
two constant My_Number := 2.0d;<br />
six constant My_Number := 6.0d;<br />
toler constant My_Number := 0.00000000001d;<br />
root_toler constant My_Number := toler/1000.0d;<br />
<br />
root My_Number;<br />
prev_root My_Number;<br />
prod_over_six My_Number;<br />
prod My_Number;<br />
pi My_Number;<br />
prev_pi My_Number;<br />
step My_Number;<br />
<br />
begin<br />
pi := one;<br />
prev_pi := zero;<br />
prod_over_six := zero;<br />
step := zero;<br />
while pi - prev_pi &gt; toler<br />
loop<br />
prev_pi := pi;<br />
step := step + one;<br />
prod_over_six := prod_over_six + one/(step*step);<br />
prod := six*prod_over_six;<br />
prev_root := prod;<br />
root := prod/two; <br />
while Abs(root - prev_root) &gt; root_toler<br />
loop<br />
prev_root := root;<br />
root := (root + prod/root)/two;<br />
end loop;<br />
pi := root;<br />
end loop;<br />
end Euler_Pi_Binary;<br />
/<br />
<br />
<br />
SQL&gt; set timing on<br />
SQL&gt; exec Euler_Pi_Number;<br />
<br />
PL/SQL 过程已成功完成。<br />
<br />
已用时间: 00: 00: 11.59<br />
SQL&gt; exec Euler_Pi_Binary;<br />
<br />
PL/SQL 过程已成功完成。<br />
<br />
已用时间: 00: 00: 02.09<br />
<br />
<br />
上面例子中近似300,000次迭代计算,NUMBER类型花费11.59秒,BINARY_DOUBLE类型花费约2.09秒,性能提高大约5.5倍.<br />
<br />
结论：在版本10g之后写一些偏数字科学运行量巨大的存储过程、函数时,对于浮点数字类型要优先考虑使用本地浮点数据类型<br />
<br />
相关链接<br />
<a href="http://it.chinawin.net/database/article-4193.html">http://it.chinawin.net/database/article-4193.html</a><br />
<a href="http://ilinux.javaeye.com/blog/289550">http://ilinux.javaeye.com/blog/289550</a><br />
<a href="http://yaanzy.itpub.net/post/1263/200971">http://yaanzy.itpub.net/post/1263/200971</a><br />
<br />
<img src ="http://www.blogjava.net/caojianhua/aggbug/343461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caojianhua/" target="_blank">初一七月</a> 2011-01-24 21:56 <a href="http://www.blogjava.net/caojianhua/archive/2011/01/24/343461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库并发问题及事务隔离级别</title><link>http://www.blogjava.net/caojianhua/archive/2010/12/13/340560.html</link><dc:creator>初一七月</dc:creator><author>初一七月</author><pubDate>Mon, 13 Dec 2010 15:30:00 GMT</pubDate><guid>http://www.blogjava.net/caojianhua/archive/2010/12/13/340560.html</guid><wfw:comment>http://www.blogjava.net/caojianhua/comments/340560.html</wfw:comment><comments>http://www.blogjava.net/caojianhua/archive/2010/12/13/340560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caojianhua/comments/commentRss/340560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caojianhua/services/trackbacks/340560.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 数据库带来的并发问题主要包括：脏读、不可重复读与幻读。<br />
<br />
&nbsp;&nbsp;&nbsp; 脏读，就是指当一个事务正在访问数据，并且对数据进行了修改，而这种修改还没有提交到数据库中，这时，另外一个事务也访问这个数据，然后使用了这个数据。因为这个数据是还没有提交的数据，那么另外一个事务读到的这个数据是脏数据，依据脏数据所做的操作可能是不正确的。<br />
<br />
&nbsp;&nbsp;&nbsp; 不可重复读，是指在一个事务内，多次读同一数据。在这个事务还没有结束时，另外一个事务也访问该同一数据。那么，在第一个事务中的两次读数据之间，由于第二个事务的修改，那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的，因此称为是不可重复读。<br />
<br />
&nbsp;&nbsp;&nbsp; 幻读，是指当事务不是独立执行时发生的一种现象，例如第一个事务对一个表中的数据进行了修改，这种修改涉及到表中的全部数据行。同时，第二个事务也修改这个表中的数据，这种修改是向表中插入一行新数据。那么，以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行，就好象发生了幻觉一样。<br />
<br />
&nbsp;&nbsp;&nbsp; ANSI SQL中定义的4个隔离级实际上是用对锁的操作来定义的：<br />
<br />
&nbsp;&nbsp;&nbsp; Read Uncommitted(未提交读取，也叫脏读): 读数据时不加锁。允许脏读、不可重复读、幻觉读。<br />
&nbsp;&nbsp;&nbsp; Read Committed(提交读取): 在读数据之前加一个读锁，读完之后释放锁。允许不可重复读、幻觉读。<br />
&nbsp;&nbsp;&nbsp; Repeatable Read(可重复读取): 在读数据之前加一个读锁，读完之后不释放锁，直到事务rollback或者commit后才释放锁。允许幻觉读。<br />
&nbsp;&nbsp;&nbsp; Serializable(串行化读取): 在读数据之前在读取的条件上加锁（称为条件锁），读完之后不释放锁，直到事务rollback或者commit后才释放锁。不允许脏读、不可重复读、幻读。<br />
<br />
&nbsp;&nbsp;&nbsp; 以下是对照表<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
<table border="1">
    <thead>
        <tr>
            <th>隔离级别 </th>
            <th>脏读（Dirty Read） </th>
            <th>不可重复读（NonRepeatable Read） </th>
            <th>幻读（Phantom Read） </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>读未提交（Read uncommitted） </td>
            <td>可能 </td>
            <td>可能 </td>
            <td>可能 </td>
        </tr>
        <tr>
            <td>读已提交（Read committed） </td>
            <td>不可能 </td>
            <td>可能 </td>
            <td>可能 </td>
        </tr>
        <tr>
            <td>可重复读（Repeatable read） </td>
            <td>不可能 </td>
            <td>不可能 </td>
            <td>可能 </td>
        </tr>
        <tr>
            <td>可串行化（Serializable ） </td>
            <td>不可能 </td>
            <td>不可能 </td>
            <td>不可能 </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/caojianhua/aggbug/340560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caojianhua/" target="_blank">初一七月</a> 2010-12-13 23:30 <a href="http://www.blogjava.net/caojianhua/archive/2010/12/13/340560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>