Oracle数据库10g中新的SQL和PL/SQL功能议程新的SQL特性新的PL/SQL特性PL/SQL的速度是原来的两倍总结问答Oracle8OracleSQL引擎的发展Oracle8iOracle9iOracle9iR2SQL/XML集成(XMLType、URIType等)OLAPDatetime类型ANSI联接CASE表达式XML数据库SQL/XMLW3C标准数据挖掘网络Web服务正则表达式本地数值结构BLAST对象扩展数据插件SQL/Java集成interMedia类型数据和处理复杂性新的SQL特性正则表达式本地数值结构LOB增强集合增强正则表达式简介起源于数学首先在UNIX中计算机化–从ed、grep、perl、cgi、web到任何地方多种应用程序–HTMLFORMS中的验证–生物信息学–服务器配置–数据挖掘Oracle正则表达式对数据库的本地支持–SQL和PL/SQL中的接口–基于POSIX标准–与GNU、PERL、Java、Xquery等同步描述数据的模式变为数据的一个属性数据库内部强大的字符串处理主要特性POSIX扩展的正则表达式接口–REGEXP_LIKE模式是否匹配?–REGEXP_SUBSTR它与什么匹配?–REGEXP_INSTR它在哪里匹配?–REGEXP_REPLACE替换匹配的记录。匹配选项语言环境支持LOB支持REGEXP_LIKE确定模式是否存在。查找名称‘JonStevens‘的变体–John或Jon–Steven或Stevens或Stephen或StephensSELECTc1FROMt1WHEREREGEXP_LIKE(c1,‘Joh?nSte(ph|v)ens?’);JonStevensJohnStephensJohnStevens和DDL一起使用允许使用过滤器的数据,并带检查约束–邮政编码(ZIPcode)列是VARCHAR2(5),但可以包含任意的5个字符。使用视图的查询子集和格式化–将电话号码格式化为(xxx)xxx-xxxx创建基于函数的索引与PL/SQL一起使用非常强大的字符串处理功能src:=REGEXP_REPLACE(src,‘regexp_1’);src:=REGEXP_REPLACE(src,‘regexp_2’);src:=REGEXP_REPLACE(src,‘regexp_3’);可以增强现有的功能–支持PERL缩写–提取第n个子表达式替换大量代码行–可以简化字符串处理函数性能考虑事项模式匹配可能很复杂–需要编译成状态机–词法分析–检查所有可能的分支,直到发现匹配每条语句编译一次–对于复杂情景可能比LIKE更快邮政编码检查快5倍通常比等价的PL/SQL更快编写快速执行的表达式本地浮点数据类型两种新的数值数据类型BINARY_FLOAT,BINARY_DOUBLE–二进制浮点运算的IEEE754标准–是许多其他标准(例如,Java、XML模式)和硬件平台的一部分–普遍存在于商务智能、生命科学、工程/科学计算本地浮点数据类型与数值数据类型比NUMBER类型效率更高–硬件运算/数学运算快5–10倍–占用更少的内存/磁盘空间(5/9字节与1–22字节)–BINARY_DOUBLE值范围更大(e308与e125)–无需类型转换(使用与字节顺序无关的存储格式)本地浮点函数新的类型转换函数–TO_BINARY_FLOAT、TO_BINARY_DOUBLE–TO_NUMBERSQL函数支持–数值函数(sin、cos等)–聚合函数(sum、avg、stddev等)–分析函数(sum、avg、stddev等)对SQL、PL/SQL、Java、XML模式注册、ODP.NET和OCI/OCCI的无缝支持本地浮点约束createtablefloating_point_table1(fltNnullbinary_floatconstraintflt_nullnotnull,dblNnullbinary_doubleconstraintdbl_nullnotnull,fltUnqbinary_floatconstraintflt_unqunique,dblUnqbinary_doubleconstraintdbl_unqunique,fltChkbinary_floatconstraintflt_chkcheck(fltChkisnotNaN),dblChkbinary_doubleconstraintdbl_chkcheck(dblChkisnotinfinite),fltPrmbinary_floatconstraintflt_prmprimarykey);*NaN(不是数字)–e.g.0/0,infinity/infinity本地浮点约束createtablefloating_point_table2(dblPrmbinary_doubleconstraintdbl_prmprimarykey,fltFrnbinary_floatconstraintflt_frnreferencesfloating_point_table1(fltPrm)ondeletecascade);PL/SQL示例使用欧拉级数计算=sqrt(6*(1+1/2*2+1/3*2+...))使用牛顿方法近似真值的平方根赋值、加、乘、除、比较、绝对值procedureEuler_Pi_Seriesis...beginpi:=one;prev_pi:=zero;prod_over_six:=zero;step:=zero;whilepi-prev_pitolerloopprev_pi:=pi;step:=step+one;prod_over_six:=prod_over_six+one/(step*step);prod:=six*prod_over_six;prev_root:=prod;root:=prod/two;whileAbs(root-prev_root)root_tolerloopprev_root:=root;root:=(root+prod/root)/two;endloop;pi:=root;endloop;endEuler_Pi_Series;subtypeMy_Numberisnumber;zeroconstantMy_Number:=0.0;oneconstantMy_Number:=1.0;twoconstantMy_Number:=2.0;sixconstantMy_Number:=6.0;tolerconstantMy_Number:=0.00000000001;root_tolerconstantMy_Number:=toler/1000.0;rootMy_Number;prev_rootMy_Number;prod_over_sixMy_Number;prodMy_Number;piMy_Number;prev_piMy_Number;stepMy_Number;subtypeMy_Numberisbinary_double;zeroconstantMy_Number:=0.0d;oneconstantMy_Number:=1.0d;twoconstantMy_Number:=2.0d;sixconstantMy_Number:=6.0d;tolerconstantMy_Number:=0.00000000001d;root_tolerconstantMy_Number:=toler/1000.0d;rootMy_Number;prev_rootMy_Number;prod_over_sixMy_Number;prodMy_Number;piMy_Number;prev_piMy_Number;stepMy_Number;PL/SQL示例使用欧拉级数计算近似300,000次迭代NUMBER花费约27.7秒BINARY_DOUBLE花费约3.7秒提高倍数:约7倍LOB增强LOB普遍用于存储非结构化的数据(文本、AVI、基因/蛋白序列等)LOB性能改善访问内联(4KB)LOB时获得5倍的性能增益(在9iR2中)临时LOB使用引用计算提供了几个数量级的性能增益–在读取时引用(ReferenceonRead)–在写入时复制(CopyonWrite)超大型LOBTB大小的Lob(8–128TB)–DB_BLOCK_SIZE(2–32KB)x(4GB–1)–新的DBMS_LOB.GET_STORAGE_LIMIT函数–OCI、JDBC和DBMS_LOB现在支持大于4GB的LOBOCILobRead2()、OCIWriteAppend2()和OCILobWrite2()函数为JDBC和DBMS_LOB提供相同的API集合类型增强用户定义的类型、集合类型和引用类型简化了结构复杂的数据建模集合类型用于映射实际世界应用程序中的包含关系–例如,一个购物车包含了许多商品VARRAY增强VARRAY的类型发展CREATETYPEemail_list_typASOBJECT(section_noNUMBER,emailsemail_list_arr);/CREATETYPEemail_varray_typASVARRAY(5)OFemail_list_typ;/ALTERTYPEemail_varray_typMODIFYLIMIT100CASCADE;在临时表中支持VARRAY列–提供应用程序开发灵活性嵌套表增强将一个不同的表空间用于嵌套表的存储表–带嵌套表的列的表可以在表空间之间分配I/O负载CREATETABLEpurchase_orders(order_items_columnorder_items_typ)NESTEDTABLEorder_items_columnSTOREASorder_items_column_nt(TABLESPACEusers);为嵌套表提供的ANSISQL多集合操作嵌套表存储无序的元素–集合只包含唯一的元素–多集合可以包含重复的元素嵌套表上的各种多集合操作为嵌套表提供的多集合操作Cardinality、Collect、MultisetExcept、MultisetIntersection、MultisetUnion、Powermultiset、Powermultiset_by_Cardinality和Set操作–查找热销商品集合的强大工具(市场指数总览分析)多集合操作示例createtypecategoriesastableofint;/createtablecarts(c1int,c2categories)nestedtablec2storeastb1_c2;insertintocartsvalues(1,categories(1,2,3,4));insertintocartsvalues(2,categories(2,4,6));selectt1.c2multisetintersectt2.c2fromcartst1,cartst2wheret1.c1=1andt2.c1=2;categories(2,4)-frequentset嵌套表比较Equal和NotEqual、In、Submultiset、MemberOf、Empty和Is[Not]ASetSELECT*FROMcustomercWHEREitem_typ(2)MEMBEROFc.freq_set;在PL/SQL中也提供declaretypeTab_tistableofpls_integer;aTab_t:=Tab_t(1,2,3,4,5);beginif3memberofathenShow('member');endif;end;SQL小结Oracle数据库10gSQL引擎–聚合来自不同的分布式数据源的数据网格信息–无缝地集成Java、XML