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

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

1.1 变量

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

绑定变量

在PLSQL的SQL中直接私有绑定变量: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 PLSQL的SQL分类

静态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算法来获得该sql的hash值,然后在library
cache里查找是否存在该hash值;

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

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

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 徐长亮的专栏
************************************************************************
时间: 2024-10-10 19:46:49

【PLSQL】绑定变量,动态SQL,硬解析和软解析的相关文章

使用EXECUTE IMMEDIATE来生成含有绑定变量的SQL

一个SQL,通过SPM固定它的执行计划,可以通过DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE实现.也可以通地此功能在不修改原SQL的情况下对其加HINT来固定执行计划.DB VERSION:Oracle 11.2.0.4OS:CentOS 6.6例如:原SQL走索引:SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;想通过加HINT让其走全表扫描:SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB

捕获非绑定变量的SQL语句

之前一直用如下sql来查看非绑定变量的sql,但是不准 select hash_value, substr(sql_text, 1, 80)   from v$sqlarea  where substr(sql_text, 1, 40) in        (select substr(sql_text, 1, 40)           from v$sqlarea         having count(*) > 1          group by substr(sql_text, 1

Oracle的硬解析和软解析

提到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程.当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程:1.语法检查(syntax check)检查此sql的拼写是否语法.2.语义检查(semantic check)诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限.3.对sql语句进行解析(prase)利用内部算法对sql进行解析,生成解析树(parse tree

3.硬解析,软解析,软软解析

v$sql ->存子游标信息(每个子游标对应一次硬解析),关键信息是执行环境和执行计划 v$sqlarea ->存父游标信息,对应sql语句的文本 在v$sql中一个sql_id会存在多条语句,实际上v$sql中sql_id和child_number共同确定一个唯一的sql,原因是一个sql_id对应多个子游标. 不同schema下相同sql,sql_id相同,单查询的对象不是同一用户 由于统计信息或者变量窥视,导致执行计划变化 游标的概念:指内存中可执行的sql对象,即SQL已经生成了执行计

Oracle学习之shared pool--硬解析和软解析

1.shared pool(共享池)的组成 3块区域:free cache.library cache.row cache free cache:空闲空间 library cache:主要缓存SQL语句以及SQL语句对应的执行计划 row cache:数据字典缓存 select * from v$sgastat a where a.NAME = 'library cache'; select * from v$sgastat a where a.pool = 'shared pool' and

Oracle SQL的硬解析和软解析

我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析.还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进行硬解析,要么进行软解析. DML:INSERT,UPDATE,DELETE,SELECT DDL:CREATE,DROP,ALTER 一.  SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过

动态SQL、绑定变量、静态SQL的性能对比

1.测试样例 下面的三个存储过程,分别使用了动态SQL.绑定变量.静态SQL三种编程方式.具体存储过程内容如下: 1)动态SQL create or replace procedure proc1 as begin for i in 1 .. 100000 loop execute immediate 'insertinto t values (' || i || ')'; commit; end loop; end proc1; 2)绑定变量 create or replace procedu

PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量

2014-09-25 BaoXinjian 一.绑定变量用法和使用场合 使用绑定变量的重要性:如果不使用绑定变量而使用常量,会导致大量硬解析.由于硬解析的种种危害,不使用绑定变量往往是影响oracle性能和扩展性的最大问题 以下为一些错误写法和正确写法的例子 1. PLSQL中普通查询 (1). 错误写法 SELECT * FROM emp WHERE empno=123; (2). 正确写法(未使用绑定变量) Empno:=123;SEELCT* FROM emp WHERE empno=:e

共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁

先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬解析和软解析,SQL语句第一次解析时必须进行硬解析 一句话说明硬解析与软解析的区别是: 硬解析=需要生成执行计划   软解析=不需要生成执行计划 在Oracle中存在两种类型的SQL语句,一类为DDL语句,不共享使用,也就是每次执行都需要进行硬解析.还有一类就是DML语句,会进行硬解析或软解析. 硬