23动态SQL基本知识_第1页
23动态SQL基本知识_第2页
23动态SQL基本知识_第3页
23动态SQL基本知识_第4页
23动态SQL基本知识_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

弟一十二章动态SQL基本知识动态SQL基本知识本章结后你将能够:•了解动态SQL及相关的数据结构和命令.动态SQL动态SQL基本知识本章的目标列在上面。什么时候使用动态SQL•前端(用户进程或程序)和后端(数据库服务器进程或引擎)传送的数据的个数和类型不知道•SQL语句的结构不知道由融海咨询动态SQL基本知识上面的幻灯列出了要使用动态SQL语句的情形。要使用动态SQL语句的一个例子是在DBAccess或isql应用中输入的查询。DBAccess应用程序对查询的内容一无所知,直到要执行查询的时候才知道。执行的时候,它必须判明查询的类型,把什么样的数据送往数据库引擎,如果引擎有返回结果的话,是什么类型的数据。什么是非动态SQL语句?在编译时知道SQL语句的一切信息.例子:$UPDATEcustomerSET(phone="356-3600")

WHERElname="Sadler”;$SELECTfname,lnameFROMcustomer

WHEREcustomer_num=101;非动态SQL语句在编译的时候,有关SQL语句所有的信息都知道。

如果涉及到的变量的数目和它们的数据类型都知道,于是使用宿主变量可以很容易就解决该问题。宿主变量应该与相应的字段有同样的数据类型。宿主变量应该足够长以存放数据。动态SQL语句请输入以下SQL语句动态SQL语句SELECTfname,lnameFROMcustomerWHEREcustomer_num=102;你如何知道:?该查询语句中有多少个字段?它们是什么类型?长度是多少?是否有条件子句?是否是一个update语句,Insert语句,或是一个delete或select语句?J动态SQL基本知识如果不知道字段选择列表中字段的数目或它们的数据类型或它们的长度,则没有办法为它们定义宿主变量。在这种情况下,必须使用动态SQL语句。如果没有WHERE子句,一条DELETE或UPDATE语句将影响到表中所有的记录,当使用PREPARE语句时,会产生警告信息。处理动态SQL步骤•?装配语句文本•?用PREPARE预备语句•?用EXECUTE/OPEN或FETCH执行语句-用FREE释放资源动态SQL基本知识装配收集来自用户输入的语句文本。动态SQL基本知识PREPARE执行PREPARE语句来准备语句。EXECUTE/OPEN-FETCH如果它是一条没有〃INTOTEMP^子句的SELECT语句,应使用后面跟有FETCH语句的OPEN语句。否则,使用EXECUTE语句来执行标识符指明的语句。FREE释放分配给语句的资源。PREPARE语句更多的信息PREPAREstatementid―rPREPAREstatementid―rFROMquotedstring—statementid—1

variable1—variablename—?缺省情况下,语句标识在5.0是全局有效而在4.1则局部有效。使用?作为动态数据的占位符.动态SQL基本知识动态SQL基本知识动态SQL基本知识如果一条语句要反复执行,最好先准备该语句,然后再执行它。PREPARE把语句送给后端并请求后端对语句进行语法分析和为它分配空间。通过先使用PREPARE来准备语句,可以在语句反复执行时,减少前后端之间的通讯。

PREPARE语句的限制不能用PREPARE语句预备"SELECT...INTO?..."语句另外也不能对以下语句所有PREPAREclosedeclareexecuteexecuteimmediatefreeput

fetchopenwheneverPREPARE语句的限制closedeclareexecuteflushdeclare动态SQL基本知识可以只使用占位符来给表达式提供值。但是,不能使用?占位符来表示诸如数据库名表名或字段名之类的数据库对象的标识符。

EXECUTE语句不能用来从数据库返回数据。由于这个原因,不能执行一条把数据从数据库中检索到宿主变量中的SELECT语句。但是,可以执行一条把数据存放到临时表中的SELECT语句(otemp...)。EXECUTE语句中的IMMEDIATE子句可以绕过开始的准备语句这一步,它可以在一个步骤里既准备又执行SQL语句。

FREE更多的信息动态SQL基本知识cursorvariablestatementFREE更多的信息动态SQL基本知识cursorvariablestatementidstatementidvariableFREEcursoridFREE语句使用游标标识符/游标变量来释放分配给游标的资源。FREE语句使用语句标识符/语句标识符变量来释放分配给准备的语句标识符/语句标识符变量的资源。如果为一个准备的语句定义了游标,释放游标仅释放数据库服务器中的资源。为给应用程序开发工具中的语句释放资源,使用:FREE语句标识符。如果没有为准备的语句定义游标,释放游标将为应用程序开发工具和数据库服务器两者释放资源。FREE语句允许再次使用游标标识符。向后兼容动态SQL基本知识动态SQL基本知识动态语句管理的两种方法系统描述符区域•语言独立性.与X/Open标准一致•内部仍然分配sqldaSQLDA•依赖语言.与X/Open标准不一致•向后兼容向后兼容动态SQL基本知识动态SQL基本知识系统描述区方法使得一个语言独立于要用来处理动态查询的语句序列。它可以在Informix5.0版本和以后的ESQL产品中使用。产品包括ESQL/C、ESQL/COBOL、ESQL/ADA和ESQL/FORTRAN。sqlda方法在5.0的ESQL/C之前和之后的产品中都可以使用。

COUNT=2DATATYPELENGTHINDICATORNAMESCALEPRECISIONNULLABLEIDATAITYPEILENGTH—datatypeLENGTH♦♦♦VALUE1VALUE2ILENGTH系统描述符区域系统描述符区域COUNT系统描述区中的变量项目或occurrences的数目。DATATYPELENGTH传送给数据库引擎或从引擎接收的数据。一个短整数,对应于传送的数据的类型。一个短整数,给出CHAR类型的数据、DATETIME或INTERVAL数据的编码修饰符的字节大小,或一个DECIMAL或MONEY值的大小。INDICATORNAMESCALE,PRECISION非NULL值为0,NULL值为-1。字段名。如果相应的项目是DECIMAL或MONEY类型,设置这些域。LENGTH域根据提供的SCALE和PRECISION来设置。NULLABLE1,表示该字段允许空值;0,表示该字段不允许空值。IDATA,ITYPE,ILENGTH用户定义的指示变量的数据、类型和长度域。才指示变量可以是任何合法的宿主变量类型,除了DATETIME或INTERVAL。动态SQL基本知识

SQLDA结构structsqlvar_struct{TOC\o"1-5"\h\zshortsqltype;/*variabletype*/shortsqllen;/*lengthinbytes*/char*sqldata;/*pointertodata*/short*sqlind;/*pointertoindicator*/char*sqlname;/*columnname*/char*sqlformat;/*reservedforfutureuse*/shortsqlitype;/*indvariabletype*/shortsqlilen;/*indicatorlengthinbytes*/char*sqlidata;/*indicatordatapointer*/};structsqlda/*numberofitemssqlvarpointsto*/{shortsqld;structsqlvar_struct*sqlvar;SQLDA结构VI电融海咨询动态SQL基本知识sqldsqlvarsqltypesqllen一个短整数,表示sqlvar数组中的值的个数。指向sqlvar_struct结构数组的指针。一个短整数,对应于传送的数据的类型。字符数组(对于CHAR和VARCHAR)的字节大小;DATETIME和INTERVAL类型的编码修饰符的字节大小。sqldatasqlindsqlname指向字符数据的指针。指向短整型指示变量的指针。指向字符数组的指针,数组中存放字段名或传送的显示标签。sqlformatsqlitypesqlilensqlidata保留,供以后使用。短整数指示变量的类型。短整数指示变量的字节长度。指向字符指示数据的指针。ConstantCDataTypeIntegerValueCCHARTYPEchar100CSHORTTYPEshortint101CINTTYPEint102CLONGTYPElong103CFLOATTYPEfloat104CDOUBLETYPEdouble105CDECIMALTYPEdec_torstructdecimal106CFIXCHARTYPEfixchar107CSTRINGTYPEstring108CDATETYPElong109CMONEYTYPEdec_torstructdecimal110CDTIMETYPEdtime_torstructdtime111CLOCATORTYPEloc_t112CVCHARTYPEvarchar113CINVTYPEintrvl_torstructintrvl114CFILETYPEchar115116预先定义的常数这些值用于设置sqlda中的sqltype域.惭融海咨询动态SQL基本知识这些值同系统描述区一起使用,它们仅在设置sqlca结构中的sqltype域时使用。预先定义的常数动态动态SQL基本知识ConstantSQLDataTypeINTEGERVALUESQLCHARCHAR0SQLSMINTSMALLINT1SQLINTINTEGER2SQLFLOATFLOAT3SQLSMFLOATSMALLFLOAT4SQLDECIMALDECIMAL5SQLSERIALSERIAL6SQLDATEDATE7SQLMONEYMONEY8SQLDTIMEDATETIME10SQLBYTESBYTE11SQLTEXTTEXT12SQLVCHARVARCHAR13SQLINTEGERVALINTERVAL14\这些定义的常数由DESCRIBE语句返回惭融海咨询如果编译时使用了-xopen标志,则在SETDESCRIPTOR语句中不能使用上面列出的依赖于语言常数的整型值。必须使用下面列出的值,以保证X/Open兼容性。这些值在$includesqlxtype.h中定义。ConstantSQLDataTypeIntegerValueXSQLCHARCHAR1XSQLSMINTSMALLINT5XSQLINTINTEGER4XSQLFLOATFLOAT6XSQLDECIMALECIMAL3

#define#define#defineSQLTYPESQLNONULLSQLMAXTYPES0xF0x10015/*typemask*//*disallownulls*/#defineSQLHOST01000/*Note:octal,nothex*/#defineSQLNETFLT02000/*float-to-decimalfornetworkedbackend*/预先定义的宏#define#defineMASKNONULL(t)ISSQLTYPE(t)/*SQLtypesmacros*/#defineISDECTYPE(t)#define#define#define#defineISBLOBTYPE(type)ISBYTETYPE(type)ISTEXTTYPE(type)ISVCTYPE(t)(MASKNONULL(t)==SQLDECIMALII#define#defineMASKNONULL(t)ISSQLTYPE(t)/*SQLtypesmacros*/#defineISDECTYPE(t)#define#define#define#defineISBLOBTYPE(type)ISBYTETYPE(type)ISTEXTTYPE(type)ISVCTYPE(t)(MASKNONULL(t)==SQLDECIMALII\MASKNONULL(t)==SQLMONEYII\MASKNONULL(t)==SQLDTIMEII\MASKNONULL(t)==SQLINTERVAL)(ISBYTESTYPE(type)IIISTEXTTYPE(type))(MASKNONULL(type)==SQLBYTES)(MASKNONULL(type)==SQLTEXT)(MASKNONULL(t)==SQLVCHAR)惭融海咨询动态SQL基本知识这些宏可以用来判明一个域的数据类型。常数及文件sqlstype.hStatementUPDATE...WHEREDELETE...WHEREINSERT常数及文件sqlstype.hStatementUPDATE...WHEREDELETE...WHEREINSERTUPDATEWHERECURRENTOFDELETEWHERECURRENTOFLOADFROMINSERTINTOLOCKDELETEwithoutWHEREUPDATEwithoutWHEREDefinedConstantValueSQ_UPDATE4SQ_DELETE5SQ_INSERT6SQ_UPDCURR7SQ_DELCURR8SQ_LDINSERT9SQ_LOCK10...SQ_DELALL...32SQ_UPDALL33动态SQL基本知识DESCRIBLE语句把描述的语句的类型存放到SQLCODE(sql.sqlcode)中。可以通过检测该值来判断语句的类型以及是否有WHERE子句。动态SQL内存管理SQLDA?malloc?free?DESCRIBE系统描述符区域ALLOCATEDESCRIPTORDEALLOCATEDESCRIPTORDESCRIBEGETDESCRIPTORSQLDA?malloc?free?DESCRIBE必须分配内存给SELECT语句返回的数据。当使用系统描述区时,可以使用ALLOCATEDESCRIPTOR语句。当使用sqlda时,应用程序必须为sqlda结构指向的数据域分配空间。

ALLOCATEDESCRIPTOR为系统描述区分配内存空间,描述区由一个描述符或描述符变量来标识。每一项描述符存放有一个可以送往数据库服务器或从服务器接收的值。如果WITHMAX子句省略,occurrence使用缺省值100。一个occurrence对应于动态SQL语句中的一个占位符。

释放描述符动态SQL基本知识例子:$DEALLOCATE释放描述符动态SQL基本知识例子:$DEALLOCATEDESCRIPTOR"demodesc";DEALLOCATEDESCRIPTORdescriptor—descriptorvariable该语句:•释放一个系统描述区,该描述区先前分配给一个描述符或描述符变量。•无法释放SQLDA结构。DESCRIBE语句DESCRIBEstatementidUSINGSQL—"descriptor"DESCRIPTORstatementidDESCRIBEstatementidUSINGSQL—"descriptor"DESCRIPTORstatementid」

variabledescriptor

variableINTOsqldapointer例子:$ALLOCATEDESCRIPTOR"demodesc"WITHMAX6;$PREPAREdemostmtFROM"SELECT*FROMcustomer";$DESCRIBEdemostmtUSINGSQLDESCRIPTOR"demodesc";动态SQL基本知识动态SQL基本知识DESCRIBLE语句返回准备的语句的类型。对于一条SELECT或INSERT语句,返回来值的数目、数据类型和空间大小信息,以及查询返回的字段名称或表达式。返回的信息存放到系统描述区,或在ESQL/C中放到SQLDA结构里。如果准备的语句包含有UPDATE或DELETE语句,但没有WHERE子句,它把sqlca.sqlwarn.sqlwarflft值设置为,W,。DESCRIBLE语句不检查WHERE子句。当DESCRIBLE语句同SQLDA结构一起使用时,分配SQLDA结构。但是,如果是同系统描述区一起使用时,则不分配。系统描述区必须使用ALLOCATEDESCRIPTOR语句来分配。得到描述符信息GetDescriptor语句GETDESCRIPTOR「descriptor1—descriptor

variablenumber

variable例子:$GETDESCRIPTOR"demodesc":count=COUNT;$GETDESCRIPTOR"demodesc"VALUE1:type=TYPE,:length=LENGTH,:buf=DATA;融海咨询动态SQL基本知识GETDESCRIPTOR从系统描述变量获取信息,把它存放到所说明的宿主变量中。它完成二个任务:通过获取COUNT域的值判明系统描述区中有多少个值。•判明系统描述区中描述的字段或表达式的特征。在FETCH语句之后,把系统描述区的值拷贝到一个宿主变量中。DescibedItemInfofieldhost〒TYPE"LENGTHPRECISION^"SCALE-NULLABLE^"INDICATOR-NAME-DATAITYPE

"idata

-ILEN-设置描述符、SetDescriptor®句SETDESCRIPTOR--"descriptor"-丁COUNT=-value—descriptor-—count-variablevariableVALUE一itemnumberItemDescInfo例子:count=2;-item」numbervariable$SETDESCRIPTOR"demodesc"COUNT=:count;.$SETDESCRIPTOR"demodesc"VALUE2'•、type=0,length=15,data=:fname;惭融海咨询动态SQL基本知识在系统描述区中设置项目数、count域。设置系统描述区中的项目域。如果它是一个CHARACTER项目,必须设置LENGTH域。如果它是一个DATETIME或INTERVAL域,可以把DATA域设置为一个内部DATETIME或INTERVAL类型,或作为一个字符串。如果设置了一个字符串,必须把LENGTH

温馨提示

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

评论

0/150

提交评论