版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实际开发中的教程第一页,共七十四页,2022年,8月28日Points3.宿主变量与指示变量4.嵌入SQL语句5.连接数据库6.错误处理1.PROC简介7.数据的存取更新操作8.动态sql2.PROC程序的编写步骤第二页,共七十四页,2022年,8月28日Pro程序通过在过程化编程语言中嵌入SQL语句而开发出的应用程序称为Pro程序。在通用编程语言中使用的SQL称为嵌入式SQL在SQL标准中定义了多种语言的嵌入式SQL各个厂商对嵌入式SQL的具体实现不同宿主语言 Pro程序C/C++ Pro*C/C++FORTRANPro*FORTRANPASCALPro*PASCALCOBOLPro*COBOLPL/I Pro*PL/IAda Pro*Ada第三页,共七十四页,2022年,8月28日Pro*C/C++程序在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序。目的:使c/c++这种高效率语言成为访问数据库的工具。第四页,共七十四页,2022年,8月28日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);}第五页,共七十四页,2022年,8月28日Include头文件(c/c++andpro*c/c++)定义变量定义函数main
连结数据库:connect
SQL操作语句:EXECSQL…….; exceptionhandler 断开连结:EXECSQLCOMMIT/ROLLBACKWORKreleasePROC程序结构第六页,共七十四页,2022年,8月28日一般应用程序(C)开发运行标准流程CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.c文件.o文件可执行文件第七页,共七十四页,2022年,8月28日%via_1.ca_2.c%gcc–ca_1.ca_2.c%gcc-oaa_1.oa_2.o一般应用程序(C)开发运行标准流程第八页,共七十四页,2022年,8月28日Pro*C程序开发运行流程.o文件可执行文件CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.pc文件PrecompileModifiedSourceProgram.c文件第九页,共七十四页,2022年,8月28日完成Pro*C源程序到纯C源程序的转换基本命令格式PROCINAME=filename[OptionName1=value1]…[OptionNameN=valueN]Pro*C预编译程序第十页,共七十四页,2022年,8月28日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第十一页,共七十四页,2022年,8月28日Pro*C程序开发运行流程Pro*C程序开发运行流程%via.pc%proca.pc%gcc-oaa.c-lclntsh--ComparePro*Candit’sCcode第十二页,共七十四页,2022年,8月28日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;}第十三页,共七十四页,2022年,8月28日宿主变量宿主变量是一种pro*c语言变量,用于在应用程序中和oracle数据库之间传递数据。Pro*C程序中,既可在SQL语句中引用,也可在C语句中引用的变量称为SQL变量。C语言语句群SQL语言语句群宿主变量第十四页,共七十四页,2022年,8月28日宿主变量的数据类型数据类型 描述char 单字符char[n] N个定长字符数组int 整数short 短整数long 长整数float 单精度浮点数double 双精度浮点数VARCHAR[n] 变长字符串第十五页,共七十四页,2022年,8月28日宿主变量的使用输入---将应用程序的数据传递到数据库中。
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;第十六页,共七十四页,2022年,8月28日处理字符数据
预编译选项CHAR_MAP CHAR_MAP=CHARZ(默认设置):'\0'结尾,定长,空格补齐。 CHAR_MAP=CHARF|VARCHAR2:定长,空格补齐。 CHAR_MAP=STRING: '\0'结尾,变长。当'\0'结尾,宿主变量长度要大于实际数据长度。VARCHAR 1.变长,不是'\0'结尾。 2.Struct{ unsignedshortlen; unsignedchararr[] }variable_name;第十七页,共七十四页,2022年,8月28日使用宿主变量的注意事项其申明语法与普通C变量一致,但在CODE=CPP或MODE=ANSI
时变量必须放在申明区.可使用pointer作为宿主变量,使用前分配空间。
在DDL语句中不能用宿主变量。错误例子:
chartable_name[30]; cin>>table_name; EXECSQLDROPTABLE:table_name;第十八页,共七十四页,2022年,8月28日指示变量指示变量(indicatorvariable)短整型变量,用于处理数据库的NULL值,监督和管理与其相关联的宿主变量。引用语法:
:host_variableINDICATOR:indicator_variable OR :host_variable:indicator_variable第十九页,共七十四页,2022年,8月28日指示变量的作用主要用在输出,即当宿主变量用于接收数据库的返回数据时。通过在宿主变量后用指示变量,检测是否返回了NULL。-1:数据库表列的值为NULL,指示变量相关联的输出宿主变量值不确定=0:Oracle将数据库表列值原封不动的赋给指示器变量相关联的输出宿主变量0:Oracle将数据库表列值截断后赋给指示器变量相关联的输出宿主变量,指示器变量值为该列值的原始长度第二十页,共七十四页,2022年,8月28日指示变量例子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;第二十一页,共七十四页,2022年,8月28日数组变量Pro*C只支持一维数组Pro*C不支持数组指针Pro*C所支持数组最大维数是32767,超出此限制将报错示例 EXECSQLBEGINDECLARESECTION; intA[100]; charB[100]; charC[100][15]; EXECSQLENDDECLARESECTION;第二十二页,共七十四页,2022年,8月28日数组变量在SQL语句中使用数组变量,只需给出:和变量名称,不要给下标。示例 EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; EXECSQLENDDECLARESECTION;
EXECSQLSELECTnumber,nameINTO:emp_number,:emp_nameFROMemp;第二十三页,共七十四页,2022年,8月28日数组变量错误的例子:
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;第二十四页,共七十四页,2022年,8月28日通信区说明(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];};第二十五页,共七十四页,2022年,8月28日通信区说明(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 -保存相对位移,指出在什么地方出现语法错误第二十六页,共七十四页,2022年,8月28日通信区说明(SQLCA)sqlwarn[8] 0-指示是否设置了警告标志
1-指示是否将字符结果返回给宿主变量时,数据截短了
3-如果查询时,返回的列数和指定的宿主数组变量的维数不等时设置该位
4-UPDATE和DELETE时没有行被处理,设置改标志位
5-当EXECSQLCREATE{PROCEDURE|FUNCTION|PACKAGE|PACKAGEBODY}失败时,设置该位
2,6,7-系统保留sqlext[8]系统保留第二十七页,共七十四页,2022年,8月28日intmain(){ … EXECSQLINCLUDEsqlca; … EXECSQLWHENEVERSQLERRORDoerr_report(sqlca); … }voiderr_report(structsqlcasqlca){ if(sqlca.sqlcode<0) ,sqlca.sqlerrm.sqlerrmc); exit(1); }SQLCA应用实例第二十八页,共七十四页,2022年,8月28日通信区说明(ORACA)当需要更进一步的信息时,ORACA将帮助我们达成愿望,所以ORACA也可以看作时SQLCA的补充和辅助。第二十九页,共七十四页,2022年,8月28日通信区说明(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*/ };第三十页,共七十四页,2022年,8月28日通信区说明(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文本第三十一页,共七十四页,2022年,8月28日通信区说明(ORACA)要使用ORACA,那么就要显式的加载ORACA结构到Pro*C程序中。可通过语句
EXECSQLINCLUDEoraca; EXECORACLEOPTION(ORACA=YES);
实现。第三十二页,共七十四页,2022年,8月28日嵌入SQL语句EXECSQLINSERTdept(1,‘人事部’,‘中鼎大厦7层’);EXECSQLsql-statement;形式:示例:单个SQL语句的嵌入语法第三十三页,共七十四页,2022年,8月28日嵌入事务控制语句事务控制语句Commit,rollbackandsavepoint.EXECSQLcommit;EXECSQLcommitworkrelease;EXECSQLrollbackworkrelease;第三十四页,共七十四页,2022年,8月28日嵌入事务控制语句…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;…第三十五页,共七十四页,2022年,8月28日数据操作语句(DML)语句列表EXECSQLSelect…….;EXECSQLInsert…….;EXECSQLupdate…….;EXECSQLDelete…….;嵌入DML语句第三十六页,共七十四页,2022年,8月28日数据定义语句(DDL):create,alter,dropExample:EXECSQLCREATTABLEt1(colaint);EXECSQLDROPTABLEt1;EXECSQLALTERTABLEt1add(faxnonumber);对象名,列名不能用宿主变量.自动提交事务嵌入DDL语句第三十七页,共七十四页,2022年,8月28日嵌入PL/SQL语句PL/SQL的嵌入语法/********************************/EXECSQLEXECUTEBEGIN /*PL/SQLBLOCK*/END;END-EXEC;/*******************************/形式:第三十八页,共七十四页,2022年,8月28日嵌入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-----------------*/第三十九页,共七十四页,2022年,8月28日调用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程序:第四十页,共七十四页,2022年,8月28日先有连结,后才能访问数据库.连结的方法:
连结本地或远程数据库 连结一个或多个数据库连接数据库第四十一页,共七十四页,2022年,8月28日EXECSQLCONNECT{:userIDENTIFIEDBY:pswd|:usr_psw}[[AT{dbname|:host_variable}]USING:connect_string][ALTERAUTHORIZATION:newpswd];Connect语法形式第四十二页,共七十四页,2022年,8月28日连接本地数据库本地:客户应用程序与oracleserver在同一台机器上.方式一:用户名口令由两个独立变量存储CharuserName[20]=“scott”;CharuserPwd[20]=“tiger”;EXECSQLCONNECT:userNameIDENTIFIEDBY:userPwd;Charuname_pwd[40]=“scott/tiger”;EXECSQLCONNECT:uname_pwd;方式二:用户名口令由单个变量存储第四十三页,共七十四页,2022年,8月28日连接远端数据库远端:客户应用程序与oracleserver不在同一台机器上.charuserPwd[20]=“scott/tiger”;chardbString[20]=“remoteDB”;EXECSQLCONNECT:userPwdUsing:dbString;remoteDB是网络服务名,在$ORACLE_HOME/network/admin/tnsnames.ora文件中定义.连接方式:第四十四页,共七十四页,2022年,8月28日使用数据库链访问远端数据库Charname[25]=“scottsmith”;/***修改本地数据库区**/EXECSQLupdateempsetsal=:salarywhereename=:name;/***修改远端数据库区**/EXECSQLupdateemp@myLinksetsal=:salarywhereename=:name;EXECSQLcommitworkrelease;CREATEDATABASELINKmyLinkCONNECTTOtarenaIDENTIFIEDBYtarenaUsing‘tlab1’;用SQLPLUS创建数据库链接:第四十五页,共七十四页,2022年,8月28日连接多个数据库应用程序远端数据库ORA1远端数据库ORA2远端数据库ORA3本地数据库ORA0Net8一个程序同时连接多个数据库或者建立多个连接到同一个数据库第四十六页,共七十四页,2022年,8月28日连接多个数据库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;第四十七页,共七十四页,2022年,8月28日使用数据库链访问远端数据库应用程序Net8远端数据库ORA2远端数据库ORA1数据库链是在本地数据库和远端数据库之间的一种指针.使用它可以在不同数据库的SQL语句和事务之间建立关联关系。第四十八页,共七十四页,2022年,8月28日SQLCA与错误处理为了给用户和开发人员提供oracleerrormessage,Oracle建议使用SQL通讯区(SQLCA).
SQLCAisaCstruct,纪录每个当前SQL语句的执行状态,以便进行错误诊断和事件处理。#include<sqlca.h> OR EXECSQLINCLUDESQLCA;
第四十九页,共七十四页,2022年,8月28日SQLCA通讯区SQLCA的信息结构structsqlca{charsqlcaid[8];longsqlcabc;longsqlcode;struct{ unsignedshortsqlerrml; char sqlerrmc[70];}sqlerrm;charsqlerrp[8];longsqlerrd[6];charsqlwarn[8];charsqlext[8];};第五十页,共七十四页,2022年,8月28日WHENEVER语句检测并处理sql语句错误。语法: EXECSQLWHENEVER<condition><action> condition:SQLWARNING,SQLERROR,NOTFOUND. action:CONTINUE,DO,GOTO,STOP,BREAKExample: EXECSQLWHENEVERSQLWARNINGCONTINUE; EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLWHENEVERNOTFOUNDDOnotfound();
第五十一页,共七十四页,2022年,8月28日WHENEVER语句的管辖范围自动检查所有后面的SQLstatements.一般放在BeforefirstSQLstatement.IfusingmorethanoneWHENEVER,只有最近的WHENEVER
起作用。
第五十二页,共七十四页,2022年,8月28日一般的错误处理方法用WHENEVER检查sql语句错误用SQLCA描述错误Rollback所有的操作,release资源.第五十三页,共七十四页,2022年,8月28日错误处理实例...voidsqlerror();Main(){ EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLCONNECT:usernameIDENTIFIEDBY:password; EXECSQLupdateempsetcomission=200whereemp_no=2;…..}voidsqlerror(){EXECSQLWHENEVERSQLERRORCONTINUE;cout<<"\n----oracleerrordetected:"<<sqlca.sqlerrm.sqlerrmc;EXECSQLROLLBACKWORKRELEASE;exit(1);}第五十四页,共七十四页,2022年,8月28日用单个变量操作单行单列用多个变量或结构(struct)操作单行多列用数组(array)或游标(cursor)操作多行多列数据的存取更新操作第五十五页,共七十四页,2022年,8月28日用单个变量操作单行单列
charename[35]; intempno=20; EXECSQLselectemp_nameINTO:enamefromemp whereemp_no=:empno; cout<<“thenameis“<<ename;注意事项:字符串长度定义指示变量的运用
第五十六页,共七十四页,2022年,8月28日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;注意事项:变量顺序与字段名一至用多个变量操作单行多列第五十七页,共七十四页,2022年,8月28日宿主结构是指包含多个宿主变量的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)操作单行多列第五十八页,共七十四页,2022年,8月28日注意事项:可用结构pointer,但要分配空间。结构成员的数据类型,顺序必须与SQL语句一至。不能用嵌套的结构。不能用C联合(UNION)用结构(struct)操作单行多列第五十九页,共七十四页,2022年,8月28日目的:降低网络开销,提高程序性能。数组和INSERT语句:intnum[100];floatsalary[100];charname[100][25];/**在此为ARRAY赋值**/EXECSQLINSERTINTOemp(empno,ename,sal)VALUES(:num,:name,:salary);用数组(array)操作多行多列第六十页,共七十四页,2022年,8月28日用数组(array)操作多行多列数组和UPDATE/DELETE语句Charname[100];floatsalary[100];……../**在此为ARRAY赋值**/EXECSQLUPDATEEMPSETsal=:salaryWHEREename=:name;Charname[100];……../**在此为ARRAY赋值**/EXECSQLDELETEFROMempWHEREename=:name;第六十一页,共七十四页,2022年,8月28日用数组(array)操作多行多列数组和SELECT语句Charname[100][25];EXECSQLSELECTenameINTO:nameFROMemp WHEREdept_num=2;For(intj=0;j<sqlca.sqlerrd[2];j++) cout<<“Emp_name”<<name[j]<<endl;第六十二页,共七十四页,2022年,8月28日用数组(array)操作多行多列注意事项:只有CHAR和VARCHAR可为二维数组。如数组INDEX不同,按最小操作。在SELECT语句的WHERE子句中,不能用数组。数组元素最大值:32767第六十三页,共七十四页,2022年,8月28日使用非滚动游标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;第六十四页,共七十四页,2022年,8月28日使用非滚动游标范例…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;…第六十五页,共七十四页,2022年,8月28日使用滚动游标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;第六十六页,共七十四页,2022年,8月28日动态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
提交评论