📄 第六章 pl-sql与oracle间交互 - pl-sql用户指南与参考 - whatiswhat.htm
字号:
<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> <STRONG>INTO</STRONG> emp <STRONG>VALUES</STRONG> (empno_seq.<STRONG>NEXTVAL</STRONG>, my_ename, ...);<BR><STRONG>INSERT</STRONG> <STRONG>INTO</STRONG> sals <STRONG>VALUES</STRONG> (empno_seq.<STRONG>CURRVAL</STRONG>, my_sal, ...);
</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> row_id 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> <STRONG>CURSOR</STRONG> c1 <STRONG>IS</STRONG><BR> <STRONG>SELECT</STRONG> empno, sal<BR> <STRONG>FROM</STRONG> emp<BR> <STRONG>WHERE</STRONG> sal > 2000 <STRONG>AND</STRONG> <STRONG>ROWNUM</STRONG> <= 10; <EM>-- returns 10 rows</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>ROWNUM的值只是在行被检索出来的时候才会增长,所以,只有在WHERE子句中的ROWNUM才有意义:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>... <STRONG>WHERE</STRONG> <STRONG>ROWNUM</STRONG> < constant;<BR>... <STRONG>WHERE</STRONG> <STRONG>ROWNUM</STRONG> <= 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> cursor_name [(parameter[, parameter]...)]<BR> [<STRONG>RETURN</STRONG> return_type] <STRONG>IS</STRONG> select_statement;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>return_type必须是记录或是数据表的行类型,parameter的含义如下:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>cursor_parameter_name [<STRONG>IN</STRONG>] datatype [{:= | <STRONG>DEFAULT</STRONG>} expression]
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>例如,我们可以像下面这样声明游标c1和c2:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>CURSOR</STRONG> c1 <STRONG>IS</STRONG><BR> <STRONG>SELECT</STRONG> empno, ename, job, sal<BR> <STRONG>FROM</STRONG> emp<BR> <STRONG>WHERE</STRONG> sal > 2000;<BR><BR> <STRONG>CURSOR</STRONG> c2 <STRONG>RETURN</STRONG> dept%<STRONG>ROWTYPE</STRONG> <STRONG>IS</STRONG><BR> <STRONG>SELECT</STRONG> *<BR> <STRONG>FROM</STRONG> dept<BR> <STRONG>WHERE</STRONG> deptno = 10;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>游标名是一个未声明的标识符,而不是PL/SQL变量名。我们不能把值赋给游标名或是在一个表达式中使用它。但是,游标和变量有着同样的作用域规则。虽然在数据表为游标命名是允许的,但并不推荐这样做。
</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -