什么情况下适合使用动态SQL
1.执行DDL
比如alter table , drop table , create table等,只能用动态SQL
2。sql中的table / column信息不明的
比如,table_name在写procudre时未知
sql_text := 'select * from '||table_name ;
execute immediate sql_text ;
动态SQL使用绑定变量例子
代码:
tkyte@TKYTE816> declare
2 l_number number;
3 begin
4 for i in 1 .. 10000
5 loop
6 l_number := dbms_random.random;
7
8 execute immediate
9 'insert into t values ( :x1, :x2, :x3, :x4 )'
10 using l_number, l_number, l_number, l_number;
11 end loop;
12 commit;
13 end;
14 /
静态SQl使用绑定变量的例子
代码:
代码:
tkyte@TKYTE816> declare
2 l_number number;
3 begin
4 for i in 1 .. 10000
5 loop
6 l_number := dbms_random.random;
7
8 insert into t
9 values( l_number, l_number, l_number, l_number );
10 end loop;
11 commit;
12 end;
13 /
代码:
tkyte@TKYTE816> declare
2 l_number number;
3 begin
4 for i in 1 .. 10000
5 loop
6 l_number := dbms_random.random;
7
8 execute immediate
9 'insert into t values ( :x1, :x2, :x3, :x4 )'
10 using l_number, l_number, l_number, l_number;
11 end loop;
12 commit;
13 end;
14 /
静态SQl使用绑定变量的例子
代码:
代码:
tkyte@TKYTE816> declare
2 l_number number;
3 begin
4 for i in 1 .. 10000
5 loop
6 l_number := dbms_random.random;
7
8 insert into t
9 values( l_number, l_number, l_number, l_number );
10 end loop;
11 commit;
12 end;
13 /
静态SQL+绑定变量,避免了硬分析和软分析
动态SQL+绑定变量,避免了硬分析,但不能避免软分析(第一次运行仍然是要硬分析)
使用了绑定变量
优点,可以利用共享池,不需要重新编译可以重用,提高SQL语句的软解析率,降低硬解析率
缺点,SQL优化器得到的信息减少了,可能得不到最优的执行计划。