您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 实际开发中的proc教程
TarnaPROC/C++课程PROC/C++Points3.宿主变量与指示变量4.嵌入SQL语句5.连接数据库6.错误处理1.PROC简介7.数据的存取更新操作8.动态sql2.PROC程序的编写步骤Pro程序通过在过程化编程语言中嵌入SQL语句而开发出的应用程序称为Pro程序。•在通用编程语言中使用的SQL称为嵌入式SQL•在SQL标准中定义了多种语言的嵌入式SQL•各个厂商对嵌入式SQL的具体实现不同宿主语言Pro程序C/C++Pro*C/C++FORTRANPro*FORTRANPASCALPro*PASCALCOBOLPro*COBOLPL/IPro*PL/IAdaPro*AdaPro*C/C++程序在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序。目的:使c/c++这种高效率语言成为访问数据库的工具。Pro*C程序实例#includestdio.hEXECSQLBEGINDECLARESECTION;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);}•Include头文件(c/c++andpro*c/c++)•定义变量•定义函数•main连结数据库:connectSQL操作语句:EXECSQL…….;exceptionhandler断开连结:EXECSQLCOMMIT/ROLLBACKWORKreleasePROC程序结构一般应用程序(C)开发运行标准流程CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.c文件.o文件可执行文件•%via_1.ca_2.c•%gcc–ca_1.ca_2.c•%gcc-oaa_1.oa_2.o一般应用程序(C)开发运行标准流程Pro*C程序开发运行流程.o文件可执行文件CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.pc文件PrecompileModifiedSourceProgram.c文件完成Pro*C源程序到纯C源程序的转换基本命令格式PROCINAME=filename[OptionName1=value1]…[OptionNameN=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/passwordPro*C程序开发运行流程#includestdio.hEXECSQLBEGINDECLARESECTION;charuser_passwd[20];EXECSQLENDDECLARESECTION;EXECSQlincludesqlca;main(){EXECSQLWHENEVERSQLERRORstop;strcpy(user_passwd,tarena/tarena);EXECSQLCONNECT:user_passwd;printf(\nConnectedtoORACLEasuser:%s\n,user_passwd);}Pro*C程序开发运行流程%via.pc%proca.pc%gcc-oaa.c-lclntsh--ComparePro*Candit’sCcodePro*C++预编译程序1.Pre-compile:procmyf.pconame=myf.cppparse=nonecode=cpp2.Compile:g++-omyfilemyfile.cpp–lclntsh3.Execute:myfile#includeiostreamUsingnamespacestd;EXECSQLBEGINDECLARESECTION;charuser_passwd[20];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单字符char[n]N个定长字符数组int整数short短整数long长整数float单精度浮点数double双精度浮点数VARCHAR[n]变长字符串宿主变量的使用•输入---将应用程序的数据传递到数据库中。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.Struct{unsignedshortlen;unsignedchararr[]}variable_name;使用宿主变量的注意事项•其申明语法与普通C变量一致,但在CODE=CPP或MODE=ANSI时变量必须放在申明区.•可使用pointer作为宿主变量,使用前分配空间。•在DDL语句中不能用宿主变量。错误例子:chartable_name[30];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;intA[100];charB[100];charC[100][15];EXECSQLENDDECLARESECTION;数组变量•在SQL语句中使用数组变量,只需给出:和变量名称,不要给下标。•示例EXECSQLBEGINDECLARESECTION;intemp_number[100];charemp_name[100][15];EXECSQLENDDECLARESECTION;EXECSQLSELECTnumber,nameINTO:emp_number,:emp_nameFROMemp;数组变量•错误的例子:for(inti=0;i100;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;通信区说明(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];};通信区说明(SQLCA)•sqlcaid[8]用于标识一个SQLCA•sqlabc用于保存SQLCA的长度•sqlcode用于保存最近一次运行SQL指令的状态0-正常0-有一个异常发生0-系统错误,可能来自网络,或数据库本身•sqlerrm.sqlerrml保存错误文本信息的长度•sqlerrm.sqlerrmc保存错误文本信息,最长为70个字符•sqlerrp系统保留•sqlerrd[6]0,1,3,5-系统保留2-当前SQL指令处理的行数4-保存相对位移,指出在什么地方出现语法错误
本文标题:实际开发中的proc教程
链接地址:https://www.777doc.com/doc-5690420 .html