﻿<?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-金色闪电--Ryan-文章分类-DB</title><link>http://www.blogjava.net/kissyan4916/category/37693.html</link><description>哎哟 Orz，不错喔~~希望结交更多喜爱Java的朋友!&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;QQ：95350863 MSN：chenyanhubusiness@gmail.com</description><language>zh-cn</language><lastBuildDate>Tue, 16 Jun 2009 14:49:47 GMT</lastBuildDate><pubDate>Tue, 16 Jun 2009 14:49:47 GMT</pubDate><ttl>60</ttl><item><title>数据库范式(转)</title><link>http://www.blogjava.net/kissyan4916/articles/282396.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 15 Jun 2009 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/282396.html</guid><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 13.5pt;"><span style="font-size: 9pt; font-family: 宋体;">数
据库范式是数据库设计中必不可少的知识，没有对范式的理解，就无法设计出高效率、优雅的数据库。甚至设计出错误的数据库。而想要理解并掌握范式却并不是那
么容易。教科书中一般以关系代数的方法来解释数据库范式。这样做虽然能够十分准确的表达数据库范式，但比较抽象，不太直观，不便于理解，更难以记忆。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">本
文用较为直白的语言介绍范式，旨在便于理解和记忆，这样做可能会出现一些不精确的表述。但对于初学者应该是个不错的入门。我写下这些的目的主要是为了加强
记忆，其实我也比较菜，我希望当我对一些概念生疏的时候，回过头来看看自己写的笔记，可以快速地进入状态。如果你发现其中用错误，请指正。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 9pt; font-family: 宋体;">下面开始进入正题：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一、基础概念</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">要理解范式，首先必须对知道什么是关系数据库，如果你不知道，我可以简单的不能再简单的说一下：关系数据库就是用二维表来保存数据。表和表之间可以&#8230;&#8230;（省略</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">10W</span></span><span style="font-size: 9pt; font-family: 宋体;">字）。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">然后你应该理解以下概念：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">实体：</span><span style="font-size: 9pt; font-family: 宋体;">现实世界中客观存在并可以被区别的事物。比如&#8220;一个学生&#8221;、&#8220;一本书&#8221;、&#8220;一门课&#8221;等等。值得强调的是这里所说的&#8220;事物&#8221;不仅仅是看得见摸得着的&#8220;东西&#8221;，它也可以是虚拟的，不如说&#8220;老师与学校的关系&#8221;。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">属性</span><span style="font-size: 9pt; color: #339966; font-family: 宋体;">：</span><span style="font-size: 9pt; font-family: 宋体;">教科书上解释为：&#8220;实体所具有的某一特性&#8221;，由此可见，属性一开始是个逻辑概念，比如说，&#8220;性别&#8221;是&#8220;人&#8221;的一个属性。在关系数据库中，属性又是个物理概念，属性可以看作是&#8220;表的一列&#8221;。</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">元组</span><span style="font-size: 9pt; font-family: 宋体;">：表中的一行就是一个元组。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">分量：</span><span style="font-size: 9pt; font-family: 宋体;">元组的某个属性值。在一个关系数据库中，它是一个操作原子，即关系数据库在做任何操作的时候，属性是&#8220;不可分的&#8221;。否则就不是关系数据库了。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">码</span><span style="font-size: 9pt; font-family: 宋体;">：表中可以唯一确定一个元组的某个属性（或者属性组），如果这样的码有不止一个，那么大家都叫候选码，我们从候选码中挑一个出来做老大，它就叫主码。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 13.5pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">全码</span><span style="font-size: 9pt; font-family: 宋体;">：如果一个码包含了所有的属性，这个码就是全码。</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 13.5pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">主属性</span><span style="font-size: 9pt; font-family: 宋体;">：一个属性只要在任何一个候选码中出现过，这个属性就是主属性。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 13.5pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">非主属性</span><span style="font-size: 9pt; font-family: 宋体;">：与上面相反，没有在任何候选码中出现过，这个属性就是非主属性。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 13.5pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">外码：</span><span style="font-size: 9pt; font-family: 宋体;">一个属性（或属性组），它不是码，但是它别的表的码，它就是外码。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">二、</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">6</span></span><span style="font-size: 9pt; font-family: 宋体;">个范式</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; font-family: 宋体;">首先要明白，范式的包含关系。一个数据库设计如果符合第二范式，一定也符合第一范式。如果符合第三范式，一定也符合第二范式&#8230;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">第一范式（</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">1NF</span></span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">）：属性不可分</span></strong><span style="font-size: 9pt; font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; font-family: 宋体;">在前面我们已经介绍了属性值的概念，我们说，它是&#8220;不可分的&#8221;。而第一范式要求属性也不可分。那么它和属性值不可分有什么区别呢？给一个例子：</span></p>
<div>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 71.25pt; background-color: transparent;" width="95">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">name</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 147.7pt; background-color: transparent;" colspan="2" width="197">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">tel</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 51.55pt; background-color: transparent;" width="69">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">age</span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 71.25pt; background-color: transparent;" width="95">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">大宝</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 147.7pt; background-color: transparent;" colspan="2" width="197">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">13612345678</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 51.55pt; background-color: transparent;" width="69">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">22</span></span></p>
            </td>
        </tr>
        <tr style="height: 26.55pt;">
            <td style="padding: 0cm 5.4pt; width: 71.25pt; height: 26.55pt; background-color: transparent;" width="95">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">小明</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.85pt; height: 26.55pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">13988776655</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.85pt; height: 26.55pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">010</span></span><span style="font-size: 9pt; font-family: 宋体;">－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1234567</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 51.55pt; height: 26.55pt; background-color: transparent;" width="69">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">21</span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 71.25pt; background-color: transparent;" width="95">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.5pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.5pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 51.75pt; background-color: transparent;" width="69">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">Ps</span></span><span style="font-size: 9pt; font-family: 宋体;">：这个表中，属性值&#8220;分&#8221;了。</span></p>
<div>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 7.8pt;">
            <td style="padding: 0cm 5.4pt; width: 71.25pt; height: 7.8pt; background-color: transparent;" rowspan="2" width="95">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">name</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 147.7pt; height: 7.8pt; background-color: transparent;" colspan="2" width="197">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">tel</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 51.55pt; height: 7.8pt; background-color: transparent;" rowspan="2" width="69">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">age</span></span></p>
            </td>
        </tr>
        <tr style="height: 7.8pt;">
            <td style="padding: 0cm 5.4pt; width: 73.85pt; height: 7.8pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">手机</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.85pt; height: 7.8pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">座机</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 71.25pt; background-color: transparent;" width="95">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">大宝</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.85pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">13612345678</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.85pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">021</span></span><span style="font-size: 9pt; font-family: 宋体;">－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">9876543</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 51.55pt; background-color: transparent;" width="69">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">22</span></span></p>
            </td>
        </tr>
        <tr style="height: 26.55pt;">
            <td style="padding: 0cm 5.4pt; width: 71.25pt; height: 26.55pt; background-color: transparent;" width="95">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">小明</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.85pt; height: 26.55pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">13988776655</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 73.85pt; height: 26.55pt; background-color: transparent;" width="98">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">010</span></span><span style="font-size: 9pt; font-family: 宋体;">－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1234567</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 51.55pt; height: 26.55pt; background-color: transparent;" width="69">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">21</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">Ps</span></span><span style="font-size: 9pt; font-family: 宋体;">：这个表中，属性</span><span style="font-size: 9pt;"><span style="font-family: Times New Roman;"> </span></span><span style="font-size: 9pt; font-family: 宋体;">&#8220;分&#8221;了。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">这两种情况都不满足第一范式。不满足第一范式的数据库，不是关系数据库！所以，我们在任何关系数据库管理系统中，做不出这样的&#8220;表&#8221;来。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 9pt; color: #ff6600; font-family: 宋体;">第二范式（</span></strong><strong><span style="font-size: 9pt; color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">2NF</span></span></strong><strong><span style="font-size: 9pt; color: #ff6600; font-family: 宋体;">）：</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">符合</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">1NF</span></span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">，并且，非主属性完全依赖于码</span></strong><span style="font-size: 9pt; font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">听起来好像很神秘，其实真的没什么。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一
个候选码中的主属性也可能是好几个。如果一个主属性，它不能单独做为一个候选码，那么它也不能确定任何一个非主属性。给一个反例：我们考虑一个小学的教务
管理系统，学生上课指定一个老师，一本教材，一个教室，一个时间，大家都上课去吧，没有问题。那么数据库怎么设计？（学生上课表）</span></p>
<div>
<table class="MsoNormalTable" style="margin: auto auto auto 14.55pt; width: 405.85pt; border-collapse: collapse;" width="541" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 12.2pt;">
            <td style="padding: 0cm 5.4pt; width: 40.3pt; height: 12.2pt; background-color: transparent;" valign="top" width="54">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">学生</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 84.6pt; height: 12.2pt; background-color: transparent;" valign="top" width="113">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">课程</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 32.2pt; height: 12.2pt; background-color: transparent;" valign="top" width="43">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">老师</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 68.25pt; height: 12.2pt; background-color: transparent;" valign="top" width="91">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">老师职称</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 75.95pt; height: 12.2pt; background-color: transparent;" valign="top" width="101">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">教材</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 36.6pt; height: 12.2pt; background-color: transparent;" valign="top" width="49">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">教室</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 67.95pt; height: 12.2pt; background-color: transparent;" valign="top" width="91">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">上课时间</span></p>
            </td>
        </tr>
        <tr style="height: 12.2pt;">
            <td style="padding: 0cm 5.4pt; width: 40.3pt; height: 12.2pt; background-color: transparent;" valign="top" width="54">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">小明</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 84.6pt; height: 12.2pt; background-color: transparent;" valign="top" width="113">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一年级语文（上）</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 32.2pt; height: 12.2pt; background-color: transparent;" valign="top" width="43">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">大宝</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 68.25pt; height: 12.2pt; background-color: transparent;" valign="top" width="91">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">副教授</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 75.95pt; height: 12.2pt; background-color: transparent;" valign="top" width="101">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">《小学语文</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体;">》</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 36.6pt; height: 12.2pt; background-color: transparent;" valign="top" width="49">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">101</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 67.95pt; height: 12.2pt; background-color: transparent;" valign="top" width="91">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">14</span></span><span style="font-size: 9pt; font-family: 宋体;">：</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">30</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一个学生上一门课，一定在特定某个教室。所以有（学生，课程）－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&gt;</span></span><span style="font-size: 9pt; font-family: 宋体;">教室</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一个学生上一门课，一定是特定某个老师教。所以有（学生，课程）－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&gt;</span></span><span style="font-size: 9pt; font-family: 宋体;">老师</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一个学生上一门课，他老师的职称可以确定。所以有（学生，课程）－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&gt;</span></span><span style="font-size: 9pt; font-family: 宋体;">老师职称</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一个学生上一门课，一定是特定某个教材。所以有（学生，课程）－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&gt;</span></span><span style="font-size: 9pt; font-family: 宋体;">教材</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一个学生上一门课，一定在特定时间。所以有（学生，课程）－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&gt;</span></span><span style="font-size: 9pt; font-family: 宋体;">上课时间</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">因此（学生，课程）是一个码。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">然而，一个课程，一定指定了某个教材，一年级语文肯定用的是《小学语文</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体;">》，那么就有课程－</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&gt;</span></span><span style="font-size: 9pt; font-family: 宋体;">教材。（学生，课程）是个码，课程却决定了教材，这就叫做不完全依赖，或者说部分依赖。出现这样的情况，就不满足第二范式！</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">有什么不好吗？你可以想想：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体;">、</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; font-family: 宋体;">校长要新增加一门课程叫&#8220;微积分&#8221;，教材是《大学数学》，怎么办？学生还没选课，而学生又是主属性，主属性不能空，课程怎么记录呢，教材记到哪呢</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">? </span></span><span style="font-size: 9pt; font-family: 宋体;">&#8230;&#8230;郁闷了吧</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">?(</span></span><span style="font-size: 9pt; font-family: 宋体;">插入异常</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">)</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-size: 9pt; font-family: 宋体;">、</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; font-family: 宋体;">下学期没学生学一年级语文（上）了，学一年级语文（下）去了，那么表中将不存在一年级语文（上），也就没了《小学语文</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体;">》。这时候，校长问：一年级语文（上）用的什么教材啊？&#8230;&#8230;郁闷了吧</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">?(</span></span><span style="font-size: 9pt; font-family: 宋体;">删除异常</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">)</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">3</span></span><span style="font-size: 9pt; font-family: 宋体;">、</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; font-family: 宋体;">校长说：一年级语文（上）换教材，换成《大学语文》。有</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">10000</span></span><span style="font-size: 9pt; font-family: 宋体;">个学生选了这么课，改动好大啊！改累死了&#8230;&#8230;郁闷了吧？（修改异常）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">那应该怎么解决呢？投影分解，将一个表分解成两个或若干个表</span></p>
<div>
<table class="MsoNormalTable" style="margin: auto auto auto 14.55pt; width: 375.2pt; border-collapse: collapse;" width="500" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 17.6pt;">
            <td style="padding: 0cm 5.4pt; width: 55.45pt; height: 17.6pt; background-color: transparent;" valign="top" width="74">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">学生</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 99.95pt; height: 17.6pt; background-color: transparent;" valign="top" width="133">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">课程</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.05pt; height: 17.6pt; background-color: transparent;" valign="top" width="53">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">老师</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 54.5pt; height: 17.6pt; background-color: transparent;" valign="top" width="73">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">老师职称</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.7pt; height: 17.6pt; background-color: transparent;" valign="top" width="54">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">教室</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 84.55pt; height: 17.6pt; background-color: transparent;" valign="top" width="113">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">上课时间</span></p>
            </td>
        </tr>
        <tr style="height: 17.6pt;">
            <td style="padding: 0cm 5.4pt; width: 55.45pt; height: 17.6pt; background-color: transparent;" valign="top" width="74">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">小明</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 99.95pt; height: 17.6pt; background-color: transparent;" valign="top" width="133">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一年级语文（上）</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.05pt; height: 17.6pt; background-color: transparent;" valign="top" width="53">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">大宝</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 54.5pt; height: 17.6pt; background-color: transparent;" valign="top" width="73">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">副教授</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.7pt; height: 17.6pt; background-color: transparent;" valign="top" width="54">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">101</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 84.55pt; height: 17.6pt; background-color: transparent;" valign="top" width="113">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">14</span></span><span style="font-size: 9pt; font-family: 宋体;">：</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">30</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">学生上课表新</span></p>
<div>
<table class="MsoNormalTable" style="margin: auto auto auto 14.55pt; width: 239.5pt; border-collapse: collapse;" width="319" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 17.6pt;">
            <td style="padding: 0cm 5.4pt; width: 119.75pt; height: 17.6pt; background-color: transparent;" valign="top" width="160">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">课程</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 119.75pt; height: 17.6pt; background-color: transparent;" valign="top" width="160">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">教材</span></p>
            </td>
        </tr>
        <tr style="height: 17.6pt;">
            <td style="padding: 0cm 5.4pt; width: 119.75pt; height: 17.6pt; background-color: transparent;" valign="top" width="160">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一年级语文（上）</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 119.75pt; height: 17.6pt; background-color: transparent;" valign="top" width="160">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">《小学语文</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体;">》</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">课程的表</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">第三范式（</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">3NF</span></span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">）：符合</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">2NF</span></span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">，并且，消除传递依赖</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">上面的&#8220;学生上课表新&#8221;符合</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">2NF</span></span><span style="font-size: 9pt; font-family: 宋体;">，可以这样验证：两个主属性单独使用，不用确定其它四个非主属性的任何一个。但是它有传递依赖！</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">在哪呢？问题就出在&#8220;老师&#8221;和&#8220;老师职称&#8221;这里。一个老师一定能确定一个老师职称。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">有什么问题吗？想想：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体;">、</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp; </span></span><span style="font-size: 9pt; font-family: 宋体;">老师升级了，变教授了，要改数据库，表中有</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">N</span></span><span style="font-size: 9pt; font-family: 宋体;">条，改了</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">N</span></span><span style="font-size: 9pt; font-family: 宋体;">次&#8230;&#8230;（修改异常）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-size: 9pt; font-family: 宋体;">、</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp; </span></span><span style="font-size: 9pt; font-family: 宋体;">没人选这个老师的课了，老师的职称也没了记录&#8230;&#8230;（删除异常）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">3</span></span><span style="font-size: 9pt; font-family: 宋体;">、</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp; </span></span><span style="font-size: 9pt; font-family: 宋体;">新来一个老师，还没分配教什么课，他的职称记到哪？&#8230;&#8230;（插入异常）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">那应该怎么解决呢？和上面一样，投影分解：</span></p>
<div>
<table class="MsoNormalTable" style="margin: auto auto auto 14.55pt; width: 320.7pt; border-collapse: collapse;" width="428" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 17.6pt;">
            <td style="padding: 0cm 5.4pt; width: 55.45pt; height: 17.6pt; background-color: transparent;" valign="top" width="74">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">学生</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 99.95pt; height: 17.6pt; background-color: transparent;" valign="top" width="133">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">课程</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.05pt; height: 17.6pt; background-color: transparent;" valign="top" width="53">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">老师</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.7pt; height: 17.6pt; background-color: transparent;" valign="top" width="54">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">教室</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 84.55pt; height: 17.6pt; background-color: transparent;" valign="top" width="113">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">上课时间</span></p>
            </td>
        </tr>
        <tr style="height: 17.6pt;">
            <td style="padding: 0cm 5.4pt; width: 55.45pt; height: 17.6pt; background-color: transparent;" valign="top" width="74">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">小明</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 99.95pt; height: 17.6pt; background-color: transparent;" valign="top" width="133">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">一年级语文（上）</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.05pt; height: 17.6pt; background-color: transparent;" valign="top" width="53">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">大宝</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 40.7pt; height: 17.6pt; background-color: transparent;" valign="top" width="54">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">101</span></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 84.55pt; height: 17.6pt; background-color: transparent;" valign="top" width="113">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">14</span></span><span style="font-size: 9pt; font-family: 宋体;">：</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">30</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<div>
<table class="MsoNormalTable" style="margin: auto auto auto 14.55pt; width: 188pt; border-collapse: collapse;" width="251" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 19.3pt;">
            <td style="padding: 0cm 5.4pt; width: 79.65pt; height: 19.3pt; background-color: transparent;" valign="top" width="106">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">老师</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 108.35pt; height: 19.3pt; background-color: transparent;" valign="top" width="144">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">老师职称</span></p>
            </td>
        </tr>
        <tr style="height: 19.3pt;">
            <td style="padding: 0cm 5.4pt; width: 79.65pt; height: 19.3pt; background-color: transparent;" valign="top" width="106">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">大宝</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 108.35pt; height: 19.3pt; background-color: transparent;" valign="top" width="144">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">副教授</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">范式（</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">BCNF</span></span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">）：符合</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">3NF</span></span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体;">，并且，主属性不依赖于主属性</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; font-family: 宋体;">若关系模式属于第一范式，且每个属性都不传递依赖于键码，则</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">R</span></span><span style="font-size: 9pt; font-family: 宋体;">属于</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span><span style="font-size: 9pt; font-family: 宋体;">范式。</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">通常</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span><span style="font-size: 9pt; font-family: 宋体;">范式的条件有多种等价的表述：每个非平凡依赖的左边必须包含键码；每个决定因素必须包含键码。</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span><span style="font-size: 9pt; font-family: 宋体;">范式既检查非主属性，又检查主属性。当只检查非主属性时，就成了第三范式。满足</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span><span style="font-size: 9pt; font-family: 宋体;">范式的关系都必然满足第三范式。</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体;">还可以这么说：若一个关系达到了第三范式，并且它只有一个候选码，或者它的每个候选码都是单属性，则该关系自然达到</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span><span style="font-size: 9pt; font-family: 宋体;">范式。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; font-family: 宋体;">一般，一个数据库设计符合</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">3NF</span></span><span style="font-size: 9pt; font-family: 宋体;">或</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">BCNF</span></span><span style="font-size: 9pt; font-family: 宋体;">就可以了。在</span><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span><span style="font-size: 9pt; font-family: 宋体;">范式以上还有第四范式、第五范式。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">第四范式：要求把同一表内的多对多关系删除。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; color: blue; font-family: 宋体;">第五范式：从最终结构重新建立原始结构。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt; font-family: 宋体;">但在绝大多数应用中不需要设计到这种程度。并且，某些情况下，过于范式化甚至会对数据库的逻辑可读性和使用效率起到阻碍。数据库中一定程度的冗余并不一定是坏事情。如果你对第四范式、第五范式感兴趣可以看一看专业教材，从头学起，并且忘记我说的一切，以免对你产生误导。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-size: 9pt;" lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20pt;"><span style="font-size: 10pt; font-family: 宋体;">所谓范式就是符合某一种级别的关系模式的集合。通过分解把属于低级范式的关系模式转换为几个属于高级范式的关系模式的集合。这一过程称为规范化。</span><span style="font-size: 10pt;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp;&nbsp; </span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp;&nbsp;&nbsp; </span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp; </span>1</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">、第一范式（</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">1NF</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">）：一个关系模式</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">R</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">的所有属性都是不可分的基本数据项。</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp;&nbsp; </span></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp; </span>2</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">、第二范式（</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">2NF</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">）：关系模式</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">R</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">属于第一范式，且每个非主属性都完全函数依赖于键码。</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp;&nbsp; </span></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp; </span>3</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">、第三范式（</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">3NF</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">）：关系模式</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">R</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">属于第一范式，且每个非主属性都不传递依赖于键码。</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp;&nbsp; </span></span></span></strong></p>
<strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;"><span>&nbsp; </span>4</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">、</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">BC</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">范式（</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">BCNF</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">）：关系模式</span></strong><strong><span style="font-size: 10pt; color: #3366ff;" lang="EN-US"><span style="font-family: Times New Roman;">R</span></span></strong><strong><span style="font-size: 10pt; color: #3366ff; font-family: 宋体;">属于第一范式，且每个属性都不传递依赖于键码。</span></strong><img src ="http://www.blogjava.net/kissyan4916/aggbug/282396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-06-15 16:52 <a href="http://www.blogjava.net/kissyan4916/articles/282396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个Oracle的小项目</title><link>http://www.blogjava.net/kissyan4916/articles/254945.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254945.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254945.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254945.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseMicrosoftInternetExplorer4st1":*{behavior:url(#ieooui) }/* Style Definitions */table.MsoNormalTable{mso-style-parent:"";font-size...&nbsp;&nbsp;<a href='http://www.blogjava.net/kissyan4916/articles/254945.html'>阅读全文</a><img src ="http://www.blogjava.net/kissyan4916/aggbug/254945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:34 <a href="http://www.blogjava.net/kissyan4916/articles/254945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>序列、触发器实例</title><link>http://www.blogjava.net/kissyan4916/articles/254944.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:32:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254944.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254944.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254944.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: 宋体;">想在项目中插入一个序列，对序列的概念以及用法有点模糊，通过查阅资料现在已经对在</span>oracle<span style="font-family: 宋体;">中插入序列有了一定的了解：</span></p>
<p><span style="font-family: 宋体;">创建一个序列：</span></p>
<p>create sequence SEQ_FileInfo_GW</p>
<p>minvalue 100000000</p>
<p>maxvalue 299999999</p>
<p>start with 100000000</p>
<p>increment by 1;</p>
<p><span style="font-family: 宋体;">当向表中插入数据时，</span>SQL<span style="font-family: 宋体;">语句写法如下：</span></p>
<p><span>INSERT<span>&nbsp;&nbsp;
</span>INTO&nbsp;&nbsp; my_table(id,...)&nbsp;&nbsp; values(seq.NEXTVAL,...)</span></p>
<p><span style="font-family: Wingdings;"><br />
</span></p>
<p><strong><span style="font-family: 宋体;">触发器应用场景</span></strong><span style="font-family: 宋体;">:</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</span><span style="font-family: 宋体;">、强化约束</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</span><span style="font-family: 宋体;">、跟踪变化</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span><span style="font-family: 宋体;">、级联运行</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4</span><span style="font-family: 宋体;">、存储过程的调用</span></p>
<p><strong><span style="font-family: 宋体;">触发器分类:</span></strong></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</span><span style="font-family: 宋体;">、DML触发器</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</span><span style="font-family: 宋体;">、INSTEAD OF触发器</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span><span style="font-family: 宋体;">、系统触发器</span></p>
<p><span style="font-family: Wingdings;"><br />
</span></p>
<p><span style="font-family: 宋体;">--demo</span></p>
<p><span style="font-family: 宋体;">--</span><span style="font-family: 宋体;">创建一个语句级触发器，不允许用户在&#8220;星期日&#8221;使用emp表。</span></p>
<p><span style="font-family: 宋体;">CREATE OR REPLACE
TRIGGER not_sunday</span></p>
<p><span style="font-family: 宋体;">BEFORE INSERT OR
UPDATE OR DELETE ON emp</span></p>
<p><span style="font-family: 宋体;">BEGIN</span></p>
<p><span style="font-family: 宋体;">&nbsp;IF rtrim(to_char(SYSDATE,'day'))='SUNDAY'
THEN</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; raise_application_error(-20333,'Sorry!Not
on Sundays');</span></p>
<p><span style="font-family: 宋体;">&nbsp;END IF;</span></p>
<p><span style="font-family: 宋体;">END;</span></p>
<p><span style="font-family: 宋体;">--demo</span></p>
<p><span style="font-family: 宋体;">--</span><span style="font-family: 宋体;">创建一个行级触发器，将从emp表中删除的记录输入到ret_emp表中</span></p>
<p><span style="font-family: 宋体;">--step1</span></p>
<p><span style="font-family: 宋体;">CREATE TABLE ret_emp
AS SELECT * FROM emp;</span></p>
<p><span style="font-family: 宋体;">--step1</span></p>
<p><span style="font-family: 宋体;">CREATE OR REPLACE
TRIGGER emp_retire</span></p>
<p><span style="font-family: 宋体;">BEFORE DELETE ON emp</span></p>
<p><span style="font-family: 宋体;">FOR EACH ROW</span></p>
<p><span style="font-family: 宋体;">BEGIN</span></p>
<p><span style="font-family: 宋体;">&nbsp;INSERT INTO ret_emp VALUES
(:OLD.empno,:OLD.ename,:OLD.job,:OLD.mgr,:OLD.hiredate,:OLD.sal,:OLD.comm,:OLD.deptno);</span></p>
<p><span style="font-family: 宋体;">END;</span></p>
<p><span style="font-family: 宋体;">--demo</span></p>
<p><span style="font-family: 宋体;">--</span><span style="font-family: 宋体;">创建一个行级触发器，停止用户删除'president'的记录。</span></p>
<p><span style="font-family: 宋体;">CREATE OR REPLACE
TRIGGER not_president</span></p>
<p><span style="font-family: 宋体;">BEFORE DELETE ON emp</span></p>
<p><span style="font-family: 宋体;">FOR EACH ROW</span></p>
<p><span style="font-family: 宋体;">WHEN
(old.job='PRESIDENT')</span></p>
<p><span style="font-family: 宋体;">BEGIN</span></p>
<p><span style="font-family: 宋体;">&nbsp;raise_application_error(-20444,'CANNOT DELETE
PRESIDENTS RECORD');</span></p>
<p><span style="font-family: 宋体;">END;</span></p>
<p><span style="font-family: 宋体;">--demo</span></p>
<p><span style="font-family: 宋体;">--</span><span style="font-family: 宋体;">创建instead of触发器，通过视图添加数据。</span></p>
<p><span style="font-family: 宋体;">--step1</span></p>
<p><span style="font-family: 宋体;">create or replace
view v_deptemp</span></p>
<p><span style="font-family: 宋体;">as</span></p>
<p><span style="font-family: 宋体;">&nbsp;select dept.deptno,dept.dname,</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp.empno,emp.ename</span></p>
<p><span style="font-family: 宋体;">&nbsp;from dept,emp</span></p>
<p><span style="font-family: 宋体;">&nbsp;where dept.deptno = emp.deptno;</span></p>
<p><span style="font-family: 宋体;">&nbsp;</span></p>
<p><span style="font-family: 宋体;">--step2&nbsp;</span></p>
<p><span style="font-family: 宋体;">insert into
v_deptemp values(90,'dept',9001,'emp');</span></p>
<p><span style="font-family: 宋体;">--step3&nbsp;</span></p>
<p><span style="font-family: 宋体;">create or replace
trigger tr_i_deptemp</span></p>
<p><span style="font-family: 宋体;">instead of insert on
v_deptemp</span></p>
<p><span style="font-family: 宋体;">for each row</span></p>
<p><span style="font-family: 宋体;">declare </span></p>
<p><span style="font-family: 宋体;">&nbsp;v_num number;</span></p>
<p><span style="font-family: 宋体;">begin</span></p>
<p><span style="font-family: 宋体;">&nbsp;</span></p>
<p><span style="font-family: 宋体;">&nbsp;select count(*) into v_num</span></p>
<p><span style="font-family: 宋体;">&nbsp;from dept where deptno = :new.deptno;</span></p>
<p><span style="font-family: 宋体;">&nbsp;if v_num = 0 then</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp; insert into dept(deptno,dname)</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp; values(:new.deptno,:new.dname);</span></p>
<p><span style="font-family: 宋体;">&nbsp;end if;</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-family: 宋体;">&nbsp;select count(*) into v_num</span></p>
<p><span style="font-family: 宋体;">&nbsp;from emp where empno = :new.empno;</span></p>
<p><span style="font-family: 宋体;">&nbsp;if v_num = 0 then</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp; insert into emp(empno,ename)</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp; values(:new.empno,:new.ename);</span></p>
<p><span style="font-family: 宋体;">&nbsp;end if;</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-family: 宋体;">end;&nbsp;</span></p>
<p><span style="font-family: 宋体;">--step4&nbsp;</span></p>
<p><span style="font-family: 宋体;">insert into
v_deptemp values(90,'dept',9001,'emp');</span></p>
<p><span style="font-family: 宋体;">--demo</span></p>
<p><span style="font-family: 宋体;">--</span><span style="font-family: 宋体;">创建DDL触发器</span></p>
<p><span style="font-family: 宋体;">--step1</span></p>
<p><span style="font-family: 宋体;">create table tmp</span></p>
<p><span style="font-family: 宋体;">( tid number,</span></p>
<p><span style="font-family: 宋体;">&nbsp;tdesc varchar2(20)</span></p>
<p><span style="font-family: 宋体;">);</span></p>
<p><span style="font-family: 宋体;">--step2</span></p>
<p><span style="font-family: 宋体;">create or replace
trigger ddlschema</span></p>
<p><span style="font-family: 宋体;">after create or drop
or alter on schema</span></p>
<p><span style="font-family: 宋体;">begin</span></p>
<p><span style="font-family: 宋体;">&nbsp;insert into tmp values(1,'create');</span></p>
<p><span style="font-family: 宋体;">end;</span></p>
<p><span style="font-family: 宋体;">--demo</span></p>
<p><span style="font-family: 宋体;">--</span><span style="font-family: 宋体;">创建DDL触发器</span></p>
<p><span style="font-family: 宋体;">--step1</span></p>
<p><span style="font-family: 宋体;">grant administer
database trigger to scott;</span></p>
<p><span style="font-family: 宋体;">--step2</span></p>
<p><span style="font-family: 宋体;">create or replace
trigger loguser</span></p>
<p><span style="font-family: 宋体;">after logon on
schema</span></p>
<p><span style="font-family: 宋体;">begin</span></p>
<p><span style="font-family: 宋体;">&nbsp;insert into tmp values(1,'user log');</span></p>
<p><span style="font-family: 宋体;">end;</span></p>
<p><span style="font-family: 宋体;">--step3</span></p>
<p><span style="font-family: 宋体;">create or replace
trigger logalluser</span></p>
<p><span style="font-family: 宋体;">after logon on
database</span></p>
<p><span style="font-family: 宋体;">begin</span></p>
<p><span style="font-family: 宋体;">&nbsp;insert into scott.tmp values(2,'user all
log');</span></p>
<p><span style="font-family: 宋体;">end;</span></p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:32 <a href="http://www.blogjava.net/kissyan4916/articles/254944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程</title><link>http://www.blogjava.net/kissyan4916/articles/254943.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:30:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254943.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254943.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254943.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C07%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: 宋体; color: red;">--demo1</span></p>
<p><span style="font-family: 宋体; color: black;">create or replace procedure proc_query_emp</span></p>
<p><span style="font-family: 宋体; color: black;">( p_empno emp.empno%type)</span></p>
<p><span style="font-family: 宋体; color: black;">is</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;v_emp
emp%rowtype;</span></p>
<p><span style="font-family: 宋体; color: black;">begin</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;select *
into v_emp</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;from emp
where empno = p_empno;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;dbms_output.put_line(v_emp.empno);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;dbms_output.put_line(v_emp.ename);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;dbms_output.put_line(v_emp.sal);</span></p>
<p><span style="font-family: 宋体; color: black;">end;</span></p>
<p><span style="font-family: 宋体; color: red;">--demo2</span></p>
<p><span style="font-family: 宋体; color: black;">create or replace procedure proc_i_dept</span></p>
<p><span style="font-family: 宋体; color: black;">(p_deptno dept.deptno%type,</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;p_dname
dept.dname%type,</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;p_loc
dept.loc%type</span></p>
<p><span style="font-family: 宋体; color: black;">)</span></p>
<p><span style="font-family: 宋体; color: black;">is</span></p>
<p><span style="font-family: 宋体; color: black;">begin</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;insert into
dept(deptno,dname,loc)</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;values(p_deptno,p_dname,p_loc);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;commit;</span></p>
<p><span style="font-family: 宋体; color: black;">end;</span></p>
<p><span style="font-family: 宋体; color: red;">--demo3</span></p>
<p><span style="font-family: 宋体; color: black;">create or replace procedure proc_test_par</span></p>
<p><span style="font-family: 宋体; color: black;">( p_i in varchar2,</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;p_j out
varchar2,</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;p_m in out
varchar2 </span></p>
<p><span style="font-family: 宋体; color: black;">)</span></p>
<p><span style="font-family: 宋体; color: black;">is</span></p>
<p><span style="font-family: 宋体; color: black;">begin</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;p_j := '2';</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;dbms_output.put_line(p_i);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;dbms_output.put_line(p_j);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;dbms_output.put_line(p_m);</span></p>
<p><span style="font-family: 宋体; color: black;">end;</span></p>
<p><span style="font-family: 宋体; color: red;">--demo4</span></p>
<p><span style="font-family: 宋体; color: black;">--step1</span></p>
<p><span style="font-family: 宋体; color: black;">create table pos_info</span></p>
<p><span style="font-family: 宋体; color: black;">( pid char(3),</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;pnum number</span></p>
<p><span style="font-family: 宋体; color: black;">)</span></p>
<p><span style="font-family: 宋体; color: black;">insert into pos_info values('001',0);</span></p>
<p><span style="font-family: 宋体; color: black;">insert into pos_info values('002',0);</span></p>
<p><span style="font-family: 宋体; color: black;">create table sales</span></p>
<p><span style="font-family: 宋体; color: black;">( sid char(16),</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;sdate date</span></p>
<p><span style="font-family: 宋体; color: black;">)</span></p>
<p><span style="font-family: 宋体; color: black;">--step2</span></p>
<p><span style="font-family: 宋体; color: black;">create or replace procedure proc_i_sales</span></p>
<p><span style="font-family: 宋体; color: black;">(p_pid char)</span></p>
<p><span style="font-family: 宋体; color: black;">is</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;v_pnum
pos_info.pnum%type;</span></p>
<p><span style="font-family: 宋体; color: black;">begin</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;select pnum
into v_pnum</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;from
pos_info where pid = p_pid;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;insert into
sales(sid,sdate)</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;values(p_pid || to_char(sysdate,'YYYYMMDD')</span></p>
<p><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>|| lpad(v_pnum + 1,5,'0'),sysdate);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;update
pos_info</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;set pnum =
pnum + 1</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;where pid =
p_pid;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;commit;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-family: 宋体; color: black;">end;</span></p>
<p><span style="font-family: 宋体; color: red;">--demo5</span></p>
<p><span style="font-family: 宋体; color: black;">create or replace procedure proc_getnum</span></p>
<p><span style="font-family: 宋体; color: black;">( p_pid in pos_info.pid%type,</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;p_pnum out
pos_info.pnum%type</span></p>
<p><span style="font-family: 宋体; color: black;">)</span></p>
<p><span style="font-family: 宋体; color: black;">is</span></p>
<p><span style="font-family: 宋体; color: black;">begin</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;select pnum
into p_pnum</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;from
pos_info where pid = p_pid;</span></p>
<p><span style="font-family: 宋体; color: black;">end;</span></p>
<p><span style="font-family: 宋体; color: black;">create or replace procedure proc_new_sales</span></p>
<p><span style="font-family: 宋体; color: black;">(p_pid char)</span></p>
<p><span style="font-family: 宋体; color: black;">is</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;v_pnum
pos_info.pnum%type;</span></p>
<p><span style="font-family: 宋体; color: black;">begin</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;proc_getnum(p_pid,v_pnum);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;insert into
sales(sid,sdate)</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;values(p_pid || to_char(sysdate,'YYYYMMDD')</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| lpad(v_pnum + 1,5,'0'),sysdate);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;update
pos_info</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;set pnum =
pnum + 1</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;where pid =
p_pid;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;commit;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-family: 宋体; color: black;">end;</span></p>
<p><span style="font-family: 宋体; color: red;">--demo6</span></p>
<p><span style="font-family: 宋体; color: black;">create or replace function fun_empsal</span></p>
<p><span style="font-family: 宋体; color: black;">( p_empno emp.empno%type)</span></p>
<p><span style="font-family: 宋体; color: black;">return varchar2</span></p>
<p><span style="font-family: 宋体; color: black;">is</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;v_emp
emp%rowtype;</span></p>
<p><span style="font-family: 宋体; color: black;">begin</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;select *
into v_emp</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;from emp
where empno = p_empno;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;if
v_emp.sal &gt;= 3000 then </span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; return
'OK';</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;else</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; return
'NO';&nbsp;&nbsp; </span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;end
if;&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;</span></p>
<p><span style="font-family: 宋体; color: black;">end;</span></p>
<p><span style="font-family: 宋体; color: red;">--demo7</span></p>
<p><span style="font-family: 宋体; color: black;">--</span><span style="font-family: 宋体; color: black;">创建在dept表中插入和删除一个记录的数据包，它且有一个函数(返回插入或删除的部门名称)和两个过程。然后调用包。</span></p>
<p><span style="font-family: 宋体; color: black;">CREATE OR REPLACE PACKAGE deptpack</span></p>
<p><span style="font-family: 宋体; color: black;">AS</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;PROCEDURE
inser(dno IN NUMBER,NAME IN VARCHAR2,location IN VARCHAR2);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;PROCEDURE
de(dno IN NUMBER);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;FUNCTION
getdname(num IN NUMBER) RETURN VARCHAR2;</span></p>
<p><span style="font-family: 宋体; color: black;">END deptpack;</span></p>
<p><span style="font-family: 宋体; color: black;">CREATE OR REPLACE PACKAGE BODY deptpack </span></p>
<p><span style="font-family: 宋体; color: black;">AS</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;PROCEDURE
inser(dno IN NUMBER,NAME IN VARCHAR2,location IN VARCHAR2)</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;AS</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;BEGIN</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; INSERT
INTO dept VALUES(dno,NAME,location);</span></p>
<p><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('1 record inserted!');</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;END inser;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;PROCEDURE
de(dno IN NUMBER)</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;AS</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;BEGIN</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; DELETE
FROM dept WHERE deptno=dno;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;END de;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;FUNCTION
getdname(num IN NUMBER)</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;RETURN
VARCHAR2</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;AS</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; vname
VARCHAR2(10);</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;BEGIN</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; SELECT
dname INTO vname FROM dept WHERE deptno=num;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; RETURN
vname;</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;EXCEPTION</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; WHEN
no_data_found THEN</span></p>
<p><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('No such deptno exists!');</span></p>
<p><span style="font-family: 宋体; color: black;">&nbsp;END
getdname;</span></p>
<p><span style="font-family: 宋体; color: black;">END deptpack;</span></p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:30 <a href="http://www.blogjava.net/kissyan4916/articles/254943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游标</title><link>http://www.blogjava.net/kissyan4916/articles/254942.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:29:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254942.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254942.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254942.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C07%5Cclip_filelist.xml" />
<p><span style="color: red;">--demo1</span>(<span style="font-family: 宋体;">游标基本使用方法</span>)</p>
<p>declare </p>
<p>&nbsp;v_emp emp%rowtype;</p>
<p>&nbsp;--<span style="font-family: 宋体;">申明游标</span></p>
<p>&nbsp;cursor c_emp is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from emp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>begin</p>
<p>&nbsp;--<span style="font-family: 宋体;">打开游标</span></p>
<p><span>&nbsp;if
not c_emp%isopen then</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>open c_emp;</span></p>
<p><span>&nbsp;end
if; </span></p>
<p>&nbsp;--<span style="font-family: 宋体;">遍历游标</span></p>
<p>&nbsp;loop </p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>fetch c_emp into v_emp;</span></p>
<p>--<span style="font-family: 宋体;">将下面这条</span>exit<span style="font-family: 宋体;">语句放在</span>end loop<span style="font-family: 宋体;">之上会使最后一条数据出现两次</span></p>
<p><span>&nbsp;&nbsp;&nbsp; exit
when c_emp%notfound;&nbsp;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('no: ' || v_emp.empno);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('name: ' || v_emp.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('job: ' || v_emp.job);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('sal: ' || v_emp.sal);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('*****************************');</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;--<span style="font-family: 宋体;">关闭游标</span></p>
<p>&nbsp;close c_emp;</p>
<p>end;</p>
<p>--<span style="font-family: 宋体;">游标属性</span></p>
<p>-- <span style="font-family: 宋体;">显式游标属性</span> cursor_name%found&nbsp;cursor_name%notfound&nbsp;</p>
<p>--<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor_name%isopen
cursor_name%rowcount</span></p>
<p>-- <span style="font-family: 宋体;">隐式游标属性</span> sql%found sql%notfound&nbsp;sql%rowcount </p>
<p><span style="color: red;">--demo2(</span><span style="font-family: 宋体; color: red;">变量绑定</span><span style="color: red;">)</span></p>
<p>declare </p>
<p>&nbsp;v_deptno emp.deptno%type;</p>
<p>&nbsp;v_emp emp%rowtype;</p>
<p>&nbsp;--<span style="font-family: 宋体;">变量绑定</span>/<span style="font-family: 宋体;">申明游标</span></p>
<p>&nbsp;cursor c_emp is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from emp where deptno = v_deptno;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>begin</p>
<p>&nbsp;v_deptno := 10;</p>
<p>&nbsp;--v_deptno := &amp;deptno;</p>
<p>&nbsp;--<span style="font-family: 宋体;">打开游标</span></p>
<p><span>&nbsp;if
not c_emp%isopen then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>open c_emp;</span></p>
<p><span>&nbsp;end
if; </span></p>
<p>&nbsp;--<span style="font-family: 宋体;">遍历游标</span></p>
<p>&nbsp;loop </p>
<p><span>&nbsp;&nbsp;&nbsp; fetch
c_emp into v_emp;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>exit when c_emp%notfound;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('no: ' || v_emp.empno);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('name: ' || v_emp.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('job: ' || v_emp.job);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('sal: ' || v_emp.sal);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('*****************************');</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;--<span style="font-family: 宋体;">关闭游标</span></p>
<p>&nbsp;close c_emp;</p>
<p>end;</p>
<p><span style="color: red;">--demo3(</span><span style="font-family: 宋体; color: red;">参数化游标</span><span style="color: red;">)</span></p>
<p>declare </p>
<p>&nbsp;v_emp emp%rowtype;</p>
<p>&nbsp;--<span style="font-family: 宋体;">变量绑定</span>/<span style="font-family: 宋体;">申明游标</span></p>
<p>&nbsp;cursor c_emp(p_deptno emp.deptno%type) is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from emp where deptno = p_deptno;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>begin</p>
<p>&nbsp;&nbsp;--<span style="font-family: 宋体;">打开游标</span></p>
<p><span>&nbsp;if
not c_emp%isopen then</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>open c_emp(10);</span></p>
<p>&nbsp;&nbsp;end if; </p>
<p>&nbsp;--<span style="font-family: 宋体;">遍历游标</span></p>
<p>&nbsp;loop </p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>fetch c_emp into v_emp;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>exit when c_emp%notfound;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('no: ' || v_emp.empno);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('name: ' || v_emp.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('job: ' || v_emp.job);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('sal: ' || v_emp.sal);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('*****************************');</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;--<span style="font-family: 宋体;">关闭游标</span></p>
<p>&nbsp;close c_emp;</p>
<p>end;</p>
<p><span style="color: red;">--</span><span style="font-family: 宋体; color: red;">游标检索循环</span></p>
<p><span style="color: red;">--demo1(loop)</span></p>
<p>declare </p>
<p>&nbsp;v_emp emp%rowtype;</p>
<p>&nbsp;--<span style="font-family: 宋体;">申明游标</span></p>
<p>&nbsp;cursor c_emp is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from emp where deptno = 20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>begin</p>
<p>&nbsp;--<span style="font-family: 宋体;">打开游标</span></p>
<p><span>&nbsp;if
not c_emp%isopen then</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>open c_emp;</span></p>
<p><span>&nbsp;end
if; </span></p>
<p>&nbsp;--<span style="font-family: 宋体;">遍历游标</span></p>
<p>&nbsp;loop </p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>fetch c_emp into v_emp;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>exit when c_emp%notfound;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('no: ' || v_emp.empno);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('name: ' || v_emp.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('job: ' || v_emp.job);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('sal: ' || v_emp.sal);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('*****************************');</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;--<span style="font-family: 宋体;">关闭游标</span></p>
<p>&nbsp;close c_emp;</p>
<p>end;</p>
<p><span style="color: red;">--demo2(while)</span></p>
<p>declare </p>
<p>&nbsp;v_emp emp%rowtype;</p>
<p>&nbsp;--<span style="font-family: 宋体;">申明游标</span></p>
<p>&nbsp;cursor c_emp is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from emp where deptno = 20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>begin</p>
<p>&nbsp;--<span style="font-family: 宋体;">打开游标</span></p>
<p><span>&nbsp;if
not c_emp%isopen then</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>open c_emp;</span></p>
<p><span>&nbsp;end
if; </span></p>
<p>&nbsp;--<span style="font-family: 宋体;">遍历游标</span></p>
<p>&nbsp;while c_emp%found loop </p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('no: ' || v_emp.empno);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('name: ' || v_emp.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('job: ' || v_emp.job);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('sal: ' || v_emp.sal);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('*****************************');</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>fetch c_emp into v_emp; </span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;--<span style="font-family: 宋体;">关闭游标</span></p>
<p>&nbsp;close c_emp;</p>
<p>end;</p>
<p><span style="color: red;">--demo3-1(for)</span></p>
<p>declare </p>
<p>&nbsp;--<span style="font-family: 宋体;">申明游标</span></p>
<p>&nbsp;cursor c_emp is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from emp where deptno = 20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>begin</p>
<p>&nbsp;--<span style="font-family: 宋体;">遍历游标</span></p>
<p><span>&nbsp;for
v_emp in c_emp loop</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('no: ' || v_emp.empno);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('name: ' || v_emp.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('job: ' || v_emp.job);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('sal: ' || v_emp.sal);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('*****************************');</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>end;</p>
<p><span style="color: red;">--demo3-2(for)</span></p>
<p>begin</p>
<p>&nbsp;--<span style="font-family: 宋体;">遍历游标</span></p>
<p><span>&nbsp;for
v_emp in (select * </span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from emp </p>
<p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where deptno = 20) loop</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('no: ' || v_emp.empno);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('name: ' || v_emp.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('job: ' || v_emp.job);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('sal: ' || v_emp.sal);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('*****************************');</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>end;</p>
<p>--<span style="font-family: 宋体;">游标嵌套</span></p>
<p>declare</p>
<p>&nbsp;v_deptinfo dept%rowtype;</p>
<p>&nbsp;v_empinfo emp%rowtype;</p>
<p>&nbsp;type c_dept is ref cursor;</p>
<p>&nbsp;v_dept c_dept;</p>
<p>&nbsp;type c_emp is ref cursor;</p>
<p>&nbsp;v_emp c_emp;</p>
<p>begin</p>
<p>&nbsp;open v_dept for </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from dept;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></p>
<p>&nbsp;loop</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>fetch v_dept into v_deptinfo;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>exit when v_dept%notfound;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('deptno: ' || v_deptinfo.deptno </span></p>
<p><span>&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; || 'deptname: ' ||
v_deptinfo.dname);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>open v_emp for </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>select * from emp where deptno = v_deptinfo.deptno;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>loop</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>fetch v_emp into v_empinfo;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>exit when v_emp%notfound;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>dbms_output.put_line('empno: ' || v_empinfo.empno </span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || 'ename: ' ||
v_empinfo.ename);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>end loop;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>close v_emp;</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;close v_dept;</p>
<p>end;</p>
<p>--select for update<span style="font-family: 宋体;">游标</span></p>
<p><span style="color: red;">--demo</span></p>
<p>declare </p>
<p>&nbsp;v_emp emp%rowtype;</p>
<p>&nbsp;cursor c_emp is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>select * from emp</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>for update of sal,comm;</span></p>
<p>/*&nbsp;cursor c_emp is</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>select * from emp</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>for update;*/</span></p>
<p>begin</p>
<p><span>&nbsp;if
not c_emp%isopen then</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>open c_emp;</span></p>
<p><span>&nbsp;end
if; </span></p>
<p>&nbsp;loop</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>fetch c_emp into v_emp;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>exit when c_emp%notfound;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>update emp set sal = sal - 1000</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>where current of c_emp;</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;commit;</p>
<p>&nbsp;close c_emp;</p>
<p>end;</p>
<p><span style="color: red;">--</span><span style="font-family: 宋体; color: red;">动态</span><span style="color: red;">SQL</span></p>
<p>--demo</p>
<p>create or replace procedure proc_execsql</p>
<p>is</p>
<p>&nbsp;sql_str varchar2(1000);</p>
<p>begin</p>
<p>&nbsp;sql_str := 'create table bak_emp as select * from emp';</p>
<p>&nbsp;execute immediate sql_str;</p>
<p>end;</p>
<p>begin</p>
<p>&nbsp;proc_execsql;</p>
<p>end;</p>
<p>grant create any table to scott;</p>
<p><span style="color: red;">--demo</span></p>
<p>create or replace procedure proc_execsql</p>
<p>is</p>
<p>&nbsp;sql_str varchar2(1000);</p>
<p>begin</p>
<p><span>&nbsp;for
v_table in (select table_name from user_tables) loop</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>sql_str := 'create table bak_'||v_table.table_name </span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || ' as select * from ' ||
v_table.table_name;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>execute immediate sql_str;</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>end;</p>
<p>begin</p>
<p>&nbsp;proc_execsql;</p>
<p>end;</p>
<p><span style="color: red;">--demo</span></p>
<p><span>create or replace procedure proc_createproc
</span></p>
<p>(p_table varchar2)</p>
<p>is</p>
<p>&nbsp;p_sql_str varchar2(1000) := '';</p>
<p>&nbsp;tl_sql_str varchar2(1000) := '';</p>
<p>&nbsp;iv_sql_str varchar2(1000) := '';</p>
<p>&nbsp;sql_str varchar2(1000) := '';</p>
<p>begin</p>
<p><span>&nbsp;for
v_table in ( select COLUMN_NAME </span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from user_tab_columns</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where TABLE_NAME = p_table)
loop</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>p_sql_str := p_sql_str || 'p_' || v_table.COLUMN_NAME ||' '</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || p_table ||'.' ||
v_table.COLUMN_NAME</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || '%type,';</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>tl_sql_str := tl_sql_str || v_table.COLUMN_NAME ||',';</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>iv_sql_str := iv_sql_str || 'p_'||v_table.COLUMN_NAME || ',';</span></p>
<p><span>&nbsp;end
loop;</span></p>
<p>&nbsp;p_sql_str := substr(p_sql_str,1,length(p_sql_str)-1);</p>
<p>&nbsp;tl_sql_str := substr(tl_sql_str,1,length(tl_sql_str)-1);</p>
<p><span>&nbsp;iv_sql_str
:= substr(iv_sql_str,1,length(iv_sql_str)-1);</span></p>
<p>&nbsp;sql_str := 'create or replace procedure proc_i_' || p_table</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || '(' || p_sql_str || ')'</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || 'is '</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || 'begin '</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || '&nbsp;insert into ' || p_table || '(' || tl_sql_str
|| ')'</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || '&nbsp;values(' || iv_sql_str || '); '</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || 'end;';</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></p>
<p>&nbsp;dbms_output.put_line(sql_str); </p>
<p>&nbsp;execute immediate sql_str;</p>
<p>end;</p>
<p>grant create any procedure to scott;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:29 <a href="http://www.blogjava.net/kissyan4916/articles/254942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>