--=========绑定变量=================
--====绑定变量
--- 在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时,不需要软分析.
---过程中的参数自动转化为绑定变量