在oracle 中,对于一个sql语句,存在两种可选的解析过程, 一种是硬解析,一种是软解析.
一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩资源,严重影响了系统的并发效率。当一个sql语句提交后,oracle会首先检查一下共享缓冲池里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。
而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。
下面用个简单的存储过程例子演示下变量绑定的用法:
Create Table student (grade varchar2(5), num number(6), Name Varchar2(20), age Integer);
Insert Into student Values('101', 100001, 'Jack', 20);
Insert Into student Values('102', 100001, 'Mike', 21);
Insert Into student Values('101', 100002, 'Merry', 19);
Insert Into student Values('102', 100002, 'Tony', 20);
Procedure Test_Bind_Variable Is
v_Name Varchar2(20);
v_Grade Number(6);
v_Num Number(6);
v_Age Integer;
v_Sql Varchar2(200);
Begin
For Cur_Name In (Select Name From Student) Loop
v_Name := Cur_Name.Name;
v_Sql := 'select grade, num, age into :n, :y, :z from student where name = :m';
Execute Immediate v_Sql
Into v_Grade, v_Num, v_Age
Using v_Name;
Dbms_Output.Put_Line('grade=' || v_Grade || ', num=' || v_Num ||
', name=' || v_Name || ', age=' || v_Age);
End Loop;
End Test_Bind_Variable;
测试结果为:
grade=101, num=100001, name=Jack, age=20
grade=102, num=100001, name=Mike, age=21
grade=101, num=100002, name=Merry, age=19
grade=102, num=100002, name=Tony, age=20