静态SQL用于完成特定的功能,动态SQL用于灵活的处理各种数据
PS:执行动态SQL语句,需要将SQL语句存放到字符串变量中,且SQL语句可以包含占位符(以冒号开始)
占位符例子: select * from test where name=:1; --红色表示占位符
1、定义:
动态SQL是指在运行PL/SQL块的时动态输入的SQL语句。
2、使用动态SQL的条件:
1)执行DDL语句 如:create,alter,drop
2)执行DCL语句 如:grant,revoke
3)执行更加灵活的SQL语句 如:在select语句中使用不通的where条件
3、动态SQL的处理方法
1)使用EXECUTE IMMEDIATE语句 (用的最多)
a、处理DDL操作 --在PL/SQL块中只能用动态SQL
b、处理DCL操作 --在PL/SQL块中只能用动态SQL
c、处理DML操作 M=manipulation 处理,操作
d、处理单行查询操作
2)使用OPEN-FOR,FETCH和CLOSE语句(会一点)
3)使用批量动态SQL(基本不会)
例子:
(1)带返回值
declare
user_number number(3);
v_sql varchar2(1000);
begin
v_sql := 'update hkb_test3 a
set a.age = :a+15
where a.user_id = :b returning a.age into :user_number';
execute immediate v_sql
using &a, &b
returning into user_number; (红色三行是一句SQL语句)
dbms_output.put_line('user_number :' || user_number);
end;
(2)不带返回值
declare
v_sql varchar2(100);
begin
v_sql := 'update hkb_test3 a
set a.age= :a' || '
where a.user_id= :b';
execute immediate v_sql
using &a,&b;
end;
(3)游标实现多行查询
declare
type agecursor is ref cursor;
v_age agecursor; --定义游标变量
v_name hkb_test%rowtype; (继承表的行属性)
v_sql varchar2(1000);
begin
v_sql := 'select * from hkb_test where age=:a';
open v_age for v_sql
using &a; --打开游标变量
loop
fetch v_age
into v_name;
exit when v_age%notfound;
dbms_output.put_line(v_name.name || 'age:' || v_name.age);
end loop; --循环提取数据
close v_age; --关闭游标变量
end;
PS:在动态SQL中使用BULK子句,暂时没用到,以后遇到在好好研究!