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

php中文网
发布: 2016-06-07 17:24:33
原创
1030人浏览过

在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

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号