Oracle数据库之PLSQL绑定变量

--=========绑定变量=================
--====绑定变量
--- 在PL/SQL的sql直接使用绑定变量:bv_name

variable k number; --声明k是绑定变量
--打印k的值
print k; -- 结果 是没有值

exec :k :=1000; --绑定变量赋值	 
print k; -- 结果 1000

--===匿名块使用绑定变量===
declare
	i number(4) :=1;
begin
	 dbms_output.put_line('i:' || i);
	:k :=i; -- 绑定变量赋值
	 dbms_output.put_line('k:' || :k);
end;

-- 分析绑定变量的作用
--需求:向test表中的c1列添加数据 1.. 100 loop

-- 静态SQL
CREATE OR replace procedure p1
	is
begin
	for i in 1 .. 100 loop
		insert into  t1 values (i);
	end loop;
	commit;
end;--编译过程阶段完成 dml语句的编译

--执行
begin
	p1 -- 1次硬分析 1次软分析  100次执行
end; 

--动态SQL ,没使用绑定变量
create or replace procedure p1
	is
begin
	for i in 1 .. 100 loop
	execute immediate 'insert into t1 values ('|| i || ')';
	end loop;
	execute immediate 'commit';
end; --编译过程,不会编译insert 

--执行
begin
	p1 -- 100次硬分析 100次软分析  100次执行
end; 


--动态 sql +绑定变量
variable num number;
create or replace procedure p1 
	is
begin
	for i in 1..100 loop
			-- :a是占位符  
		execute immediate 'insert into t1 values (:a)' using i;
	end loop;
	execute immediate 'commit';
end;

--执行
begin
	p1 -- 1次硬分析 100次软分析  100次执行
end; 


--======软解析硬解析
--- Oracle利用内部的hash算法来取得该sql的hash值,然后在
----libray cache(PGA里面的一块区域) 里查找是否存在该hash值.

----假设存在相同的hash值,则将此sql与cache中的进行比较,
--假设'相同',就将利用已有的解析树与执行计划,而省略了优化器相关工作,这就是软解析的过程.

----如果上面两个假设条件有一个不成立,那么优化器都将创建解析树,
----生成执行计划的动作,这个过程叫硬解析.



--===========PL/SQL中的静态SQL====
---Oracle在解析SQL时会把pl/sql中定义的变量转为绑定变量
---insert into test values (:a1);减少硬分析次数
---Server process将执行完的SQL cache起来,不关闭.当再次执行sql时,不需要软分析.
---过程中的参数自动转化为绑定变量







猜你喜欢

转载自whatisjavabean.iteye.com/blog/2005563