热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

SQL和PL/SQL中绑定变量的区别

在Oracle中,对于一个提交的sql语句,存在两种可选的解析过程,一种叫做硬解析,一种叫做软解析.一个硬解析需要经解析,制定执行路

在Oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析.一个硬解析需要经解析,制定执行路

在Oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析.

一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决。之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的,,这些内存区域是不能被同时修改。当一个sql语句提交后,oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。

而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。

1、sql中绑定变量

普通sql语句:

SELECT fname, lname, pcode FROM cust WHERE id = 674;
SELECT fname, lname, pcode FROM cust WHERE id = 234;
SELECT fname, lname, pcode FROM cust WHERE id = 332;

含绑定变量的sql 语句:

SELECT fname, lname, pcode FROM cust WHERE id = :cust_no;

Sql*plus 中使用绑定变量:

sql> variable x number;

sql> exec :x := 123;

sql> SELECT fname, lname, pcode FROM cust WHERE id =:x;

2、pl/sql

pl/sql很多时候都会自动绑定变量而无需编程人员操心,引用变量即是引用绑定变量,即很多你写得sql语句都会自动利用绑定变

量,如下例所示:

create or replace procedure dsal(p_empno in number)
as
begin
update emp
set sal=sal*2
where empno = p_empno;
commit;
end;
/

也许此时你会想要利用绑定变量来替代p_empno,但是这是完全没有必要的,因为在pl/sql中,引用变量即是引用绑定变量。

但当引用的值不是变量(常量或者表达式)且要多次重复执行时,也需要动态绑定变量:

DECLARE

c_temp site%ROWTYPE;
TYPE cursortype IS REF CURSOR;
cur_temp cursortype;
BEGIN
OPEN cur_temp FOR('select * from site where site_id=:1')
USING 91;
LOOP
FETCH cur_temp
INTO c_temp;
EXIT WHEN cur_temp%NOTFOUND;
EXECUTE IMMEDIATE 'insert into b values (:1)'
USING c_temp.site_id;
END LOOP;
CLOSE cur_temp;
COMMIT;
END;

linux

推荐阅读
author-avatar
六尾11
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有