比如要查询员工表中的员工名称,必须存在员工表、必须知道员工名的字段名称,同时具有相关的执行权限,并且使用这种SQL可以进行性能的调优,这种sql成为静态sql。
动态sql是指运行时由字符串拼合而成的sql,比如在PL/SQL块中不能执行DDL语句和DCL语句,那么可以使用execute immediate来执行动态拼合而成的sql语句。更常见的情形是在执行时才知道要查询哪个表中的数据,或者执行时才知道要查询哪些列,则可以使用动态sql语句。
declare
v_sqlstr varchar2(200); --保存sql语句的变量
v_id int; --保存临时字段值的变量
v_name varchar(100);
begin
--在嵌套块中先删除要创建的临时表
begin
v_sqlstr:='DROP TABLE temptable';
EXECUTE IMMEDIATE v_sqlstr;
--如果产生异常,则不进行处理
exception
when others
then
null;
end;
--定义ddl语句来创建sql
v_sqlstr:='create temptable (id int not null primary key,tmpname varchar2(100))';
execute immediate v_sqlstr; --执行动态语句
--向新创建的临时表中插入数据
v_sqlstr:='insert into temptable values(10,''临时名称1'')';
execute immediate v_sqlstr; --执行动态语句
--检索临时表数据,这里使用了动态sql语句变量
v_sqlstr:='select * from temptable where id=:tempId';
--执行并获取动态语句查询结果
execute immediate v_sqlstr
into v_id,v_name
using &1;
--输出表中的信息
dbms_output.put_line(v_id||''||v_name);
end;
/