实际开发中的教程_第1页
实际开发中的教程_第2页
实际开发中的教程_第3页
实际开发中的教程_第4页
实际开发中的教程_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

实际开发中的教程第1页,共74页,2023年,2月20日,星期四Points3.宿主变量与指示变量4.嵌入SQL语句5.连接数据库6.错误处理1.PROC简介7.数据的存取更新操作8.动态sql2.PROC程序的编写步骤第2页,共74页,2023年,2月20日,星期四Pro程序通过在过程化编程语言中嵌入SQL语句而开发出的应用程序称为Pro程序。在通用编程语言中使用的SQL称为嵌入式SQL在SQL标准中定义了多种语言的嵌入式SQL各个厂商对嵌入式SQL的具体实现不同宿主语言 Pro程序C/C++ Pro*C/C++FORTRANPro*FORTRANPASCALPro*PASCALCOBOLPro*COBOLPL/I Pro*PL/IAda Pro*Ada第3页,共74页,2023年,2月20日,星期四Pro*C/C++程序在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序。目的:使c/c++这种高效率语言成为访问数据库的工具。第4页,共74页,2023年,2月20日,星期四Pro*C程序实例#include<stdio.h>EXECSQLBEGINDECLARESECTION;charusername[20];charpassword[20];charlast_name[25];EXECSQLENDDECLARESECTION;EXECSQLINCLUDEsqlca;voidsqlerror();main(){EXECSQLWHENEVERSQLERRORDOsqlerror();strcpy(username,"tarena");strcpy(password,"tarena");EXECSQLCONNECT:usernameIDENTIFIEDBY:password;

EXECSQLselectLAST_NAMEinto:last_namefromS_EMPwhereid=2;printf("\nID=2,last_name=%s\n",last_name);}voidsqlerror(){EXECSQLWHENEVERSQLERRORCONTINUE;printf("\n----oracleerrordetected:\n");printf("%.70s\n",sqlca.sqlerrm.sqlerrmc);EXECSQLROLLBACKWORKRELEASE;exit(1);}第5页,共74页,2023年,2月20日,星期四Include头文件(c/c++andpro*c/c++)定义变量定义函数main

连结数据库:connect

SQL操作语句:EXECSQL…….; exceptionhandler 断开连结:EXECSQLCOMMIT/ROLLBACKWORKreleasePROC程序结构第6页,共74页,2023年,2月20日,星期四一般应用程序(C)开发运行标准流程CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.c文件.o文件可执行文件第7页,共74页,2023年,2月20日,星期四%via_1.ca_2.c%gcc–ca_1.ca_2.c%gcc-oaa_1.oa_2.o一般应用程序(C)开发运行标准流程第8页,共74页,2023年,2月20日,星期四Pro*C程序开发运行流程.o文件可执行文件CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.pc文件PrecompileModifiedSourceProgram.c文件第9页,共74页,2023年,2月20日,星期四完成Pro*C源程序到纯C源程序的转换基本命令格式PROCINAME=filename[OptionName1=value1]…[OptionNameN=valueN]Pro*C预编译程序第10页,共74页,2023年,2月20日,星期四PROC常用预编译选项INAME=pathandfilename(nameoftheinputfile)ONAME=pathandfilename(nameoftheoutputfile)INCLUDE=path(头文件所在路径)--INCLUDE=路径名或INCLUDE=(路径名1,路径名2)PARSE=FULL|PARTIA|NONE(defaultFULLforC,OthersforC++)CODE=ANSI_C|CPP(defaultansi_c)USERID=username/password第11页,共74页,2023年,2月20日,星期四Pro*C程序开发运行流程Pro*C程序开发运行流程%via.pc%proca.pc%gcc-oaa.c-lclntsh--ComparePro*Candit’sCcode第12页,共74页,2023年,2月20日,星期四Pro*C++预编译程序Pre-compile:procmyf.pconame=myf.cppparse=nonecode=cpp2.Compile:g++-omyfilemyfile.cpp–lclntsh3.Execute: myfile#include<iostream>Usingnamespacestd;EXECSQLBEGINDECLARESECTION;charuser_passwd[20];EXECSQLENDDECLARESECTION;EXECSQlincludesqlca;main(){EXECSQLWHENEVERSQLERRORstop;strcpy(user_passwd,"tarena/tarena");EXECSQLCONNECT:user_passwd;cout<<"ConnectedtoORACLEasuser“<<,user_passwd;}第13页,共74页,2023年,2月20日,星期四宿主变量宿主变量是一种pro*c语言变量,用于在应用程序中和oracle数据库之间传递数据。Pro*C程序中,既可在SQL语句中引用,也可在C语句中引用的变量称为SQL变量。C语言语句群SQL语言语句群宿主变量第14页,共74页,2023年,2月20日,星期四宿主变量的数据类型数据类型 描述char 单字符char[n] N个定长字符数组int 整数short 短整数long 长整数float 单精度浮点数double 双精度浮点数VARCHAR[n] 变长字符串第15页,共74页,2023年,2月20日,星期四宿主变量的使用输入---将应用程序的数据传递到数据库中。

intsalary,emp_number;cin>>salary;cin>>emp_number; EXECSQLupdateempsetsal=:salarywhereempno=:emp_number;输出---将数据库的数据传递到应用程序中。

floatv_salary; charv_job;EXECSQLselectsal,jobINTO:v_salary,:v_jobfromempwhereempno=7788; cout<<v_salary<<v_job;第16页,共74页,2023年,2月20日,星期四处理字符数据

预编译选项CHAR_MAP CHAR_MAP=CHARZ(默认设置):'\0'结尾,定长,空格补齐。 CHAR_MAP=CHARF|VARCHAR2:定长,空格补齐。 CHAR_MAP=STRING: '\0'结尾,变长。当'\0'结尾,宿主变量长度要大于实际数据长度。VARCHAR 1.变长,不是'\0'结尾。 2.Struct{ unsignedshortlen; unsignedchararr[] }variable_name;第17页,共74页,2023年,2月20日,星期四使用宿主变量的注意事项其申明语法与普通C变量一致,但在CODE=CPP或MODE=ANSI

时变量必须放在申明区.可使用pointer作为宿主变量,使用前分配空间。

在DDL语句中不能用宿主变量。错误例子:

chartable_name[30]; cin>>table_name; EXECSQLDROPTABLE:table_name;第18页,共74页,2023年,2月20日,星期四指示变量指示变量(indicatorvariable)短整型变量,用于处理数据库的NULL值,监督和管理与其相关联的宿主变量。引用语法:

:host_variableINDICATOR:indicator_variable OR :host_variable:indicator_variable第19页,共74页,2023年,2月20日,星期四指示变量的作用主要用在输出,即当宿主变量用于接收数据库的返回数据时。通过在宿主变量后用指示变量,检测是否返回了NULL。-1:数据库表列的值为NULL,指示变量相关联的输出宿主变量值不确定=0:Oracle将数据库表列值原封不动的赋给指示器变量相关联的输出宿主变量0:Oracle将数据库表列值截断后赋给指示器变量相关联的输出宿主变量,指示器变量值为该列值的原始长度第20页,共74页,2023年,2月20日,星期四指示变量例子EXECSQLBEGINDECLARESECTION; intm_id;shortind_m_id;EXECSQLENDDECLARESECTION;…EXECSQLSELECTmanager_idINTO:m_id:ind_m_idFROMs_empWHEREid=1;If(ind_m_id==-1)cout<<“emp_descisNULL”<<endl;elsecout<<m_id<<endl;第21页,共74页,2023年,2月20日,星期四数组变量Pro*C只支持一维数组Pro*C不支持数组指针Pro*C所支持数组最大维数是32767,超出此限制将报错示例 EXECSQLBEGINDECLARESECTION; intA[100]; charB[100]; charC[100][15]; EXECSQLENDDECLARESECTION;第22页,共74页,2023年,2月20日,星期四数组变量在SQL语句中使用数组变量,只需给出:和变量名称,不要给下标。示例 EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; EXECSQLENDDECLARESECTION;

EXECSQLSELECTnumber,nameINTO:emp_number,:emp_nameFROMemp;第23页,共74页,2023年,2月20日,星期四数组变量错误的例子:

for(inti=0;i<100;i++){ EXECSQLSELECTnumber,nameINTO:emp_number[i],:emp_name[i];}指示器数组例子:

EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; shortind_emp_number[100]; EXECSQLENDDECLARESECTION; … EXECSQLSELECTnumber,nameINTO:emp_number:ind_emp_number,:emp_name;第24页,共74页,2023年,2月20日,星期四通信区说明(SQLCA)SQLCA是ORACLE提供的两个通信区之一。SQLCA实际上是一个结构变量,其目的是为了诊断错误和事件处理结果。SQLCA的结构 structsqlca{ /*ub1*/charsqlcaid[8]; /*b4*/intsqlabc; /*b4*/intsqlcode; struct{ /*ub2*/unsignedshortsqlerrml; /*ub1*/charsqlerrmc[70];}sqlerrm; /*ub1*/charsqlerrp[8]; /*b4*/intsqlerrd[6]; /*ub1*/charsqlwarn[8]; /*ub1*/charsqlext[8];};第25页,共74页,2023年,2月20日,星期四通信区说明(SQLCA)sqlcaid[8]用于标识一个SQLCAsqlabc用于保存SQLCA的长度sqlcode用于保存最近一次运行SQL指令的状态

0 - 正常

>0 - 有一个异常发生

<0 - 系统错误,可能来自网络,或数据库本身sqlerrm.sqlerrml保存错误文本信息的长度sqlerrm.sqlerrmc保存错误文本信息,最长为70个字符sqlerrp系统保留sqlerrd[6] 0,1 ,3,5-系统保留

2 -当前SQL指令处理的行数

4 -保存相对位移,指出在什么地方出现语法错误第26页,共74页,2023年,2月20日,星期四通信区说明(SQLCA)sqlwarn[8] 0-指示是否设置了警告标志

1-指示是否将字符结果返回给宿主变量时,数据截短了

3-如果查询时,返回的列数和指定的宿主数组变量的维数不等时设置该位

4-UPDATE和DELETE时没有行被处理,设置改标志位

5-当EXECSQLCREATE{PROCEDURE|FUNCTION|PACKAGE|PACKAGEBODY}失败时,设置该位

2,6,7-系统保留sqlext[8]系统保留第27页,共74页,2023年,2月20日,星期四intmain(){ … EXECSQLINCLUDEsqlca; … EXECSQLWHENEVERSQLERRORDoerr_report(sqlca); … }voiderr_report(structsqlcasqlca){ if(sqlca.sqlcode<0) printf("\n%d%s\n\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc); exit(1); }SQLCA应用实例第28页,共74页,2023年,2月20日,星期四通信区说明(ORACA)当需要更进一步的信息时,ORACA将帮助我们达成愿望,所以ORACA也可以看作时SQLCA的补充和辅助。第29页,共74页,2023年,2月20日,星期四通信区说明(ORACA)structoraca{ /*text*/charoracaid[8];/*Reserved*/ /*ub4*/intoracabc;/*Reserved*/ /*ub4*/intoracchf;/*<>0if"checkcurcacheconsistncy"*/ /*ub4*/intoradbgf;/*<>0if"doDEBUGmodechecking"*/ /*ub4*/intorahchf;/*<>0if"doHeapconsistencycheck"*/ /*ub4*/intorastxtf;/*SQLstmttextflag*/ struct{ /*ub2*/unsignedshortorastxtl; /*text*/charorastxtc[70]; }orastxt;/*textoflastSQLstmt*/ struct{ /*ub2*/unsignedshortorasfnml; /*text*/charorasfnmc[70]; }orasfnm;/*nameoffilecontainingSQLstmt*/ /*ub4*/intoraslnr;/*linenr-within-fileofSQLstmt*/ /*ub4*/intorahoc;/*highestmaxopenOraCursrequested*/ /*ub4*/intoramoc;/*maxopenOraCursorsrequired*/ /*ub4*/intoracoc;/*currentOraCursorsopen*/ /*ub4*/intoranor;/*nrofOraCursorre-assignments*/ /*ub4*/intoranpr;/*nrofparses*/ /*ub4*/intoranex;/*nrofexecutes*/ };第30页,共74页,2023年,2月20日,星期四通信区说明(ORACA)oracaid[8]标识一个ORACA通信区oracabc用于保存ORACA通信区的长度oradbgf调试标志,0-关闭,1-开启oracchf如果oradbgf=1,那oracchf遵循下列规则:

0-禁止光标缓冲一致性检查

1-进行光标缓冲一致性检查orahchf如果oradbgf=1,那oracchf遵循下列规则:

0-禁止堆缓冲一致性检查

1-进行堆缓冲一致性检查orastxtf可以是以下各值:

0-不保存SQL文本

1-仅对SQLERROR保存SQL文本

2-仅对SQLERROR和SQLWARNING保存SQL文本

3-总是保存SQL文本第31页,共74页,2023年,2月20日,星期四通信区说明(ORACA)要使用ORACA,那么就要显式的加载ORACA结构到Pro*C程序中。可通过语句

EXECSQLINCLUDEoraca; EXECORACLEOPTION(ORACA=YES);

实现。第32页,共74页,2023年,2月20日,星期四嵌入SQL语句EXECSQLINSERTdept(1,‘人事部’,‘中鼎大厦7层’);EXECSQLsql-statement;形式:示例:单个SQL语句的嵌入语法第33页,共74页,2023年,2月20日,星期四嵌入事务控制语句事务控制语句Commit,rollbackandsavepoint.EXECSQLcommit;EXECSQLcommitworkrelease;EXECSQLrollbackworkrelease;第34页,共74页,2023年,2月20日,星期四嵌入事务控制语句…EXECSQLSAVEPOINTsavepoint_insert;for(i=1;i<100;i++){getInput1(empName,&salary);EXECSQLWHENEVERSQLERRORGOTOinsert_error;EXECSQLINSERTINTOemp(ename,sal)VALUES(:empName,:salary);}…EXECSQLSAVEPOINTsavepoint_delete;for(i=1;i<100;i++){getInput2(&deptNo);EXECSQLWHENEVERSQLERRORGOTOdelete_error;EXECSQLDELETEFROMempWHEREdeptno=:deptNo;}…delete_error:EXECSQLWHENEVERSQLERRORCONTINUE;EXECSQLROLLBACKTOSAVEPOINTsavepoint_delete;…insert_error:EXECSQLWHENEVERSQLERRORCONTINUE;EXECSQLROLLBACKTOSAVEPOINTsavepoint_insert;…第35页,共74页,2023年,2月20日,星期四数据操作语句(DML)语句列表EXECSQLSelect…….;EXECSQLInsert…….;EXECSQLupdate…….;EXECSQLDelete…….;嵌入DML语句第36页,共74页,2023年,2月20日,星期四数据定义语句(DDL):create,alter,dropExample:EXECSQLCREATTABLEt1(colaint);EXECSQLDROPTABLEt1;EXECSQLALTERTABLEt1add(faxnonumber);对象名,列名不能用宿主变量.自动提交事务嵌入DDL语句第37页,共74页,2023年,2月20日,星期四嵌入PL/SQL语句PL/SQL的嵌入语法/********************************/EXECSQLEXECUTEBEGIN /*PL/SQLBLOCK*/END;END-EXEC;/*******************************/形式:第38页,共74页,2023年,2月20日,星期四嵌入PL/SQL的语法PL/SQL的嵌入—匿名块(anonymousblocks)/*--------------beginPL/SQLblock-----------------*/EXECSQLEXECUTEBEGIN SELECTjob,hiredate,salINTO:job_title,:hire_date,:salaryFROMemp WHEREempno=:emp_number;

DELETEfromemp whereempno=:emp_number; ……END;END-EXEC;/*--------------endPL/SQLblock-----------------*/第39页,共74页,2023年,2月20日,星期四调用PL/SQL语句PL/SQL的嵌入—package,procedure,functionEXECSQLEXECUTEBEGIN emp_action.raise_salary(:empNo,:increase);END;END-EXEC;Createorreplacepackageemp_actionisprocedureraise_salary(empNOnumber,increasenumber); …Endemp_action;PL/SQL程序:Pro*C程序:第40页,共74页,2023年,2月20日,星期四先有连结,后才能访问数据库.连结的方法:

连结本地或远程数据库 连结一个或多个数据库连接数据库第41页,共74页,2023年,2月20日,星期四EXECSQLCONNECT{:userIDENTIFIEDBY:pswd|:usr_psw}[[AT{dbname|:host_variable}]USING:connect_string][ALTERAUTHORIZATION:newpswd];Connect语法形式第42页,共74页,2023年,2月20日,星期四连接本地数据库本地:客户应用程序与oracleserver在同一台机器上.方式一:用户名口令由两个独立变量存储CharuserName[20]=“scott”;CharuserPwd[20]=“tiger”;EXECSQLCONNECT:userNameIDENTIFIEDBY:userPwd;Charuname_pwd[40]=“scott/tiger”;EXECSQLCONNECT:uname_pwd;方式二:用户名口令由单个变量存储第43页,共74页,2023年,2月20日,星期四连接远端数据库远端:客户应用程序与oracleserver不在同一台机器上.charuserPwd[20]=“scott/tiger”;chardbString[20]=“remoteDB”;EXECSQLCONNECT:userPwdUsing:dbString;remoteDB是网络服务名,在$ORACLE_HOME/network/admin/tnsnames.ora文件中定义.连接方式:第44页,共74页,2023年,2月20日,星期四使用数据库链访问远端数据库Charname[25]=“scottsmith”;/***修改本地数据库区**/EXECSQLupdateempsetsal=:salarywhereename=:name;/***修改远端数据库区**/EXECSQLupdateemp@myLinksetsal=:salarywhereename=:name;EXECSQLcommitworkrelease;CREATEDATABASELINKmyLinkCONNECTTOtarenaIDENTIFIEDBYtarenaUsing‘tlab1’;用SQLPLUS创建数据库链接:第45页,共74页,2023年,2月20日,星期四连接多个数据库应用程序远端数据库ORA1远端数据库ORA2远端数据库ORA3本地数据库ORA0Net8一个程序同时连接多个数据库或者建立多个连接到同一个数据库第46页,共74页,2023年,2月20日,星期四连接多个数据库charuser1[10]="scott/tiger",db1[10]="ora1“,dbString1[20]=“oracle1”;charuser2[10]="scott/tiger“,db2[10]="ora2“,dbString2[20]=“oracle2”;/*********************************/EXECSQLCONNECT:user1AT:db1Using:dbString1;EXECSQLCONNECT:user2AT:db2Using:dbString2;Charname[25]=“scottsmith”;/***修改db1数据库区**/EXECSQLAT:db1updateempsetsal=:salarywhereename=:name;/***修改db2数据库区**/EXECSQLAT:db2updateempsetsal=:salarywhereename=:name;EXECSQLAT:db1commitworkrelease;EXECSQLAT:db2commitworkrelease;第47页,共74页,2023年,2月20日,星期四使用数据库链访问远端数据库应用程序Net8远端数据库ORA2远端数据库ORA1数据库链是在本地数据库和远端数据库之间的一种指针.使用它可以在不同数据库的SQL语句和事务之间建立关联关系。第48页,共74页,2023年,2月20日,星期四SQLCA与错误处理为了给用户和开发人员提供oracleerrormessage,Oracle建议使用SQL通讯区(SQLCA).

SQLCAisaCstruct,纪录每个当前SQL语句的执行状态,以便进行错误诊断和事件处理。#include<sqlca.h> OR EXECSQLINCLUDESQLCA;

第49页,共74页,2023年,2月20日,星期四SQLCA通讯区SQLCA的信息结构structsqlca{charsqlcaid[8];longsqlcabc;longsqlcode;struct{ unsignedshortsqlerrml; char sqlerrmc[70];}sqlerrm;charsqlerrp[8];longsqlerrd[6];charsqlwarn[8];charsqlext[8];};第50页,共74页,2023年,2月20日,星期四WHENEVER语句检测并处理sql语句错误。语法: EXECSQLWHENEVER<condition><action> condition:SQLWARNING,SQLERROR,NOTFOUND. action:CONTINUE,DO,GOTO,STOP,BREAKExample: EXECSQLWHENEVERSQLWARNINGCONTINUE; EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLWHENEVERNOTFOUNDDOnotfound();

第51页,共74页,2023年,2月20日,星期四WHENEVER语句的管辖范围自动检查所有后面的SQLstatements.一般放在BeforefirstSQLstatement.IfusingmorethanoneWHENEVER,只有最近的WHENEVER

起作用。

第52页,共74页,2023年,2月20日,星期四一般的错误处理方法用WHENEVER检查sql语句错误用SQLCA描述错误Rollback所有的操作,release资源.第53页,共74页,2023年,2月20日,星期四错误处理实例...voidsqlerror();Main(){ EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLCONNECT:usernameIDENTIFIEDBY:password; EXECSQLupdateempsetcomission=200whereemp_no=2;…..}voidsqlerror(){EXECSQLWHENEVERSQLERRORCONTINUE;cout<<"\n----oracleerrordetected:"<<sqlca.sqlerrm.sqlerrmc;EXECSQLROLLBACKWORKRELEASE;exit(1);}第54页,共74页,2023年,2月20日,星期四用单个变量操作单行单列用多个变量或结构(struct)操作单行多列用数组(array)或游标(cursor)操作多行多列数据的存取更新操作第55页,共74页,2023年,2月20日,星期四用单个变量操作单行单列

charename[35]; intempno=20; EXECSQLselectemp_nameINTO:enamefromemp whereemp_no=:empno; cout<<“thenameis“<<ename;注意事项:字符串长度定义指示变量的运用

第56页,共74页,2023年,2月20日,星期四charv_name[31],charv_job[21];floatv_salary;intempno=20; EXECSQLselectemp_name,job,salary INTO:v_name,:v_job,:v_salary FROMemp WHEREemp_no=:empno; cout<<v_name<<v_job<<v_salary;注意事项:变量顺序与字段名一至用多个变量操作单行多列第57页,共74页,2023年,2月20日,星期四宿主结构是指包含多个宿主变量的C语言结构,以此可简化单行多列操作。Struct{ int no; char name[10]; int salary; }emp_record;输入:EXECSQLINSERTINTOemp(empno,ename,sal) VALUES(:emp_record);输出:EXECSQLSELECTempno,ename,salINTO:emp_record WHERErownum=1;用结构(struct)操作单行多列第58页,共74页,2023年,2月20日,星期四注意事项:可用结构pointer,但要分配空间。结构成员的数据类型,顺序必须与SQL语句一至。不能用嵌套的结构。不能用C联合(UNION)用结构(struct)操作单行多列第59页,共74页,2023年,2月20日,星期四目的:降低网络开销,提高程序性能。数组和INSERT语句:intnum[100];floatsalary[100];charname[100][25];/**在此为ARRAY赋值**/EXECSQLINSERTINTOemp(empno,ename,sal)VALUES(:num,:name,:salary);用数组(array)操作多行多列第60页,共74页,2023年,2月20日,星期四用数组(array)操作多行多列数组和UPDATE/DELETE语句Charname[100];floatsalary[100];……../**在此为ARRAY赋值**/EXECSQLUPDATEEMPSETsal=:salaryWHEREename=:name;Charname[100];……../**在此为ARRAY赋值**/EXECSQLDELETEFROMempWHEREename=:name;第61页,共74页,2023年,2月20日,星期四用数组(array)操作多行多列数组和SELECT语句Charname[100][25];EXECSQLSELECTenameINTO:nameFROMemp WHEREdept_num=2;For(intj=0;j<sqlca.sqlerrd[2];j++) cout<<“Emp_name”<<name[j]<<endl;第62页,共74页,2023年,2月20日,星期四用数组(array)操作多行多列注意事项:只有CHAR和VARCHAR可为二维数组。如数组INDEX不同,按最小操作。在SELECT语句的WHERE子句中,不能用数组。数组元素最大值:32767第63页,共74页,2023年,2月20日,星期四使用非滚动游标1。定义游标

EXECSQLDECLAREemp_cursorCURSORFOR selectempno,ename,salfromempwheredeptno=10;2.打开游标

EXECSQLOPENemp_cursor;(Opencursor:puttheselectresultsintoamemoryplace,andthecursorpointerpointstothefirstrowdata.)3.提取游标

EXECSQLFETCHemp_cursorINTO:empnum,:name:salary; /**在此处理数据处理**/ (Afterfetch,cursorpointermovesdownoneline.Useloopformultiplerows)4.EXECSQLCLOSEemp_cursor;第64页,共74页,2023年,2月20日,星期四使用非滚动游标范例…intdept_number,emp_name;floatcommission;…EXECSQLDECLAREemp_cursorCURSORFOR SELECTempname,commFROMEMPWHEREdeptno=:dept_number;EXECSQLOPENemp_cursor;for(;;){ EXECSQLWHENEVERNOTFOUNDDObreak; EXECSQLFETCHemp_cursorINTO:emp_name,:commission; if(commission<1)cout<<emp_name<<“先生,请加油“;

}EXECSQLCLOSEemp_cursor;…第65页,共74页,2023年,2月20日,星期四使用滚动游标1.定义游标EXECSQLDECLAREemp_cursorSCROLLCURSORFORselectempno,ename,salfromempwheredeptno=10;2.打开游标EXECSQLOPENemp_cursor;3.提取游标EXECSQLFETCHFIRSTemp_cursorINTO:empnum,:name:salary;

options:PRIOR(当前行的前一行),NEXT(当前行的下一行),CURRENT(当前行),RELATIVEn(n为付/正,当前行的前/后n行),ABSOLUTEn(游标中的第n行),LAST。4.EXECSQLCLOSEemp_cursor;第66页,共74页,2023年,2月20日,星期四动态SQL动态SQL是指在运行pro*c/c++应用程序时,动态输入的SQL语句。目的:加强应用程序的功能和灵活性。比较静态SQL和动态SQL: 静态SQL----在编写应用程序时,使用EXECSQL关键字直接嵌入的SQL语句; 动态SQL----在运行应用程序时,由用户动态输入的SQL语句。什么时候使用动态SQL语句SQL语句的文本(命令,子句等)不确定宿主变量个数不确定宿主变量的数据类型不确定引用的数据库对象(列

温馨提示

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

评论

0/150

提交评论