Oracle数据库的绑定变量特性及应用讲课讲稿.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Oracle数据库的绑定变量特性及应用讲课讲稿.doc》由会员分享,可在线阅读,更多相关《Oracle数据库的绑定变量特性及应用讲课讲稿.doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。Oracle数据库的绑定变量特性及应用-Oracle数据库的绑定变量特性及应用在开发一个数据库系统前,有谁对Oracle系统了解很多,尤其是它的特性,好象很少吧;对初学者来讲,这更是不可能的事情;仅仅简单掌握了SQL的写法,就开始了数据库的开发,其结果只能是开发一个没有效率,也没有可扩展的系统;1. 因此,我写这个主题也是希望让大家更多地掌握Oracle数据库的特性,从而在架构一个新系统时,能考虑系统的可扩展,可伸缩性,也兼顾系统的效率和稳定;使用绑定变量是Oracle数据库的特性之一;于是大家要问,为
2、什么使用,怎样使用,它的使用限制条件是什么?我会按照这样的想法去解答大家的疑问,我也会以举例子的方式来回答这些问题;为什么使用绑定变量?这是解决Oracle应用程序可伸缩性的一个关键环节;而Oracle的共享池就决定了开发人员必须使用绑定变量;如果想要Oracle运行减慢,甚至完全终止,那就可以不用绑定变量;这里举例说明上述问题;为了查询一个员工代号是123,你可以这样查询:select*fromempwhereempno=123;你也可以这样查询:select*fromempwhereempno=:empno;象我们往常一样,你查询员工123一次以后,有可能再也不用;接着你有可能查询员工45
3、6,然后查询789等等;如果查询使用象第一个查询语句,你每次查询都是一个新的查询(我们叫它硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查,优化等等;第二个查询语句提供了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;通俗点讲,就不是一个级别;第一个查询使用的频率越高,所消耗的系统硬件资源越大,从而降低了用户的使用数量;它也会把优化好的其它查询语句从共享池中踢出;就象一个老鼠坏了一锅汤似的,系统的整体性能降低;而执行绑定变量,提交相同对象的完全相同的查询的用户
4、(这句话,大家听起来比较难理解,随后我会给出详细的解释),一次性使用就可重复使用,其效率不言耳语;打个形象的比喻来说,第一个查询就象一次性使用的筷子,而第二个查询象是铁筷子,只要洗干净,张三李四都能用,合理有效地使用了资源;下面举例子去详细论证上述的问题,不使用绑定变量为生病状况:这是一个未使用的绑定变量(吃药前):setechoon;(把执行结果显示出来)altersystemflushshared_pool;这条语句是清空共项池,每次都必须使用,确保共享池是空的,以提高执行效率;settimingon(打开记时器.)declaretypercisrefcursor;l_rcrc;l_dum
5、myall_objects.object_name%type;l_startnumberdefaultdbms_utility.get_time;beginforiin1.1000loopopenl_rcforselectobject_namefromall_objectswhereobject_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
6、:00:07.03这是一个使用的绑定变量(吃药后):setechoonaltersystemflushshared_pool;declaretypercisrefcursor;l_rcrc;l_dummyall_objects.object_name%type;l_startnumberdefaultdbms_utility.get_time;beginforiin1.1000loopopenl_rcforselectobject_namefromall_objectswhereobject_id=:xusingi;fetchl_rcintol_dummy;closel_rc;endloop;
7、dbms_output.put_line(round(dbms_utility.get_time-l_start)/100,2)|seconds.);end;PL/SQL过程已成功完成。执行时间:已用时间:00:00:00.75大家自己比较结果,相差就是一个数量级;使用绑定变量不仅仅是运行快,而且允许多个用户同时使用;上述绑定变量的另一种写法供大家参考;setechoonaltersystemflushshared_pool;declaretypercisrefcursor;l_rcrc;l_dummyall_objects.object_name%type;l_startnumberdefa
8、ultdbms_utility.get_time;beginforiin1.1000loopopenl_rcforselectobject_namefromall_objectswhereobject_id=I;fetchl_rcintol_dummy;closel_rc;endloop;dbms_output.put_line(round(dbms_utility.get_time-l_start)/100,2)|seconds.);2. end;上述的环境是在数据哭Oracle8.1.7,DBOS:WindowsServer2003,1GMemory,P43.4GHZCPU;电脑配置不同,
9、执行的结果是有差异的;怎样使用绑定变量?下面举例说明:2.1.让Oracle自己绑定变量(也叫静态绑定变量)setserverouton;settimingon;declarel_sqlvarchar2(2000);l_countnumber;l_param1varchar2(100);l_param2varchar2(100);beginl_param1:=a;l_param2:=b;selectcount(*)intol_countfromtable1wherecol_1=l_param1andcol_2=l_param2;dbms_output.put_line(l_count);end
10、;/在上面的情况,Oracle会自己绑定变量,即,如果参数保存在一个数组中,select语句放在一个循环中,select语句只会编译一次。2.2.动态绑定变量setserverouton;settimingon;declarel_sqlvarchar2(2000);l_countnumber;l_param1varchar2(100);l_param2varchar2(100);beginl_param1:=a;l_param2:=b;l_sql:=selectcount(*)into:xfromtable1wherecol_1=:yandcol_2=:z;ExecuteImmediatel_
11、sqlintol_countusingl_param1,l_param2;dbms_output.put_line(l_count);end;/2.3.dbms_output的绑定变量使用Setechoon;Setserveroutputon;Settimmingon;declarecursor_idinteger;inumber;xSqlVarchar2(200);xOutvarchar2(200);l_startnumberdefaultdbms_utility.get_time;xRowinteger;Begincursor_id:=DBMS_Sql.open_cursor;Foriin
12、1.1000LoopDBMS_Sql.parse(cursor_id,insertintotvalues(:username,:user_id,Sysdate),DBMS_SQL.V7);DBMS_Sql.bind_variable(cursor_id,username,test|to_char(i);DBMS_Sql.bind_variable(cursor_id,user_id,i);xRow:=DBMS_Sql.execute(cursor_id);-insertintotvalues(test|to_char(i),i,Sysdate);-xSql:=insertintotvalues
13、(:username,:user_id,Sysdate);-executeimmediatexSqlusingtest|to_char(i),i;Endloop;DBMS_sql.close_cursor(cursor_id);dbms_output.put_line(round(dbms_utility.get_time-l_start)/100,2)|seconds.);-xOut:=to_char(round(dbms_utility.get_time-l_start)/100,2)|seconds.;-xOut:=seconds.;-returnxout;3. end;这里强烈推荐使用
14、静态绑定变量,有兴趣的话可以自己比较;我怎样知道正在使用绑定变量的方法;下面举例说明;创建一个Table;Createtablet(xxint);执行下面的语句;BeginForIin1.100loopExecuteimmediateinsertintotvalues(|t|);Endloop;end;现在准备好了脚本,开始创建一个字符串中删除常数的一个函数,它采用的是SQL语句为:insertintotvalues(hello,55);insertintotvalues(world,56);将其转换为insertintotvalues(#,);所有相同的语句很显然是可见的(使用绑定变量);上
15、述两个独特的插入语句经过转换后变成同样的语句;完成的转换函数为:Createorreplacefunctionremove_constants(p_queryinvarchar2)returnvarchar2asl_querylong;l_charvarchar2(1);l_in_quatesbooleandefaultfalse;beginforiin1.length(p_query)loopl_char:=substr(p_query,i,1);ifl_char=andl_in_quatesthenl_in_quates:=False;elsifl_char=andnotl_in_quat
16、esthenthenl_in_quates:=true;l_query=:l_query|#;endififnotl_in_quatesthenl_query=:l_query|l_char;endif;endloop;l_query:=tranlate(l_query,0123456789,);foriin1.8loopl_query:=replace(l_query,lpad(,10-i,),);l_query:=replace(l_query,lpad(,10-i,),);endloop;returnupper(l_query);end;/接着我们建立一个临时表去保存V$SQLAREA里
17、的语句,所有Sql的执行结果都写在这里;建立临时表;createglobaltemporarytablesql_area_tmponcommitpreserverowsasselectsql_text,sql_textsql_text_wo_constantsfromv$sqlareawhere1=0;保存数据到临时表上;insertintosql_area_tmp(sql_text)selectsql_textfromv$sqlarea;对临时表中的数据进行更新;删除掉常数;Updatesql_area_tmpsetSQL_TEXT_WO_CONSTANTS=remove_constants
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 数据库 绑定 变量 特性 应用 讲课 讲稿
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内