仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 555|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL编程:用SQLJ开辟数据库

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果某个数据列里包含许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含的净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。数据|数据库
SQLJ的概述
  明天的企业级使用程序一般运转在多半据库平台上,比方Oracle、DB2、Sybase、SQLServer、Informix等等。在这个情况里,代码的可移殖性和可保护性正变得愈来愈主要。从一个数据库平台到另外一个数据库平台移植代码长短常庞大的而且要消费大批工夫,由于数据库供给厂商都利用他们本人专有的历程言语(比方Oracle利用PL/SQL,而Sybase和SQLServer利用Transact-SQL)。
  近几年来,Oracle开辟职员都一向在利用PL/SQL|(一种供应了到干系数据库言语SQL的历程扩大部分的言语)来构建办理大批的数据阵列的庞大体系。不幸的是,用PL/SQL写的存储历程只能在Oracle数据库运转。可是SQL开辟者有了一种写代码的强无力的工具,能够很简单的移植到其他的数据库-这就是Java,由于它在跨平台开辟和国际互联收集上的壮大功效是它成为盛行的开辟言语。Java答应的一致的、可移植的使用软件开辟办理举措能够在复杂的、低本钱的的IT基础举措措施上实行,以是次要的开辟工具供给厂商和设备供给者都撑持Java。居于向导位置的软件供给厂商,比方Oracle和IBM,都在他们的数据库和其他的使用程序平台上整合了Java假造机(JVM)。ORACLE数据库办理体系公司在Oracle8i中引进了对Java的扩大撑持功效。在Oracle中,有两种利用Java的基础办法:
  JDBC:就像ODBC一样,它供应了一个基于驱动程序的接口,同意从Java使用程序中会见Oracle数据库。
  SQLJ:这是多个厂商通力合作的了局,是一种新的言语,能供应在Java代码中静态SQL的撑持。实际上,它供应了比JDBC更年夜水平的程序员休息临盆率。
  在Oracle8i数据库服务器里集成JVM是在比来几年中Oracle引进的最主要的手艺刷新之一。集成JVM的Oracle,叫做JServer(亦称AuroraJVM),撑持两种分歧的程序计划模子∶
  和SQL集成,同意用户利用Java编写传统的数据库存储历程、函数和触发器。
  用于散布式Java组件的事件服务器平台,称作企业JavaBeans,同意程序员开辟可反复利用的服务器端使用程序组件。
  在本文中,我次要报告一下在Oracle8i中SQL和Java集成。也就是说,Java能够挪用SQL和PL/SQL,PL/SQL和SQL也能够挪用Java。Java程序挪用它们利用JDBC驱动程序的SQL和PL/SQL复本,而JDBC驱动程序是嵌进驻留在Oracle8i数据库中的JVM系统布局中的。另外一方面,从SQL和PL/SQL到Java,Oracle8i供应了二个特征。在Oracle8i中,Java称号空间映照到数据库形式,易于附属物同意Java被保留在数据库中。Oracle8i也供应扩大的DataDefinitionLanguage(数据界说言语DDL),比方CREATEPROCEDUREASJAVA命令,因而Java代码很简单内嵌进Oracle8i中。
  SQLJ是甚么?
  SQLJ是一种同意把静态的SQL语句以文本情势嵌进Java程序中的言语。在写一个SQLJ使用程序时,我们编写一段Java程序然后遵守某些特定的尺度法例把SQL语句嵌进在个中,这些法例界说了SQL语句如何写进Java程序(详细情形请看Oracle8iSQLJ开辟指南与参考,你能够在DocumentationLibrary光盘上找到)。
接上去,我们运转一个SQLJ翻译器,经由过程把嵌进式布局化查询语句交换为挪用挪用SQLJ运转时程序库的体例把SQLJ程序转换成一个尺度的Java程序。天生的Java程序就能够利用任何尺度的Java编译程序(比方javac)来编译了然后就能够共同数据库利用了。SQLJ运转期情况是由一个瘦(即没有分外体系开支)SQLJ运转时程序库构成,也就是说用纯Java完成挪用响应的数据库(Oracle,DB2等等)的JDBC驱动程序。
  SQLJ相似于其他的嵌进式布局化查询言语的完成,像OraclePro*C(嵌进C言语情况的SQL)。SQLJ言语计划的目标就是匡助基于Java的程序员构建数据库使用程序。SQLJ是一个ISO和ANSI尺度,也就是说由领头的数据库与软件供给厂商开辟和撑持的,包含ORACLE数据库办理体系公司,国际贸易呆板公司,美国赛贝斯公司,Informix公司,美国康柏公司等。一切这些公司互助开辟兼容的SQLJ翻译器来完成利用分歧的数据库。
SQLJ的长处
  一个编译过的SQLJ使用程序是一个尺度的Java程序,能够在任何具有三个组件的情况中运转,这三个组件是:JVM,SQLJ运转时程序库和JDBC驱动程序。
  它供应了以下优点∶
  松散的代码SQLJ代码比JDBC代码加倍松散而且无不对。在编译时对语法和语义举行反省。SQLJ编译器供应了范例反省和形式工具反省来找出在SQL语句中的语法毛病或漏掉或拼错如许的毛病,这是在编译过程当中举行而不是在运转过程当中举行。因而,利用SQLJ编写的程序比利用JDBC编写的程序加倍强健。
  多厂商互用性SQLJ语法是由次要的软件供给厂商开辟和撑持的。由于SQLJ程序利用运转时JDBC挪用会见数据库,以是SQLJ能够会见任何JDBC驱动程序能够完成的数据库服务器。
  天真的部署由于SQLJ运转时程序库是基于Java的程序,以是SQLJ使用程序能够在任何JDBC设置情况中设置,比方瘦客户端,两头层或是数据库服务器上等。
  供给厂商详细定制 SQLJ经由过程后续的Java字节码的定制撑持供给厂商详细产物的特征和扩大。它能够被用来改良SQL查询言语的实行功能,利用详细供给厂商供应的功能或功效上的扩大,而不必思索SQLJ程序怎样变更,和调试和运转纪录等情形。
 
  利用SQLJ的开辟步骤
  上面是开辟和运转一个SQLJ使用程序所必要做的事变:
  利用SQLJ编译器编译SQLJ源文件。这一步天生挪用SQLJ运转时的Java文件,和二进制的SQLJ形貌文件--包含存在于SQLJ源文件中的静态SQL语句的有关信息。利用Java编译程序编译Java代码。在编纂完成以后,天生的形貌文件是利用特定命据库数据范例,扩大和特性功能定制的。
  运转使用程序,利用SQLJ运转时程序库和特定命据库的JDBC驱动程序。举例来讲,假如你的主.sqlj文件界说类MyClass,那末源文件名必需是MyClass.sqlj。编译器天生MyClass.java源文件,然后编译程序天生MyClass.class类文件。并且,翻译器和编译程序二者都天生profile-key类,MyClass_SJProfileKeys.class。翻译器依据你如何声明它们来定名迭代程序类与毗连高低文类。举例来讲,假如你声明一个迭代程序,MyIter,将天生一个MyIter.class类文件。
  上面是设置SQLJ的需要前提∶
   SQLJ运转时程序库
   JDBC驱动程序,比方:JDBC/ODBC桥,OracleJDBC/OCI驱动程序,Oracle瘦JDBC驱动程序,DB2JDBC驱动程序等等。
   SQLJ程序将实行的JVM
  如今让我们对照SQLJ和JDBC,并对照SQLJ/JDBC和PL/SQL。
  SQLJ与JDBC
  SQLJ开辟的目标是完美静态JDBCSQL布局化查询言语模子和静态的SQL布局化查询言语模子。与ODBC和JDBC静态模子分歧,静态模子供应强范例使用程序翻译工夫反省。这些不但请求举行SQL语法的编译时查验和SQL语句利用的主机变量的范例兼容,并且查询自己的准确性与数据库模子中的表,视图,存储历程等等的界说有关。由于一切的SQL语句都要被编译,SQLJ能够作为一本性能更好的两头媒质。
SQLJ代码与JDBC代码
  关于有输出参数的SQL语句,SQLJ类一般比等价的静态的SQL语句(JDBC)挪用冗长,由于SQLJ使用主机变量把参数传送到SQL语句中,当JDBC请求一个独自的语句把个个参数绑缚起来,检索每一个了局。上面是一条SELECT语句的SQLJ代码片段:
 
StringvName;intvSalary;StringvJob;Java.sql.TimestampvDate;
...
#sql{SELECTEname,Sal
INTO:vName,:vSalary
FROMEmp
WHEREJob=:vJobandHireDate=:vDate};
  上面是不异的SELECT语句的JDBC代码碎片:

StringvName;intvSalary;StringvJob;Java.sql.TimestampvDate;
...
PreparedStatementstmt=connection.prepareStatement(
"SELECTEname,Sal"+
"INTO:vName,:vSalary"+
"FROMEmp"+
"WHEREJob=:vJobandHireDate=:vDate");
stmt.setString(1,vJob);
stmt.setTimestamp(2,vDate);
ResultSetrs=stmt.executeQuery();
rs.next();
vName=rs.getString(1);
vSalary=rs.getInt(2);
rs.close();

  我们能够看到,间接在一个Java程序中嵌进SQL语句可以天生比JDBC加倍简明易读的代码。因而,SQLJ在Java使用程序无数据库会见必要的时分,削减了开辟工夫和维修价值。SQLJ程序能够在统一个源文件中很简单地与JDBC代码互相感化来做到静态的SQL语句挪用,大概你也能够在SQLJ语句中利用PL/SQL语句块来完成这个目标。别的,Oracle9i增添了在SQLJ代码间接撑持静态SQL的功效。
  Java(SQLJ和JDBC)与Oracle数据库中的PL/SQL对照:
  Oracle数据库使用程序中的利用的Java还不克不及够替换PL/SQL。Java和PL/SQL相反相成,Java(SQLJ/JDBC)有以下优于PL/SQL的中央:Java可以供应主要的功能上风,Java存储历程要快5到100倍,这次要取决于程序中利用的数学操纵符和数据范例。实际上说,Java存储历程能够很简单的转化成运转在别的数据库上的存储历程。Java程序能够在一个庞大的使用程序的任何一层上设置∶在客户端上,在两头层的使用程序服务器上大概在数据库服务器自己中。Java(SQLJ/JDBC)也一样“分享”了PL/SQL的不敷的地方:PL/SQL与Oracle数据库服务器严密地分离起来,Oracle在近20年的工夫中不休的改善PL/SQL,而Java只在1998年的时分才被引进Oracle8i。PL/SQL数据范例等价于Oracle当地数据范例,以是不必要举行数据范例的换算。在另外一方面,JDBC提出在Java代码和SQL语句之间拔出一个一般的层,而SQLJ是又一个层。PL/SQL事情功能比Java好,由于是以数据库为中央编程:PL/SQL存储历程比Java程序快1.5倍(关于OLTP联机事件处置)到2.5倍(用于批处置)。别的,Java程序要利用比PL/SQL更多的CPU资本。CPU分外开支的增添多是由于要举行一个对照长的编码历程和从Oracle到Java的分外的数据范例转换。
  一个二者分身到达最好效果的办理计划
  Oracle供应了一个幻想的情况用于使用PL/SQL和Java言语二者的长处。在一方面,PL/SQL程序能够挪用SQLJ和JDBC存储历程,同意你构建基于组件的EJB和CORBA使用程序。现有的Java类库能够很简单地被使用,并经由过程利用PL/SQL挪用标准来整合进数据库代码开辟过程当中。在另外一方面,Java程序能够经由过程JDBC大概SQLJ挪用PL/SQL存储历程,函数和匿名的程序块。我上面想逐一具体先容,SQLJ供应用于挪用上面这些内容的语法:
  存储历程:利用CALL操纵符挪用UpdateSalary程序∶

#sql{CALLUpdateSalary};
函数:<0}{0>tocalltheGetName()functionusingtheVALUESoperator:<}0{>利用VALUES操纵符挪用GetName()函数∶<0}
{0>Stringname;<}0{>Stringname;<0}
#sql{name={VALUESGetName()};
orbyusingtheSEToperator:
Stringname;
#sql{SET:name=GetName()};
{0>AnonymousPL/SQLblocks:<}0{>匿名的PL/SQL程序块∶<0}
#sql{[DECLARE...]BEGIN...END;};
  必要注重的是影响决意利用甚么言语的要素,不但由实行效果断定--说得更准确些,一个当今使用程序开辟过程当中的次要要素,并且由程序员休息临盆率、可取得的专家的定见和笨重性决意。亏得关于数据库开辟职员,不用在几种言语当选来选往,你能够很简单地把Java(SQLJ和JDBC)与PL/SQL存储程序夹杂搭配进一个数据库来获得一个二者分身到达最好效果的办理计划。
SQLJ言语元素
  SQLJ是正在开展的产业尺度言语,同意你利用自力于数据库代码的Oracle存储历程,能够很简单地移植到其他的可以使用Java的数据库平台。晓得毗连高低文,迭代程序,可实行语句和主表达式的情形,那末你就能够把一些实践的SQLJ语句用到实际的使用程序中。
 
  在前文中,我形貌了SQLJ是甚么,对照了PL/SQL和JDBC,而且研讨了SQLJ的优点。在本文中,我将研讨一下SQLJ编程言语的基本,如许你就能够在实际的使用程序中利用SQLJ了。SQLJ程序是一个利用嵌进式布局化扣问言语语句的划定规矩的Java程序,以一个#_sql标志入手下手并以一分号停止。有二类SQLJ语句∶声明和可实行语句。声明语句声了然毗连高低文和迭代程序。毗连高低文用来创建数据库毗连,而迭代程序被用来存储由SQL查询前往的了局集;可实行语句实行嵌进式布局化扣问语句和PL/SQL程序块。由于SQLJ程序将要被翻译然后经由过程JDBC运转,任何JDBC驱动程序撑持的SQLJ语句大概内嵌在一个SQLJ可实行语句中。可实行语句大概同时包括主表达式,在Java程序和数据库之间经由过程Java变量互换信息。
  OracleJDBC驱动程序
  Oracle供应以下JDBC驱动程序∶
  客户端瘦驱动程序是一个100%纯Java驱动程序,用于在没有安装Oracle的客户端。Oracle保举利用小使用程序。当Java小使用程序运转的时分,它能够下载到扫瞄器中。
  OCI驱动程序(OCI8和OCI7)是用于安装了Oracle客户端程序的客户端。OracleJDBCOCI驱动程序经由过程挪用Oracle挪用界面(OCI)间接从Java会见数据库,供应与分歧版本的Oracle7,Oracle8和8i之间最年夜的兼容性。这些驱动程序请求Oracle客户程序安装Net8。服务器端瘦驱动程序供应了与客户端瘦驱动程序不异的函数,可是在一个Oracle数据库内运转而且会见一个远程数据库。这关于从一个担当两头层的Oracle服务器上会见远程Oracle服务器是很有效的,大概,更复杂一些来讲,从一个层内会见另外一个Oracle服务器,比方从某一个Java存储历程大概EJB内会见Oracle服务器。
  服务器端外部驱动程序,称为KPRB(KernelProgramBundled),供应对任安在实行SQL操纵的目标Oracle数据库内运转的Java代码的撑持。服务器端外部驱动程序同意JServerJVM间接与SQL引擎通讯。这是一个默许的用于在Oracle8i/9i服务器上运转SQLJ代码的JDBC驱动程序,这些SQLJ代码用作存储历程,存储函数,触发器,EJB或CORBA工具。KPRBJDBC驱动程序十分笨重可是效力高,而且在OracleJServer内运转出格地可以做到精美绝伦。这就是我们要来写SQLJ存储历程所用的驱动程序。让我们来研讨一下形貌的SQLJ元素,一一先容:毗连高低文,迭代程序,可实行语句和主表达式。
  毗连高低文用于单连续接,你可使用DefaultContext类的一个实例并在机关DefaultContext工具时指定命据库URL,用户名和口令。这是利用Oracle公司供应的oracle.sqlj.runtime.Oracle类的connect()办法的最简单的办法。在本例中,我们将要利用JDBC瘦驱动程序和用户名"scott"和口令"tiger"来经由过程端口1521毗连MYSERVER服务器上的数据库,在这个服务器里,数据库的SID是ORCL∶
Oracle.connect("jdbc:oracle:thin@MYSERVER:1521:ORCL","scott","tiger");它创立DefaultContext类的一个实例而且把它作为默许毗连。其实不必定必要间接利用DefaultContext的实例做任何事变。关于多重毗连,你能够创立并经由过程利用Oracle.getConnection()办法来利用DefaultContext类的帮助实例。在本例子中,你将利用OracleOCI8驱动程序利用MYSERVER_ORCL作为Oracle服务名,在TNSNames.ora文件中创立做为一个ORCL实例∶

DefaultContextmyContext1=Oracle.getConnection
("jdbc:oracle:oci8@MYSERVER_ORCL","scott","tiger");
DefaultContextmyContext2=Oracle.getConnection
("jdbc:oracle:oci8@MYSERVER_ORCL","tom","bear");
  这段代码创立二个毗连高低文实例,它们两个都利用不异的OracleOCI8驱动程序,可是分歧的形式。你能够经由过程利用为每一个语句指定毗连形式的办法在两个分歧的形式中实行SQL操纵。

#sql[myContext1]{SQLstatement};
...
#sql[myContext2]{SQLstatement};
  在这个程序的开头,我们必要封闭在FINALLY子句和TRY/CATCH语句块中的毗连。

finally
{
#sql[myContext1]{commit};
myContext1.close();
#sql[myContext2]{commit};
myContext2.close();
}
...

迭代程序
  在SQLJ程序中,SQL查询前往的了局集能够作为一个迭代程序工具,用来保留数据。迭代程序工具是迭代程序类的一个实例,而且在观点上相似于PL/SQL游标。我们必需实行上面的五个步骤来利用迭代程序处置SQL查询前往的数据。
   声明迭代程序类。
   从迭代程序类声明一个迭代程序工具。
   利用SELECT语句增加迭代程序工具。
   从迭代程序工具中读取数据。
   封闭迭代程序工具。
  有二品种型的迭代程序类∶
   定名的迭代程序,在这类范例中,Java变量范例和迭代程序列名都必需被指定。
   地位迭代程序,在这个范例中,只要用于从数据库中检索失掉的列的Java变量范例必要指定。
  定名迭代程序∶一个定名迭代程序声明指定了列存取器名和它们的Java范例。
  让我们来演示一下利用这个例程的五个步骤,在本例中我们想检索雇员表Emp中的Ename,Job和HireDate列,查找人为年夜于1500的雇员。
  声明迭代程序类∶

#sqliteratorEmpIteratorClass(StringEname,StringJob,TimestampHireDate);
  我们利用JavaString类来暗示Ename和Job列,由于它兼容OracleVARCHAR2数据库范例。
  java.sql.Timestamp范例用于HireDate列(Oracle的日期范例),由于java.sql.Date范例只能保留年份,日期和工夫信息,而不克不及象java.sql.Timestamp一样保留小时,分钟和秒。
  从迭代程序类中声明迭代程序工具∶
   EmpIteratorClassempIterator;
  利用SQLSELECT语句增加迭代程序工具。
  以下SQLJ语句把Emp表的Ename,Job和HireDate列中的内容到场empIterator工具∶

intsalary=1500;
#sqlempIterator={
selectEname,Job,HireDate
fromEmp
whereSal>:salary
};
  我们还要声明主变量salary,用于WHERE子句中来标识要从Emp表中前往甚么数据。
  记着,经由过程SQL查询前往的数据库列的称号必需对应于第一步中界说迭代程序列名。从迭代程序工具中读取数据。由于迭代程序工具大概包括多个行,以是我们必要利用一个轮回来会见每行数据,就象我们从PL/SQL游标中读取数据一样。定名迭代程序完成一个next()办法,同意你在迭代程序工具的数据之间挪动。别的,SQLJ还供应了检索迭代程序列的值得存取办法。以下代码在一个轮回中打印出雇员姓名,职务和招聘日期。
while(empIterator.next()){
System.out.println("Name:"+empIterator.Ename());
System.out.println("Job:"+empIterator.Job());
System.out.println("HireDate:"+
empIterator.HireDate().toString());
}
empIterator.close();
封闭迭代程序工具∶<0}
empIterator.close();
  程序段一把从第2步到第5步联合起来演示了利用了定名迭代程序和empSalary参数的listEmployees()办法。地位迭代程序∶与定名迭代程序相反,地位迭代程序只是指定了列的数量和品种,而不是它们的称号。列数据能够只经由过程地位会见,经由过程传统的FETCH...INTO语法。除利用FETCH语句以外,还必要利用地位迭代程序办法endFetch()来检测停止前提从而从轮回中跳出。可是必需在会见所必要获得的数据之间反省前提。
  上面是不异的五个步骤,演示怎样利用地位迭代程序:
  声明迭代程序类∶
   #sqliteratorEmpIteratorClass(String,String,Timestamp);
  从迭代程序类中声明迭代程序工具。还必需声明从迭代程序工具中获得的数据所必须的主变量。

EmpIteratorClassempIterator;
Stringname=null;
Stringjob=null;
TimestamphireDate=null;
  利用SQLSELECT语句到场迭代程序工具∶

intsalary=1500;
#sqlempIterator={
selectEname,Job,HireDate
fromEmp
whereSal>:salary
};
  把数据从迭代程序工具中读进主机变量∶

while(true){
#sql{FETCH:empIteratorINTO:name,:job,:hireDate};
if(empIterator.endFetch()){
break;
}
System.out.println("Name:"+name);
System.out.println("Job:"+job);
System.out.println("HireDate:"+hireDate().toString());
}

  封闭迭代程序工具
   empIterator.close();
  把从第2步到第5步联合起来演示了利用了地位迭代程序和empSalary参数的listEmployees()办法。可见,地位迭代程序工具所利用的语法很像PL/SQL游标的语法。定名迭代程序和地位迭代程序二者都实行基础不异的功效∶它们都保留SQL查询的了局,有大概仍是良多行数据至于究竟利用哪种迭代程序则要看情形或是依据本人的偏幸;从功能角度下去看呢,它们发生的了局都是一样的。
可实行语句
  可实行的SQLJ语句在一对年夜括号内包括了静态的SQL操纵。有两种大概的可实行语句,由SQL是不是返来一个值来决意。上面是一个不前往值的嵌进式SQL语句的例子;它在Emp表的Ename列和Sal列上创立一个复合索引∶
#sql{createindexEMP_ENAME_SALonEmp(Ename,Sal)};
  假如一个嵌进式SQL语句前往值的话,你必要利用一个主机变量来指定了局应当放在甚么中央。在本例子中,挪用PL/SQL函数getSalary前往雇员号Empno为7900的雇员的人为。你可使用VALUES大概SET运算符来挪用函数;也就是说,

intsalary;
intempNo=7900;
#sqlsalary={VALUESgetSalary(:empNo}};
or
#sql{SET:salary=getSalary(:empNo)};
  主机表达式
  在下面的例子中,我们能够看到,主机变量同意SQLJ程序在数据库和Java程序之间互换信息。它们是任安在Java程序中声明的变量。主机变量被嵌进到SQLJ语句里,称作主机表达式。主机表达式把主机变量绑定在SQLJ可实行语句上,它们也大概包含Java数组元素,工具属性大概Java函数。SQLJ卖力在SQL和Java情况之间往返挪动数据。一切的尺度JDBC范例-象Boolean,byte,short,int,String,byte[],double,float,java.sql.Date等等。―都是SQLJ中无效的主机表达式。别的,Oracle的SQLJ翻译器撑持利用Oracle数据库范例,比方ROWID,CLOB,BLOB和Object和REF范例。在本文中,我会商了编写实践的SQLJ代码所必须用到的SQLJ工具范例:毗连高低文,定名和地位迭代程序,可实行语句和主机表达式。在今后的文章里,我想编写一个服务器端SQLJ程序,编译它,然后把它设置进OracleJServer并把它PL/SQL对应的程序举行功能上的对照。
代码段1
publicstaticvoidlistEmployees(StringempSalary)
throwsSQLException{
EmpIteratorClassempIterator;
Integersalary=newInteger(empSalary);
try{
#sqlempIterator={
selectEname,Job,HireDate
fromEmp
whereSal>:salary
};
while(empIterator.next()){
System.out.println("Name:"+empIterator.Ename());
System.out.println("Job:"+empIterator.Job());
System.out.println("HireDate:"+
empIterator.HireDate().toString());
}
empIterator.close();
}catch(SQLExceptione){
System.err.println("SQLException"+e);
System.exit(1);
}
}
代码段2
publicstaticvoidlistEmployees(StringempSalary)
throwsSQLException{
EmpIteratorClassempIterator;
Integersalary=newInteger(empSalary);
/*主机变量*/
Stringname=null;
Stringjob=null;
TimestamphireDate=null;
try{
#sqlempIterator={
selectEname,Job,HireDate
fromEmp
whereSal>:salary
};
while(true){
#sql{FETCH:empIteratorINTO:name,:job,:hireDate};
if(empIterator.endFetch()){
break;
}

System.out.println("Name:"+name);
System.out.println("Job:"+job);
System.out.println("HireDate:"+hireDate().toString());
}
empIterator.close();
}catch(SQLExceptione){
System.err.println("SQLException"+e);
System.exit(1);
}
}


其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
若天明 该用户已被删除
沙发
发表于 2015-1-19 09:35:24 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-25 16:09:30 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
蒙在股里 该用户已被删除
地板
发表于 2015-2-3 09:31:28 | 只看该作者
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
若相依 该用户已被删除
5#
发表于 2015-2-8 20:12:48 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
第二个灵魂 该用户已被删除
6#
发表于 2015-2-26 03:44:09 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
小妖女 该用户已被删除
7#
发表于 2015-3-8 11:46:12 | 只看该作者
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
小女巫 该用户已被删除
8#
发表于 2015-3-15 22:26:51 | 只看该作者
我个人认为就是孜孜不懈的学习
谁可相欹 该用户已被删除
9#
发表于 2015-3-22 17:10:39 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 17:36

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表