【PLSQL】绑定变量,动态SQL,硬解析和软解析

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************

1.1 变量

在匿名块或者存储过程中定义的变量为局部变量,及作用域在整个匿名块或存储过程中。运行结束,则该变量就不存在了;

         绑定变量

         PLSQLSQL中直接私有绑定变量:bv_name,不需要定义

1.1.1  绑定变量的定义

--绑定变量的定义

variable I number

begin

         for I in 1 .. 1000 loop

         execute immediate ‘insert into test values(:i)’ using I;

         :I :=I; ---绑定变量的赋值

         end loop

         dbms_output.put_line(:i);

         commit;

end;

print i

exec :i=:=10000 --- 绑定变量的赋值

print I

3.3 PLSQLSQL分类

静态SQL

         --PLSQL块中使用的SQL语句在编译的时候是明确的,SQL语句在PLSQL编辑阶段编译;

动态SQL

         --PLSQL编译时SQL是不确定的,如根据用户输入参数的不同而执行不同的操作,

         编译程序对动态语句不处理;在运行的时候,动态创建SQL语句

3.3.1 静态SQL

--一次硬分析,一次软分析,1000次执行

create or replace procedure proc1

ls

begin

         for I in 1 .. 1000 loop

         insert into test values(I);

         end loop;

         commit;

end;

begin proc1 end;

3.3.2 本地动态SQL(未使用绑定变量)

1000此硬分析,1000此软分析,1000次执行

create procedure proc1 ls

begin

         for I In 1  ..1000 loop

         execute immediate ‘insert into test values(‘||I||’)’;

end loop;

commit;

end;

---编译过程的时候,不编译sql语句

begin proc1 end;

3.3.3 本地动态SQL(使用绑定变量)

--1次硬分析,1000次软分析,1000次执行

create procedure proc1 ls

begin

         for I In 1  ..1000 loop

         execute immediate ‘insert into test values(i)’ using i;

end loop;

commit;

begin proc1 end;

3.4 SQL语句的处理过程

语法检查:syntax check

语义检查:semantic check

         --诸如检查sql语句中的访问对象是否存储,该用户是否具备相应的权限;

sql语句进行解析parse

         --利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan

执行sql,返回结果:execute and  return;

3.4.1 硬解析和软解析

oracle利用内部hash算法来获得该sqlhash值,然后在library cache里查找是否存在该hash值;

假设存在,则将此sqlcache中的进行比较;假设相同,就将利用已有的解析数和执行计划,而忽略了优化器的相关工作,这就是软解析的过程;

如果上面两个减少中任由一个不成立,那么优化器都将进行创建解析树,生成执行计划的动作,这个过程都叫硬解析;

3.5 对应存储过程的操作

创建并编译过程:

         create or replace procedure

编译过程

         alter procedure procname compile;

调用过程

         用匿名子程序调用,直接写过程名

         用有名子程序调用,直接写过程名;

删除过程:

         drop procedure

3.5.1 过程的使用案例

创建存储过程

create or replace procedure p_account

(p_id number,p_realname out varchar2,p_age out number)

ls

begin

         select real_name,round((sysdate-birthdate)/360) into p_realname,p_age

         from account

         where id=p_id;

exception

         when no_data_found then

         p_realname :=’no account’;

         p_age=0

end;

有名子程序调用:

declare

         v_realname varchar2(20);

         v_age number;

begin

         p_account(1011,v_realname,v_age);

         dbms_output.put_line(v_realname || ‘’ || v_age);

end;

匿名子程序调用,绑定变量:

         variable b_realname varchar2(20)

         variable b_age number

         begin

                   p_account(1011,:b_realname,:b_age)

         end;

         print b_realname;

         print b_age;

3.6 PLSQL中的静态sql

         oracle在解析sql时候会把PLSQL中定义的变量转为绑定变量insert into test values(:b1),减少硬解析的次数;

         server process将执行完的sql cache起来,不关闭,当再执行sql,不需要软解析;

         过程中的参数会自动转化为绑定变量;

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************

你可能感兴趣的:(动态sql,绑定变量,硬解析,软解析)