实际开发中的proc教程.ppt
- 文档编号:18778740
- 上传时间:2023-11-09
- 格式:PPT
- 页数:77
- 大小:516.50KB
实际开发中的proc教程.ppt
《实际开发中的proc教程.ppt》由会员分享,可在线阅读,更多相关《实际开发中的proc教程.ppt(77页珍藏版)》请在冰点文库上搜索。
PROC/C+课程,PROC/C+,Points,3.宿主变量与指示变量,4.嵌入SQL语句,5.连接数据库,6.错误处理,1.PROC简介,7.数据的存取更新操作,8.动态sql,2.PROC程序的编写步骤,Pro程序,通过在过程化编程语言中嵌入SQL语句而开发出的应用程序称为Pro程序。
在通用编程语言中使用的SQL称为嵌入式SQL在SQL标准中定义了多种语言的嵌入式SQL各个厂商对嵌入式SQL的具体实现不同,宿主语言Pro程序C/C+Pro*C/C+FORTRANPro*FORTRANPASCALPro*PASCALCOBOLPro*COBOLPL/IPro*PL/IAdaPro*Ada,Pro*C/C+程序,在C/C+语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C+程序。
目的:
使c/c+这种高效率语言成为访问数据库的工具。
Pro*C程序实例,#includeEXECSQLBEGINDECLARESECTION;charusername20;charpassword20;charlast_name25;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=%sn,last_name);voidsqlerror()EXECSQLWHENEVERSQLERRORCONTINUE;printf(n-oracleerrordetected:
n);printf(%.70sn,sqlca.sqlerrm.sqlerrmc);EXECSQLROLLBACKWORKRELEASE;exit
(1);,Include头文件(c/c+andpro*c/c+)定义变量定义函数main连结数据库:
connectSQL操作语句:
EXECSQL.;exceptionhandler断开连结:
EXECSQLCOMMIT/ROLLBACKWORKrelease,PROC程序结构,一般应用程序(C)开发运行标准流程,.c文件,.o文件,可执行文件,%via_1.ca_2.c%gccca_1.ca_2.c%gcc-oaa_1.oa_2.o,一般应用程序(C)开发运行标准流程,Pro*C程序开发运行流程,.o文件,可执行文件,.pc文件,.c文件,完成Pro*C源程序到纯C源程序的转换基本命令格式PROCINAME=filenameOptionName1=value1OptionNameN=valueN,Pro*C预编译程序,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,Pro*C程序开发运行流程,#includeEXECSQLBEGINDECLARESECTION;charuser_passwd20;EXECSQLENDDECLARESECTION;EXECSQlincludesqlca;main()EXECSQLWHENEVERSQLERRORstop;strcpy(user_passwd,tarena/tarena);EXECSQLCONNECT:
user_passwd;printf(nConnectedtoORACLEasuser:
%sn,user_passwd);,Pro*C程序开发运行流程%via.pc%proca.pc%gcc-oaa.c-lclntsh-ComparePro*CanditsCcode,Pro*C+预编译程序,Pre-compile:
procmyf.pconame=myf.cppparse=nonecode=cpp2.Compile:
g+-omyfilemyfile.cpplclntsh3.Execute:
myfile,#includeUsingnamespacestd;EXECSQLBEGINDECLARESECTION;charuser_passwd20;EXECSQLENDDECLARESECTION;EXECSQlincludesqlca;main()EXECSQLWHENEVERSQLERRORstop;strcpy(user_passwd,tarena/tarena);EXECSQLCONNECT:
user_passwd;coutConnectedtoORACLEasuser“,user_passwd;,宿主变量,宿主变量是一种pro*c语言变量,用于在应用程序中和oracle数据库之间传递数据。
Pro*C程序中,既可在SQL语句中引用,也可在C语句中引用的变量称为SQL变量。
C语言语句群,SQL语言语句群,宿主变量,宿主变量的数据类型,数据类型描述char单字符charnN个定长字符数组int整数short短整数long长整数float单精度浮点数double双精度浮点数VARCHARn变长字符串,宿主变量的使用,输入-将应用程序的数据传递到数据库中。
intsalary,emp_number;cinsalary;cinemp_number;EXECSQLupdateempsetsal=:
salarywhereempno=:
emp_number;输出-将数据库的数据传递到应用程序中。
floatv_salary;charv_job;EXECSQLselectsal,jobINTO:
v_salary,:
v_jobfromempwhereempno=7788;coutv_salaryv_job;,处理字符数据,预编译选项CHAR_MAPCHAR_MAP=CHARZ(默认设置):
0结尾,定长,空格补齐。
CHAR_MAP=CHARF|VARCHAR2:
定长,空格补齐。
CHAR_MAP=STRING:
0结尾,变长。
当0结尾,宿主变量长度要大于实际数据长度。
VARCHAR1.变长,不是0结尾。
2.Structunsignedshortlen;unsignedchararrvariable_name;,使用宿主变量的注意事项,其申明语法与普通C变量一致,但在CODE=CPP或MODE=ANSI时变量必须放在申明区.可使用pointer作为宿主变量,使用前分配空间。
在DDL语句中不能用宿主变量。
错误例子:
chartable_name30;cintable_name;EXECSQLDROPTABLE:
table_name;,指示变量,指示变量(indicatorvariable)短整型变量,用于处理数据库的NULL值,监督和管理与其相关联的宿主变量。
引用语法:
:
host_variableINDICATOR:
indicator_variableOR:
host_variable:
indicator_variable,指示变量的作用,主要用在输出,即当宿主变量用于接收数据库的返回数据时。
通过在宿主变量后用指示变量,检测是否返回了NULL。
-1:
数据库表列的值为NULL,指示变量相关联的输出宿主变量值不确定=0:
Oracle将数据库表列值原封不动的赋给指示器变量相关联的输出宿主变量0:
Oracle将数据库表列值截断后赋给指示器变量相关联的输出宿主变量,指示器变量值为该列值的原始长度,指示变量例子,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;elsecoutm_idendl;,数组变量,Pro*C只支持一维数组Pro*C不支持数组指针Pro*C所支持数组最大维数是32767,超出此限制将报错示例EXECSQLBEGINDECLARESECTION;intA100;charB100;charC10015;EXECSQLENDDECLARESECTION;,数组变量,在SQL语句中使用数组变量,只需给出:
和变量名称,不要给下标。
示例EXECSQLBEGINDECLARESECTION;intemp_number100;charemp_name10015;EXECSQLENDDECLARESECTION;EXECSQLSELECTnumber,nameINTO:
emp_number,:
emp_nameFROMemp;,数组变量,错误的例子:
for(inti=0;i100;i+)EXECSQLSELECTnumber,nameINTO:
emp_numberi,:
emp_namei;指示器数组例子:
EXECSQLBEGINDECLARESECTION;intemp_number100;charemp_name10015;shortind_emp_number100;EXECSQLENDDECLARESECTION;EXECSQLSELECTnumber,nameINTO:
emp_number:
ind_emp_number,:
emp_name;,通信区说明(SQLCA),SQLCA是ORACLE提供的两个通信区之一。
SQLCA实际上是一个结构变量,其目的是为了诊断错误和事件处理结果。
SQLCA的结构structsqlca/*ub1*/charsqlcaid8;/*b4*/intsqlabc;/*b4*/intsqlcode;struct/*ub2*/unsignedshortsqlerrml;/*ub1*/charsqlerrmc70;sqlerrm;/*ub1*/charsqlerrp8;/*b4*/intsqlerrd6;/*ub1*/charsqlwarn8;/*ub1*/charsqlext8;,通信区说明(SQLCA),sqlcaid8用于标识一个SQLCAsqlabc用于保存SQLCA的长度sqlcode用于保存最近一次运行SQL指令的状态0正常0有一个异常发生0系统错误,可能来自网络,或数据库本身sqlerrm.sqlerrml保存错误文本信息的长度sqlerrm.sqlerrmc保存错误文本信息,最长为70个字符sqlerrp系统保留sqlerrd60,1,3,5系统保留2当前SQL指令处理的行数4保存相对位移,指出在什么地方出现语法错误,通信区说明(SQLCA),sqlwarn80指示是否设置了警告标志1指示是否将字符结果返回给宿主变量时,数据截短了3如果查询时,返回的列数和指定的宿主数组变量的维数不等时设置该位4UPDATE和DELETE时没有行被处理,设置改标志位5当EXECSQLCREATEPROCEDURE|FUNCTION|PACKAGE|PACKAGEBODY失败时,设置该位2,6,7系统保留sqlext8系统保留,intmain()EXECSQLINCLUDEsqlca;EXECSQLWHENEVERSQLERRORDoerr_report(sqlca);voiderr_report(structsqlcasqlca)if(sqlca.sqlcode0)printf(n%d%snn,sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);exit
(1);,SQLCA应用实例,通信区说明(ORACA),当需要更进一步的信息时,ORACA将帮助我们达成愿望,所以ORACA也可以看作时SQLCA的补充和辅助。
通信区说明(ORACA),structoraca/*text*/charoracaid8;/*Reserved*/*ub4*/intoracabc;/*Reserved*/*ub4*/intoracchf;/*0ifcheckcurcacheconsistncy*/*ub4*/intoradbgf;/*0ifdoDEBUGmodechecking*/*ub4*/intorahchf;/*0ifdoHeapconsistencycheck*/*ub4*/intorastxtf;/*SQLstmttextflag*/struct/*ub2*/unsignedshortorastxtl;/*text*/charorastxtc70;orastxt;/*textoflastSQLstmt*/struct/*ub2*/unsignedshortorasfnml;/*text*/charorasfnmc70;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*/;,通信区说明(ORACA),oracaid8标识一个ORACA通信区oracabc用于保存ORACA通信区的长度oradbgf调试标志,0关闭,1开启oracchf如果oradbgf1,那oracchf遵循下列规则:
0禁止光标缓冲一致性检查1进行光标缓冲一致性检查orahchf如果oradbgf1,那oracchf遵循下列规则:
0禁止堆缓冲一致性检查1进行堆缓冲一致性检查orastxtf可以是以下各值:
0不保存SQL文本1仅对SQLERROR保存SQL文本2仅对SQLERROR和SQLWARNING保存SQL文本3总是保存SQL文本,通信区说明(ORACA),要使用ORACA,那么就要显式的加载ORACA结构到Pro*C程序中。
可通过语句EXECSQLINCLUDEoraca;EXECORACLEOPTION(ORACA=YES);实现。
嵌入SQL语句,EXECSQLINSERTdept(1,人事部,中鼎大厦7层);,EXECSQLsql-statement;,形式:
示例:
单个SQL语句的嵌入语法,嵌入事务控制语句,事务控制语句Commit,rollbackandsavepoint.EXECSQLcommit;EXECSQLcommitworkrelease;EXECSQLrollbackworkrelease;,嵌入事务控制语句,EXECSQLSAVEPOINTsavepoint_insert;for(i=1;i100;i+)getInput1(empName,数据操作语句(DML)语句列表EXECSQLSelect.;EXECSQLInsert.;EXECSQLupdate.;EXECSQLDelete.;,嵌入DML语句,数据定义语句(DDL):
create,alter,dropExample:
EXECSQLCREATTABLEt1(colaint);EXECSQLDROPTABLEt1;EXECSQLALTERTABLEt1add(faxnonumber);对象名,列名不能用宿主变量.自动提交事务,嵌入DDL语句,嵌入PL/SQL语句,PL/SQL的嵌入语法,/*/EXECSQLEXECUTEBEGIN/*PL/SQLBLOCK*/END;END-EXEC;/*/,形式:
嵌入PL/SQL的语法,PL/SQL的嵌入匿名块(anonymousblocks),/*-beginPL/SQLblock-*/EXECSQLEXECUTEBEGINSELECTjob,hiredate,salINTO:
job_title,:
hire_date,:
salaryFROMempWHEREempno=:
emp_number;DELETEfromempwhereempno=:
emp_number;END;END-EXEC;/*-endPL/SQLblock-*/,调用PL/SQL语句,PL/SQL的嵌入package,procedure,function,EXECSQLEXECUTEBEGINemp_action.raise_salary(:
empNo,:
increase);END;END-EXEC;,Createorreplacepackageemp_actionisprocedureraise_salary(empNOnumber,increasenumber);Endemp_action;,PL/SQL程序:
Pro*C程序:
先有连结,后才能访问数据库.连结的方法:
连结本地或远程数据库连结一个或多个数据库,连接数据库,EXECSQLCONNECT:
userIDENTIFIEDBY:
pswd|:
usr_pswATdbname|:
host_variableUSING:
connect_stringALTERAUTHORIZATION:
newpswd;,Connect语法形式,连接本地数据库,本地:
客户应用程序与oracleserver在同一台机器上.方式一:
用户名口令由两个独立变量存储,CharuserName20=“scott”;CharuserPwd20=“tiger”;EXECSQLCONNECT:
userNameIDENTIFIEDBY:
userPwd;,Charuname_pwd40=“scott/tiger”;EXECSQLCONNECT:
uname_pwd;,方式二:
用户名口令由单个变量存储,连接远端数据库,远端:
客户应用程序与oracleserver不在同一台机器上.,charuserPwd20=“scott/tiger”;chardbString20=“remoteDB”;EXECSQLCONNECT:
userPwdUsing:
dbString;,remoteDB是网络服务名,在$ORACLE_HOME/network/admin/tnsnames.ora文件中定义.,连接方式:
使用数据库链访问远端数据库,Charname25=“scottsmith”;/*修改本地数据库区*/EXECSQLupdateempsetsal=:
salarywhereename=:
name;/*修改远端数据库区*/EXECSQLupdateempmyLinksetsal=:
salarywhereename=:
name;EXECSQLcommitworkrelease;,CREATEDATABASELINKmyLinkCONNECTTOtarenaIDENTIFIEDBYtarenaUsingtlab1;,用SQLPLUS创建数据库链接:
连接多个数据库,应用程序,Net8,一个程序同时连接多个数据库或者建立多个连接到同一个数据库,连接多个数据库,charuser110=scott/tiger,db110=ora1“,dbString120=“oracle1”;charuser210=scott/tiger“,db210=ora2“,dbString220=“oracle2”;/*/EXECSQLCONNECT:
user1AT:
db1Using:
dbString1;EXECSQLCONNECT:
user2AT:
db2Using:
dbString2;Charname25=“scottsmith”;/*修改db1数据库区*/EXECSQLAT:
db1updateempsetsal=:
salarywhereename=:
name;/*修改db2数据库区*/EXECSQLAT:
db2updateempsetsal=:
salarywhereename=:
name;EXECSQLAT:
db1commitworkrelease;EXECSQLAT:
db2commitworkrelease;,使用数据库链访问远端数据库,应用程序,Net8,数据库链是在本地数据库和远端数据库之间的一种指针.使用它可以在不同数据库的SQL语句和事务之间建立关联关系。
SQLCA与错误处理,为了给用户和开发人员提供oracleerrormessage,Oracle建议使用SQL通讯区(SQLCA).SQLCAisaCstruct,纪录每个当前SQL语句的执行状态,以便进行错误诊断和事件处理。
#includeOREXECSQLINCLUDESQLCA;,SQLCA通讯区,SQLCA的信息结构,structsqlcacharsqlcaid8;longsqlcabc;longsqlcode;structunsignedshortsqlerrml;charsqlerrmc70;sqlerrm;charsqlerrp8;longsqlerrd6;charsqlwarn8;charsqlext8;,WHENEVER语句,检测并处理sql语句错误。
语法:
EXECSQLWHENEVERcondition:
SQLWARNING,SQLERROR,NOTFOUND.action:
CONTINUE,DO,GOTO,STOP,BREAKExample:
EXECSQLWHENEVERSQLWARNINGCONTINUE;EXECSQLWHENEVERSQLERRORDOsqlerror();EXECSQLWHENEVERNOTFOUNDDOnotfound();,WHENEVER语句的管辖范围,自动检查所有后面的SQLstatements.一般放在BeforefirstSQLstatement.IfusingmorethanoneWHENEVER,只有最近的WHENEVER起作用。
一般
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实际 开发 中的 proc 教程