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

📄 第十一章 本地动态sql - pl-sql用户指南与参考 - whatiswhat.htm

📁 sql初学者不错的教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;dynamic_string<BR>[<STRONG>INTO</STRONG>&nbsp;{define_variable[,&nbsp;define_variable]...&nbsp;|&nbsp;record}]<BR>[USING&nbsp;[<STRONG>IN</STRONG>&nbsp;|&nbsp;<STRONG>OUT</STRONG>&nbsp;|&nbsp;<STRONG>IN</STRONG>&nbsp;<STRONG>OUT</STRONG>]&nbsp;bind_argument<BR>&nbsp;&nbsp;&nbsp;&nbsp;[,&nbsp;[<STRONG>IN</STRONG>&nbsp;|&nbsp;<STRONG>OUT</STRONG>&nbsp;|&nbsp;<STRONG>IN</STRONG>&nbsp;<STRONG>OUT</STRONG>]&nbsp;bind_argument]...]<BR>[{RETURNING&nbsp;|&nbsp;<STRONG>RETURN</STRONG>}&nbsp;<STRONG>INTO</STRONG>&nbsp;bind_argument[,&nbsp;bind_argument]...]; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>dynamic_string是代表一条SQL语句或一个PL/SQL块的字符串表达式,define_variable是用于存放被选出的字段值的变量,record是用户定义或%ROWTYPE类型的记录,用来存放被选出的行记录。输入bind_argument参数是一个表达式,它的值将被传入(IN模式)或传出(OUT模式)或先传入再传出(IN 
                        OUT模式)到动态SQL语句或是PL/SQL块中。一个输出bind_argument参数就是一个能保存动态SQL返回值的变量。</P>
                        <P>除了多行查询外,动态字符串可以包含任何SQL语句(不含终结符)或PL/SQL块(含终结符)。字符串中可以包括用于参数绑定的占位符。但是,不可以使用绑定参数为动态SQL传递模式对象。 
                        </P>
                        <P>在用于单行查询时,INTO子句要指明用于存放检索值的变量或记录。对于查询检索出来的每一个值,INTO子句中都必须有一个与之对应的、类型兼容的变量或字段。在用于DML操作时,RETURNING 
                        INTO子句要指明用于存放返回值的变量或记录。对于DML语句返回的每一个值,INTO子句中都必须有一个与之对应的、类型兼容的变量或字段。 
                        </P>
                        <P>我们可以把所有的绑定参数放到USING子句中。默认的参数模式是IN。对于含有RETURNING子句的DML语句来说,我们可以把OUT参数放到RETURNING 
                        INTO之后,并且不用指定它们的参数模式,因为默认就是OUT。如果我们既使用了USING又使用RETURNING 
                        INTO,那么,USING子句中就只能包含IN模式的参数了。 </P>
                        <P>运行时,动态字符串中的绑定参数会替换相对应的占位符。所以,每个占位符必须与USING子句和/或RETURNING 
                        INTO子句中的一个绑定参数对应。我们可以使用数字、字符和字符串作为绑定参数,但不能使用布尔类型(TRUE,FALSE和NULL)。要把空值传递给动态字符串,我们就必须使用工作区。 
                        </P>
                        <P>动态SQL支持所有的SQL类型。所以,定义变量和绑定变量都可以是集合、LOB,对象类型实例和引用。作为一项规则,动态SQL是不支持PL/SQL特有的类型的。这样,它就不能使用布尔型或索引表。 
                        </P>
                        <P>我们可以重复为绑定变量指定新值执行动态SQL语句。但是,每次都会消耗很多资源,因为EXECUTE 
                        IMMEDIATE在每次执行之前都需要对动态字符串进行预处理。 </P>
                        <P class=title2>1、动态SQL实例</P>
                        <P>下面的PL/SQL块包含了几个动态SQL的例子: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(200);<BR>&nbsp;&nbsp;plsql_block&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(500);<BR>&nbsp;&nbsp;emp_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>(4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;7566;<BR>&nbsp;&nbsp;salary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>(7,&nbsp;2);<BR>&nbsp;&nbsp;dept_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;50;<BR>&nbsp;&nbsp;dept_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(14)&nbsp;&nbsp;:=&nbsp;<EM>'PERSONNEL'</EM>;<BR>&nbsp;&nbsp;LOCATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(13)&nbsp;&nbsp;:=&nbsp;<EM>'DALLAS'</EM>;<BR>&nbsp;&nbsp;emp_rec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp%<STRONG>ROWTYPE</STRONG>;<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;<EM>'CREATE&nbsp;TABLE&nbsp;bonus&nbsp;(id&nbsp;NUMBER,&nbsp;amt&nbsp;NUMBER)'</EM>;<BR><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;<EM>'INSERT&nbsp;INTO&nbsp;dept&nbsp;VALUES&nbsp;(:1,&nbsp;:2,&nbsp;:3)'</EM>;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;sql_stmt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;dept_id,&nbsp;dept_name,&nbsp;LOCATION;<BR><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;<EM>'SELECT&nbsp;*&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;empno&nbsp;=&nbsp;:id'</EM>;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;sql_stmt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>INTO</STRONG>&nbsp;emp_rec<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;emp_id;<BR><BR>&nbsp;&nbsp;plsql_block&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;<EM>'BEGIN&nbsp;emp_pkg.raise_salary(:id,&nbsp;:amt);&nbsp;END;'</EM>;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;plsql_block<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;7788,&nbsp;500;<BR><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<EM>'UPDATE&nbsp;emp&nbsp;SET&nbsp;sal&nbsp;=&nbsp;2000&nbsp;WHERE&nbsp;empno&nbsp;=&nbsp;:1&nbsp;RETURNING&nbsp;sal&nbsp;INTO&nbsp;:2'</EM>;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;sql_stmt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;emp_id<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURNING&nbsp;<STRONG>INTO</STRONG>&nbsp;salary;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;<EM>'DELETE&nbsp;FROM&nbsp;dept&nbsp;WHERE&nbsp;deptno&nbsp;=&nbsp;:num'</EM><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;dept_id;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;<EM>'ALTER&nbsp;SESSION&nbsp;SET&nbsp;SQL_TRACE&nbsp;TRUE'</EM>;<BR><STRONG>END</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>下例中,过程接受一个数据表名(如"emp")和一个可选的WHERE子句(如"sal &gt; 
                        2000")。如果我们没有提供WHERE条件,程序会删除指定表中所有的行,否则就会按照给定的条件删除行: 
</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>CREATE</STRONG>&nbsp;<STRONG>PROCEDURE</STRONG>&nbsp;delete_rows(<BR>&nbsp;&nbsp;table_name&nbsp;&nbsp;&nbsp;<STRONG>IN</STRONG>&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>,<BR>&nbsp;&nbsp;condition&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>IN</STRONG>&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>&nbsp;<STRONG>DEFAULT</STRONG>&nbsp;<STRONG>NULL</STRONG><BR>)&nbsp;<STRONG>AS</STRONG><BR>&nbsp;&nbsp;where_clause&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(100)&nbsp;:=&nbsp;<EM>'&nbsp;<STRONG>WHERE</STRONG>&nbsp;'</EM>&nbsp;||&nbsp;condition;<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;<STRONG>IF</STRONG>&nbsp;condition&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>NULL</STRONG>&nbsp;<STRONG>THEN</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;where_clause&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;<STRONG>NULL</STRONG>;<BR>&nbsp;&nbsp;<STRONG>END</STRONG>&nbsp;<STRONG>IF</STRONG>;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;<EM>'<STRONG>DELETE</STRONG>&nbsp;<STRONG>FROM</STRONG>&nbsp;'</EM>&nbsp;||&nbsp;table_name&nbsp;||&nbsp;where_clause;<BR><STRONG>EXCEPTION</STRONG><BR>&nbsp;&nbsp;...<BR><STRONG>END</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P class=title2>2、USING子句的向后兼容</P>
                        <P>当动态INSERT、UPDATE或DELETE语句有一个RETURNING子句时,输出绑定参数可以放到RETURNING 
                        INTO或USING子句的后面。XXXXXXXXXX在新的应用程序中要使用RETURNING 
                        INTO,而旧的应用程序可以继续使用USING,如下例: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(200);<BR>&nbsp;&nbsp;my_empno&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>(4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;7902;<BR>&nbsp;&nbsp;my_ename&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(10);<BR>&nbsp;&nbsp;my_job&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(9);<BR>&nbsp;&nbsp;my_sal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>(7,&nbsp;2)&nbsp;&nbsp;:=&nbsp;3250.00;<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;&nbsp;&nbsp;<EM>'UPDATE&nbsp;emp&nbsp;SET&nbsp;sal&nbsp;=&nbsp;:1&nbsp;WHERE&nbsp;empno&nbsp;=&nbsp;:2&nbsp;'</EM><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;<EM>'RETURNING&nbsp;ename,&nbsp;job&nbsp;INTO&nbsp;:3,&nbsp;:4'</EM>;<BR><BR>&nbsp;&nbsp;<EM>/*&nbsp;Bind&nbsp;returned&nbsp;values&nbsp;through&nbsp;USING&nbsp;clause.&nbsp;*/</EM><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;sql_stmt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;my_sal,&nbsp;my_empno,&nbsp;<STRONG>OUT</STRONG>&nbsp;my_ename,&nbsp;<STRONG>OUT</STRONG>&nbsp;my_job;<BR><BR>&nbsp;&nbsp;<EM>/*&nbsp;Bind&nbsp;returned&nbsp;values&nbsp;through&nbsp;RETURNING&nbsp;<STRONG>INTO</STRONG>&nbsp;clause.&nbsp;*/</EM><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;sql_stmt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;my_sal,&nbsp;my_empno<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURNING&nbsp;<STRONG>INTO</STRONG>&nbsp;my_ename,&nbsp;my_job;<BR>&nbsp;&nbsp;...<BR><STRONG>END</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P class=title2>3、指定参数模式</P>
                        <P>使用USING子句时,我们不需要为输入参数指定模式,因为默认的就是IN;而RETURNING 
                        INTO子句中我们是不可以指定输出参数的模式的,因为定义中它就是OUT模式。看一下下面的例子: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(200);<BR>&nbsp;&nbsp;dept_id&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;30;<BR>&nbsp;&nbsp;old_loc&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(13);<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;sql_stmt&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;<EM>'DELETE&nbsp;FROM&nbsp;dept&nbsp;WHERE&nbsp;deptno&nbsp;=&nbsp;:1&nbsp;RETURNING&nbsp;loc&nbsp;INTO&nbsp;:2'</EM>;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;sql_stmt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;dept_id<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETURNING&nbsp;<STRONG>INTO</STRONG>&nbsp;old_loc;<BR>&nbsp;&nbsp;...<BR><STRONG>END</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>在适当的时候,我们必须为绑定参数指定OUT或IN OUT模式。例如,假定我们想调用下面的过程: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>CREATE</STRONG>&nbsp;<STRONG>PROCEDURE</STRONG>&nbsp;create_dept(<BR>&nbsp;&nbsp;deptno&nbsp;&nbsp;&nbsp;<STRONG>IN</STRONG>&nbsp;<STRONG>OUT</STRONG>&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>,<BR>&nbsp;&nbsp;dname&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>IN</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>,<BR>&nbsp;&nbsp;loc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>IN</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG><BR>)&nbsp;<STRONG>AS</STRONG><BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;<STRONG>SELECT</STRONG>&nbsp;deptno_seq.<STRONG>NEXTVAL</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>INTO</STRONG>&nbsp;deptno<BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>FROM</STRONG>&nbsp;DUAL;<BR><BR>&nbsp;&nbsp;<STRONG>INSERT</STRONG>&nbsp;<STRONG>INTO</STRONG>&nbsp;dept<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VALUES</STRONG>&nbsp;(deptno,&nbsp;dname,&nbsp;loc);<BR><STRONG>END</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>要从动态PL/SQL块调用过程,就必须为与形参关联的绑定参数指定IN OUT模式,如下: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;plsql_block&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(500);<BR>&nbsp;&nbsp;new_deptno&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>(2);<BR>&nbsp;&nbsp;new_dname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(14)&nbsp;&nbsp;:=&nbsp;<EM>'ADVERTISING'</EM>;<BR>&nbsp;&nbsp;new_loc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(13)&nbsp;&nbsp;:=&nbsp;<EM>'NEW&nbsp;YORK'</EM>;<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;plsql_block&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;<EM>'BEGIN&nbsp;create_dept(:a,&nbsp;:b,&nbsp;:c);&nbsp;END;'</EM>;<BR><BR>&nbsp;&nbsp;<STRONG>EXECUTE</STRONG>&nbsp;<STRONG>IMMEDIATE</STRONG>&nbsp;plsql_block<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;<STRONG>IN</STRONG>&nbsp;<STRONG>OUT</STRONG>&nbsp;new_deptno,&nbsp;new_dname,&nbsp;new_loc;<BR><BR>&nbsp;&nbsp;<STRONG>IF</STRONG>&nbsp;new_deptno&nbsp;&gt;&nbsp;90&nbsp;<STRONG>THEN</STRONG>&nbsp;...<BR><STRONG>END</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P class=title1>四、使用OPEN-FOR、FETCH和CLOSE语句</P>
                        <P>我们可以使用三种语句来处理动态多行查询:OPEN-FOR,FETCH和CLOSE。首先,用OPEN打开多行查询的游标变量。然后,用FETCH语句把数据从结果集中取出来。当所有的数据都处理完以后,就可以用CLOSE语句关闭游标变量了。 
                        </P>
                        <P class=title2>1、打开游标变量</P>
                        <P>OPEN-FOR语句可以把游标变量和一个多行查询关联起来,然后执行查询,确定结果集,并把游标放到结果集的第一行,然后把%ROWCOUNT值初始化为零。 
                        </P>
                        <P>与OPEN-FOR的静态形式不同的是,动态形式有一个可选的USING子句。在运行时,USING子句中的绑定变量可以替换动态SELECT语句中相对应的占位符,语法如下: 
                        </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>OPEN</STRONG>&nbsp;{cursor_variable&nbsp;|&nbsp;:host_cursor_variable}&nbsp;<STRONG>FOR</STRONG>&nbsp;dynamic_string<BR>[USING&nbsp;bind_argument[,&nbsp;bind_argument]...]; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>其中,cursor_variable是一个弱类型(没有返回类型)的游标变量,host_cursor_variable是声明在PL/SQL主环境中的游标变量,dynamic_string是字符串表达式,代表一个多行查询。 
                        </P>
                        <P>在下面的例子中,我们声明一个游标变量,并把它和动态SELECT语句关联起来: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;empcurtyp&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>REF</STRONG>&nbsp;<STRONG>CURSOR</STRONG>;&nbsp;&nbsp;&nbsp;<EM>--&nbsp;define&nbsp;weak&nbsp;REF&nbsp;CURSOR&nbsp;type</EM><BR><BR>&nbsp;&nbsp;emp_cv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;empcurtyp;&nbsp;&nbsp;&nbsp;<EM>--&nbsp;declare&nbsp;cursor&nbsp;variable</EM><BR>&nbsp;&nbsp;my_ename&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(15);<BR>&nbsp;&nbsp;my_sal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>NUMBER</STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;1000;<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;<STRONG>OPEN</STRONG>&nbsp;emp_cv&nbsp;<STRONG>FOR</STRONG>&nbsp;&nbsp;&nbsp;<EM>--&nbsp;open&nbsp;cursor&nbsp;variable</EM><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<EM>'SELECT&nbsp;ename,&nbsp;sal&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;sal&nbsp;&gt;&nbsp;:s'</EM>&nbsp;USING&nbsp;my_sal;<BR>&nbsp;&nbsp;...<BR><STRONG>END</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>其中绑定参数的值只在游标变量打开时计算一次。所以,如果我们想使用一个新的绑定值进行查询,就必须重新打开游标变量。 
                        </P>
                        <P class=title2>2、从游标变量取得数据</P>
                        <P>FETCH语句可以从多行查询的结果集中返回单独的一行数据,并把数据内容赋值给INTO子句后的对应的变量,然后属性%ROWCOUNT增加一,游标移到下一行,语法如下: 
                        </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>FETCH</STRONG>&nbsp;{cursor_variable&nbsp;|&nbsp;:host_cursor_variable}<BR>&nbsp;<STRONG>INTO</STRONG>&nbsp;{define_variable[,&nbsp;define_variable]...&nbsp;|&nbsp;record}; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>继续上面的例子,我们把从游标变量emp_cv取得的数据放到变量my_ename和my_sal:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>

⌨️ 快捷键说明

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