⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第六章 pl-sql与oracle间交互 - pl-sql用户指南与参考 - whatiswhat.htm

📁 sql初学者不错的教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap>sequence_name.<STRONG>CURRVAL</STRONG><BR>sequence_name.<STRONG>NEXTVAL</STRONG> 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>创建序列后,我们就可以在事务处理中用它产生唯一的顺序编号了。但是,我们只能在用SELECT列表、VALUES子句和SET子句中使用CURRVAL和NEXTVAL。在下面的例子中,我们使用序列向两个数据表中插入相同的雇员编号:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>INSERT</STRONG>&nbsp;<STRONG>INTO</STRONG>&nbsp;emp&nbsp;<STRONG>VALUES</STRONG>&nbsp;(empno_seq.<STRONG>NEXTVAL</STRONG>,&nbsp;my_ename,&nbsp;...);<BR><STRONG>INSERT</STRONG>&nbsp;<STRONG>INTO</STRONG>&nbsp;sals&nbsp;<STRONG>VALUES</STRONG>&nbsp;(empno_seq.<STRONG>CURRVAL</STRONG>,&nbsp;my_sal,&nbsp;...); 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>在事务中调用NEXTVAL时,序列的值会立即发生改变,不管我们是否使用提交或回滚语句。 </P>
                        <UL>
                          <LI>LEVEL </LI></UL>
                        <P>我们可以用LEVEL配合SELECT CONNECT 
                        BY语句把数据表中的行组织成一个树形结构。LEVEL能返回树形结构中节点的级数。根节点的级数是1,根节点的子节点级数是2,孙子节点级数是3,依次类推。</P>
                        <P>在START 
                        WITH子句中,我们指定辨识根节点的条件。我们可以使用PRIOR操作符指定树的遍历方向(从根向下或从枝干向上)。 
                        </P>
                        <UL>
                          <LI>ROWID </LI></UL>
                        <P>ROWID能够返回数据表中行的ROWID(二进制地址)。我们可以使用UROWID类型变量来存放具有可读性的ROWID,下例中,我们声明了一个名为row_id的变量:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;row_id&nbsp;UROWID; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>当我们把物理rowid放到UROWID变量中时,就要使用函数ROWIDTOCHAR,它能把二进制值转成一个长度为18字节的字符串。然后我们就可以在UPDATE或DELETE语句的WHERE子句中,把UROWID变量的值同ROWID伪列值进行比较并找出从游标中取得的最新行。 
                        </P>
                        <UL>
                          <LI>ROWNUM </LI></UL>
                        <P>ROWNUM能够返回从数据表中选出的行的标识。被选取的第一行的ROWNUM是1,第二行是2,依次类推。如果SELECT语句包含一个ORDER 
                        BY子句,ROWNUM会在排序操作之前被指定。</P>
                        <P>我们可以在UPDATE语句中用ROWNUM为每一行数据赋上一个唯一的值。同样,也可以在SELECT语句的WHERE子句中用ROWNUM限定选取的行的个数,如下例:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;<STRONG>CURSOR</STRONG>&nbsp;c1&nbsp;<STRONG>IS</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>SELECT</STRONG>&nbsp;empno,&nbsp;sal<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>FROM</STRONG>&nbsp;emp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>WHERE</STRONG>&nbsp;sal&nbsp;&gt;&nbsp;2000&nbsp;<STRONG>AND</STRONG>&nbsp;<STRONG>ROWNUM</STRONG>&nbsp;&lt;=&nbsp;10;&nbsp;&nbsp;&nbsp;<EM>--&nbsp;returns&nbsp;10&nbsp;rows</EM> 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>ROWNUM的值只是在行被检索出来的时候才会增长,所以,只有在WHERE子句中的ROWNUM才有意义:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap>...&nbsp;<STRONG>WHERE</STRONG>&nbsp;<STRONG>ROWNUM</STRONG>&nbsp;&lt;&nbsp;constant;<BR>...&nbsp;<STRONG>WHERE</STRONG>&nbsp;<STRONG>ROWNUM</STRONG>&nbsp;&lt;=&nbsp;constant; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P class=title2>5、SQL操作符</P>
                        <P>PL/SQL能让我们在SQL语句中使用所有的SQL比较操作符、集合操作符和行操作符。这里简要描述一下其中几个操作符的功能。 
                        </P>
                        <UL>
                          <LI>比较操作符 </LI></UL>
                        <P>我们常常需要在一个数据操作语句的WHERE子句中使用比较操作符来判断一个表达式的值是TRUE、FALSE还是NULL。下面的表格描述了各个操作符的用途: 
                        </P>
                        <TABLE id=table-list>
                          <TBODY>
                          <TR>
                            <TH id=table-list-head>操作符</TH>
                            <TH id=table-list-head>描述</TH></TR>
                          <TR>
                            <TD vAlign=top>ALL</TD>
                            <TD>把同一个列表中的一个值与其他值或是子查询返回的值进行比较,如果所有的比较结果都为TRUE,那么结果值就为TRUE。</TD></TR>
                          <TR>
                            <TD vAlign=top noWrap>ANY, SOME</TD>
                            <TD>把同一个列表中的一个值与其它值或是子查询返回的值进行比较,只要其中有一个结果值为TRUE,那么结果值就为TRUE。</TD></TR>
                          <TR>
                            <TD>BETWEEN</TD>
                            <TD>测试一个值是否在指定的区间范围内。</TD></TR>
                          <TR>
                            <TD>EXISTS</TD>
                            <TD>如果子查询至少返回一行数据,那么EXISTS的结果就为TRUE。</TD></TR>
                          <TR>
                            <TD>IN</TD>
                            <TD>测试指定的值是否是集合成员。</TD></TR>
                          <TR>
                            <TD>IS</TD>
                            <TD>测试指定的值是否是NULL。</TD></TR>
                          <TR>
                            <TD>LIKE</TD>
                            <TD>测试一个字符串是否满足一个指定的样式,其中包含通配符。</TD></TR></TBODY></TABLE>
                        <UL>
                          <LI>集合操作符 </LI></UL>
                        <P>集合操作符的作用是把两个查询的结果合并成一个结果。INTERSECT返回两个结果的交集;MINUS把目标结果集与另外一个结果集比较,并把存在于另一个结果集中的记录从目标结果集中去除,然后返回目标结果集;UNION把两个结果集的内容合并,在有重复项的情况下,只保留其中一项;UNION 
                        ALL同UNION的作用类似,但它会保留所有记录,不管是否有相同的记录。 </P>
                        <UL>
                          <LI>行操作符 </LI></UL>
                        <P>行操作符能返回或引用特定的行。ALL会保留查询或聚合表达式中的重复行;DISTINCT的作用与ALL相反,用于消除重复行;PRIOR能引用树形查询中返回的当前行的父级行。 
                        </P>
                        <P class=title1>二、管理游标</P>
                        <P>PL/SQL有两种类型的游标:隐式游标和显式游标。PL/SQL为所有的SQL数据操作语句都声明了一个隐式的游标,其中也包括只返回一条记录的查询。但是,对于返回多于一条记录的查询来说,我们必须声明显式的游标,然后使用游标FOR循环或使用BULK 
                        COLLECT子句。 </P>
                        <P class=title2>1、显式游标一览</P>
                        <P>查询返回的行集合可能是由零行、一行或多行组成,这个结果取决于我们的检索条件。当一个查询返回多行记录时,我们可以显式地声明一个游标来处理每一行数据。游标的声明可以放到PL/SQL块、子程序或包的声明部分。</P>
                        <P>我们可以使用三种命令来控制游标:OPEN、FETCH和CLOSE。首先用OPEN语句初始化一个游标,然后重复执行FETCH语句取出已检索到的数据,或是使用BULK 
                        COLLECT批量选取数据。当处理完结果集中最后一行数据时,就可以用CLOSE语句关闭游标。我们还可以同时打开多个游标并发处理多个查询操作。 
                        </P>
                        <UL>
                          <LI>声明游标 </LI></UL>
                        <P>在PL/SQL中,向前引用是不允许的。所以我们必须在其它语句引用游标之前声明它。声明游标时,我们需要为它命名,并用下面的语法把它和一个查询相关联: 
                        </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>CURSOR</STRONG>&nbsp;cursor_name&nbsp;[(parameter[,&nbsp;parameter]...)]<BR>&nbsp;&nbsp;[<STRONG>RETURN</STRONG>&nbsp;return_type]&nbsp;<STRONG>IS</STRONG>&nbsp;select_statement; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>return_type必须是记录或是数据表的行类型,parameter的含义如下:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap>cursor_parameter_name&nbsp;[<STRONG>IN</STRONG>]&nbsp;datatype&nbsp;[{:=&nbsp;|&nbsp;<STRONG>DEFAULT</STRONG>}&nbsp;expression] 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>例如,我们可以像下面这样声明游标c1和c2:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;<STRONG>CURSOR</STRONG>&nbsp;c1&nbsp;<STRONG>IS</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>SELECT</STRONG>&nbsp;empno,&nbsp;ename,&nbsp;job,&nbsp;sal<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>FROM</STRONG>&nbsp;emp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>WHERE</STRONG>&nbsp;sal&nbsp;&gt;&nbsp;2000;<BR><BR>&nbsp;&nbsp;<STRONG>CURSOR</STRONG>&nbsp;c2&nbsp;<STRONG>RETURN</STRONG>&nbsp;dept%<STRONG>ROWTYPE</STRONG>&nbsp;<STRONG>IS</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>SELECT</STRONG>&nbsp;*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>FROM</STRONG>&nbsp;dept<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>WHERE</STRONG>&nbsp;deptno&nbsp;=&nbsp;10; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>游标名是一个未声明的标识符,而不是PL/SQL变量名。我们不能把值赋给游标名或是在一个表达式中使用它。但是,游标和变量有着同样的作用域规则。虽然在数据表为游标命名是允许的,但并不推荐这样做。 
                        </P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -