动态SQL语句的理解
1. 动态SQL的分类
根据要处理的sql语句的作用不同,可以使用三种不同类型的动态sql方法:
1) 使用execute immediate语句可以处理包括DDL(create、alter和drop)、DCL(grant、revoke)、DML(insert、update、 delete)以及单行select语句;
2) 使用open cursorname for sql_statement语句可以处理多行查询操作;
3) 使用批量动态sql(forall)可以加快sql语句处理,进而提高plsql程序的性能。
2. 动态SQL语法:
execute immediate语句:
Define_variable用于指定存放单行查询结果的变量;using in bind_argument用于指定存放传递给动态sql值的变量,即在dynamic中存在占位符时使用;using out bind_argument用于指定存放动态sql返回值的变量。
3. 动态语法示例:
通过六个示例理解动态SQL:
示例1:
使用execute immediate执行简单ddl语句
示例2:
使用execute immediate执行dcl语句
示例3:
使用execute immediate处理dml语句时,如果dml语句包含占位符,那么在execute immediate语句之后必须要带有using子句;如果dml语句带有returning子句,那么在execute immediate语句之后必须带有returning into子句,并且此时只能处理作用的单行上的dml语句,如果dml语句作用在多行上,则必须使用bulk子句。
示例4:
使用动态游标处理多行查询类动态sql语句。
oracle通过使用bulk collect into子句处理动态sql中的多行查询可以加快处理速度,从而提高应用程序的性能。当使用bulk子句时,集合类型可以是plsql所支持的索引表、嵌套表和varray,但集合元素必须使用sql数据类型。在oracle9i以后,有三种语句支持bulk子句,execute immediate,fetch和forall。
示例5:
在execute immediate中使用bulk collect into处理多行查询返回结果。
示例6:
在forall语句中使用bulkinto语句。
1 d wang 12
2 dsaf wang 23
3 asdf wang 34
4 liasdf wang
5 li wang
6 asdf wang
7 li wang
8 li wang
执行结果:
转载自:http://itjaj.com/thread-3112-1-5.html