欢迎来到天天文库
浏览记录
ID:50020328
大小:246.50 KB
页数:27页
时间:2020-03-07
《Oracle 11g数据库管理与开发基础教程 教学课件 作者 袁鹏飞 第15章.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Oracle11g数据库管理与开发基础教程授课教师:职务:第15章动态SQL操作课程描述在PL/SQL程序块中可以直接使用SQL语句,但是仅限DML语句,这是因为PL/SQL采用早期绑定变量的方式进行编译。如果要使用DDL语句和系统控制语句,就只能通过动态SQL来实现。本章将介绍动态SQL的基本概念,以及在PL/SQL中使用动态SQL的方法。本章知识点动态SQL的基本概念PL/SQL中使用动态SQL15.1动态SQLPL/SQL程序中可以使用的SQL语句分为两种:静态SQL语句和动态SQL语句。静态SQL语句,即
2、在PL/SQL块中的SQL语句在编译时被绑定确定下来,执行过程中不能再改变操作对象。动态SQL是指在PL/SQL块编译时SQL语句是不确定的,编译程序不对动态SQL语句部分进行处理,而是在程序运行时动态地创建语句,对语句进行语法分析并执行该语句。当PL/SQL程序中必须执行DDL语句,或者用户不确定在编译时SQL语句的全部文本、输入/输出变量的数量以及类型时,使用动态SQL。PL/SQL提供了两种实现动态SQL的方法:本地动态SQL:这是PL/SQL的特色之一,用来创建以及执行动态SQL语句;DBMS_SQL包:
3、这是Oracle提供的包,用于创建、执行和描述动态SQL语句。15.2本地动态SQL本地动态SQL的处理又分为两种方法:调用EXECUTEIMMEDIATE语句;调用OPEN-FOR、FETCH和CLOSE语句。15.2.1动态SQL处理方法一本地动态SQL方法一通过调用EXECUTEIMMEDIATE语句来处理动态SQL语句,该语句的语法格式为:EXECUTEIMMEDIATEdynamic_sql_stmt[INTO{variable1[,variable2,…]
4、record}][USING[IN
5、OUT
6、
7、INOUT]bind_argument1[,bind_argument2,…]][{RETURNING
8、RETURN}into_clause];其中:dynamic_sql_stmt:要执行的SQL语句文本;INTO子句:提供已定义的变量列表,用于保存SELECT语句的返回结果,当动态SQL语句为返回单行查询结果的SELECT语句时,就会使用这个子句;USING子句:列出绑定参数列表,这些参数会传递到动态SQL语句;与存储过程中的参数模式一样,在EXECUTEIMMEDIATE语句内,IN、OUT和INOUT指出
9、所传递的参数模式;如果不指定任何模式,USING子句中所列出的参数均是输入参数;RETURINGINTO或RETURNINTO子句:包含绑定参数列表,用于将SQL语句执行的返回值保存到相应的变量中;实际上,如果在EXECUTEIMMEDIATE语句中使用该子句返回值,那么在USING子句中就没必要使用OUT参数返回值了。例1,在PL/SQL块中使用动态SQL实现数据库表的动态删除、重建和查询操作。SCOTT@orcl_dbs>DECLARE2sql_stmt1VARCHAR2(200);3sql_stmt2VAR
10、CHAR2(200);4dept_noemp.deptno%TYPE;5table_nameVARCHAR2(20);6salaryemp.sal%TYPE;7empcountNUMBER(4);8BEGIN9EXECUTEIMMEDIATE'DROPTABLEmyemp';10dept_no:=&a;11--根据用户输入,构建动态SQL的DDL语句文本12sql_stmt1:='CREATETABLEmyemp'
11、
12、13'ASSELECT*FROMemp'
13、
14、14'WHEREdeptno='
15、
16、dept_no;
17、15EXECUTEIMMEDIATEsql_stmt1;16--用户可以选择从emp表或myemp表查询17table_name:='&b';18--构建动态SQL的DDL语句文本,查询的表名直接包含在文本内,19--但查询条件要求作为绑定参数传入20sql_stmt2:='SELECTSUM(sal)FROM'
18、
19、table_name
20、
21、21'WHEREdeptno=:1';22DBMS_OUTPUT.PUT_LINE(sql_stmt2);23EXECUTEIMMEDIATEsql_stmt224INTOsa
22、lary25USINGdept_no;26DBMS_OUTPUT.PUT_LINE(dept_no
23、
24、'工资总和:'
25、
26、salary);27END;28/注意:sql_stmt2定义的动态SQL文本中使用了占位符“:1”,它相当于过程或函数的形式参数,使用“:”作为前缀。当执行动态SQL语句时,用USING子句中的绑定变量的值替换该占位符。本地动态SQL中使用绑定变量需要
此文档下载收益归作者所有