绑定变量的用法.doc_第1页
绑定变量的用法.doc_第2页
绑定变量的用法.doc_第3页
绑定变量的用法.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在开发一个数据库系统前,有谁对Oracle 系统了解很多,尤其是它的特性,好象很少吧;对初学者来讲,这更是不可能的事情;仅仅简单掌握了SQL的写法,就开始了数据库的开发,其结果只能是开发一个没有效率,也没有可扩展的系统; 因此,我写这个主题也是希望让大家更多地掌握Oracle数据库的特性,从而在架构一个新系统时,能考虑系统的可扩展,可伸缩性,也兼顾系统的效率和稳定;使用绑定变量是Oracle数据库的特性之一;于是大家要问,为什么使用,怎样使用,它的使用限制条件是什么?我会按照这样的想法去解答大家的疑问,我也会以举例子的方式来回答这些问题;1. 为什么使用绑定变量?这是解决Oracle应用程序可伸缩性的一个关键环节;而Oracle的共享池就决定了开发人员必须使用绑定变量;如果想要Oracle 运行减慢,甚至完全终止,那就可以不用绑定变量;这里举例说明上述问题;为了查询一个员工代号是123,你可以这样查询:select * from emp where empno=123;你也可以这样查询:select * from emp where empno=:empno;象我们往常一样,你查询员工123一次以后,有可能再也不用;接着你有可能查询员工456,然后查询789等等;如果查询使用象第一个查询语句,你每次查询都是一个新的查询(我们叫它硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等;第二个查询语句提供了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;通俗点讲,就不是一个级别;第一个查询使用的频率越高,所消耗的系统硬件资源越大,从而降低了用户的使用数量;它也会把优化好的其它查询语句从共享池中踢出;就象一个老鼠坏了一锅汤似的,系统的整体性能降低; 而执行绑定变量,提交相同对象的完全相同的查询的用户(这句话,大家听起来比较难理解,随后我会给出详细的解释),一次性使用就可重复使用,其效率不言耳语; 打个形象的比喻来说,第一个查询就象一次性使用的筷子,而第二个查询象是铁筷子,只要洗干净,张三李四都能用,合理有效地使用了资源;下面举例子去详细论证上述的问题,不使用绑定变量为生病状况:这是一个未使用的绑定变量(吃药前):set echo on;(把执行结果显示出来)alter system flush shared_pool;这条语句是清空共项池,每次都必须使用,确保共享池是空的,以提高执行效率;以下是引用片段:settimingon(打开记时器.) declare typercisrefcursor; l_rcrc; l_dummyall_objects.object_name%type; l_startnumberdefaultdbms_utility.get_time; begin foriin1.1000 loop openl_rcfor selectobject_name fromall_objects whereobject_id=|i; fetchl_rcintol_dummy; closel_rc; endloop; dbms_output.put_line (round(dbms_utility.get_time-l_start)/100,2)| seconds.); end; / PL/SQL过程已成功完成。 执行时间:已用时间:00:00:07.03 这是一个使用的绑定变量(吃药后): setechoon altersystemflushshared_pool; declare typercisrefcursor; l_rcrc; l_dummyall_objects.object_name%type; l_startnumberdefaultdbms_utility.get_time; begin foriin1.1000 loop openl_rcfor selectobject_name fromall_objects whereobject_id=:x usingi; fetchl_rcintol_dummy; closel_rc; endloop; dbms_output.put_line (round(dbms_utility.get_time-l_start)/100,2)| seconds.); end;PL/SQL 过程已成功完成。执行时间: 已用时间: 00: 00: 00.75大家自己比较结果,相差就是一个数量级;使用绑定变量不仅仅是运行快,而且允许多个用户同时使用;上述绑定变量的另一种写法供大家参考;以下是引用片段:setechoon altersystemflushshared_pool; declare typercisrefcursor; l_rcrc; l_dummyall_objects.object_name%type; l_startnumberdefaultdbms_utility.get_time; begin foriin1.1000 loop openl_rcfor selectobject_name fromall_objects whereobject_id=I; fetchl_rcintol_dummy; closel_rc; endloop; dbms_output.put_line (round(dbms_utility.get_time-l_start)/100,2)| seconds.); end;上述的环境是在数据哭Oracle 8.1.7, DB OS: Windows Server 2003, 1G Memory, P4 3.4GHZ CPU; 电脑配置不同,执行的结果是有差异的;2.怎样使用绑定变量?下面举例说明:2.1.让Oracle自己绑定变量(也叫静态绑定变量)以下是引用片段:setserverouton; settimingon; declare l_sqlvarchar2(2000); l_countnumber; l_param1varchar2(100); l_param2varchar2(100); begin l_param1:=a; l_param2:=b; selectcount(*)intol_countfromtable1wh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论