ProC程序编程.doc_第1页
ProC程序编程.doc_第2页
ProC程序编程.doc_第3页
ProC程序编程.doc_第4页
ProC程序编程.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

Pro*C 程序编程(一) 用Pro*C编写程序与在PB中直接用SQL语句类似,在PB中能用的SQL语法在Pro C中同样适用,数据库能用的函数也都可以使用,所有的语句都应符合Oracle的语法,只是多一些C语言中的语法和限制,下面是一个最简单的例子:/*/*程序开始,有一些需要包含的.H文件*/#include #ifdef _WIN32 #define DLLIMPORT _declspec(dllimport) #define DLLEXPORT _declspec(dllexport) #define CDECL _cdecl#else #define DLLIMPORT #define DLLEXPORT #define CDECL#endif#define SQLCA_STORAGE_CLASS extern/*SQL没有记录的返回值*/#define SQLNOTFOUND 1403/*Pro C必须在每一个程序中写的语句,SQLCA的大小写必须所有程序一致*/EXEC SQL INCLUDE SQLCA;EXEC ORACLE OPTION (RELEASE_CURSOR = YES); /*该语句可以在Makefile中写*/*有了下面的定义,就不需要进行变量类型的等价了VAR IS STRING()*/EXEC ORACLE OPTION (CHAR_MAP = STRING); /*该语句可以在Makefile中写*/void main() /*声明需要在SQL语句中使用的变量,这些变量在非SQL中也能使用*/ EXEC SQL BEGIN DECLARE SECTION; char szCodeName41 = ; /*CHAR变量的长度必须比数据库中大1*/ /*对VARCHAR类型必须进行等价说明,否则可能有空格,或设置CHAR_MAP=STRING*/ EXEC SQL VAR szCodeName IS STRING(41); /*指示变量,必须是short int 类型,*/ short int indCodeName = 0; /*与EXEC SQL BEGIN DECLARE SECTION;成对使用*/ EXEC SQL END DECLARE SECTION; /*也可以不需要EXEC SQL BEGIN END DECLARE SECTION;,在编译上控制*/ strcpy(szConnectString,jifei/jifeijifei); /*连接数据库*/ EXEC SQL connect :szConnectString; /*或EXEC SQL CONNECT :szUser IDENTIFIED BY :szPassword using :szDBString;*/ if (sqlca.sqlcode !=0) /*判断语句是否执行成功*/ printf(Connect Error , Error Message : %sn,sqlca.sqlerrm.sqlerrmc); exit(0); EXEC SQL select code_name into :szCodeName from CODE_NAME where rownum = 1; if (sqlca.sqlcode 0) /*判断语句是否执行成功*/ printf(Connect Error , Error Message : %sn,sqlca.sqlerrm.sqlerrmc); EXEC SQL rollback work release; exit(0); if (sqlca.sqlcode = SQLNOTFOUND) /*没有结果,必须用SQLNOTFOUND,不要直接用1403*/ printf(No Data to Fetchn); EXEC SQL rollback work release; exit(0); printf(Code_Name = %s.n,szCodeName); /*提交并断开连接*/ EXEC SQL commit work release;/*/ 一些基本的用法:、VARCHAR2型变量的数据定义如果数据库中是varchar2型的字段,在Pro*C中类型定义成char szFieldNamen+1如果在Makefile文件中的预编译参数中char_map=STRING则不需要进行类型等价,否则需要进行字符类型的等价定义:EXEC SQL VAR szFieldName IS STRING(n+1);如不进行等价,则变量用空格填充。2、判断NULL值的方法在Pro* C中,如某一个字段是NULL值,sqlca.sqlcode是小于的,所以对可能出现NULL的列在into 语句中用指示变量则sqlca.sqlcode = 0,这时指示变量= -1EXEC SQL select col1 into :nCol1 :indCol1 .if (indCol1 = -1) /*Col1为NULL,必须处理*/ nCol1 = 0;注意 :nCol1:indCol1之间没有“,”号3、错误处理的方法 在Pro*C中可以对每一条语句判断其sqlca.sqlcode来做错误判断,也可以用类型Oracle的异常处理的方式:EXEC SQL WHENEVER SQLERROR goto Error_Exit;Error_Exit: EXEC SQL WHENEVER SQLERROR continue; /*停止错误处理*/ exec sql rollback; gf_PrintMess(提款反销失败:Point = %d,iBKPoint); #ifdef _DEBUG_ gf_PrintMess(SQL = %s,szSQL);#endif gf_PrintMess(=提款反销=Error); cics_return(-1,ERROR_DB,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc); return;对其他错误也能进行异常处理定义,如 NOT FOUND,不过,一般不这样做。这样所有的SQL语句后会自动判断sqlca.sqlcode是否小于,如小于则goto Error_Exit。在语句中是不建议用goto语句的,所以如果一个程序只有一种错误处理方式,即只要出错就返回这么用也是很方便、很直观的。4、结构在SQL语句种的使用对定义的结构,如与查询的结果列一致,可以直接使用,如select a1,a2 into :str_a1a25、数组在语句中的使用: 、FETCHCursor中的使用 #define MAX_ACCT_ROWS 10000 /*定义每次处理的用户数=1万*/ struct _AcctFund ulong ulAcctIDMAX_ACCT_ROWS; /*付费编号*/ long lBalanceMAX_ACCT_ROWS; /*存款余额*/ VARCHAR szRowIDMAX_ACCT_ROWS20; /*ACCT_FUND中的ROWID*/ astrAcctFund; EXEC SQL FOR :MAX_ACCT_ROWS FETCH Cur_fund INTO :astrAcctFund.ulAcctID, :astrAcctFund.lBalance, :astrAcctFund.szRowID0; iRows_fund = sqlca.sqlerrd2; /*记录数*/ #define MAX_ACCT_ROWS 10000 /*定义每次处理的用户数=1万*/ struct _AcctFund ulong ulAcctIDMAX_ACCT_ROWS; /*付费编号*/ long lBalanceMAX_ACCT_ROWS; /*存款余额*/ VARCHAR szRowIDMAX_ACCT_ROWS20; /*ACCT_FUND中的ROWID*/ astrAcctFund; EXEC SQL FOR :MAX_ACCT_ROWS FETCH Cur_fund INTO :astrAcctFund.ulAcctID, :astrAcctFund.lBalance, :astrAcctFund.szRowID0; iRows_fund = sqlca.sqlerrd2; /*记录数*/ 、Insert 中使用 int nID100 ; EXEC SQL FOR 100 insert into t_a values (:nID); 、Where 中使用 int nID100; EXEC SQL for 100 delete from t_a where id = :nID; 、动态语句中使用 int nID100; strcpy(szSql,”insert into t_a values(:v1)”); EXEC SQL PREPARE st_EXE_Sql FROM :szSql; EXEC SQL FOR 100 EXECUTE st_EXE_print using :nID; E、结构数组的使用 struct _S_TYPE int nCodeId; char szCodeName41; s_Type100; _S_TYPE *psType = &s_Type0; /*必须定义一个指针*/ EXEC SQL for 100 select code_id,code_name into :psType from CODE_ID_NAME where rownum = 100; 这种用法比使用数组结构简单,但要求select的列数与数组结构的列数一致。 这种用法比使用数组结构简单,但要求select的列数与数组结构的列数一致。6、Pro C中使用存储过程 EXEC SQL EXECUTE BEGIN up_db_pay_open(:iPartID,:aszAcctID,0,1,:aszOperSerialNbr, :aszStaffID,2,:iPartOpen,:aszOweState, :iErrPB,:lErrSys,:szErrSysMsg); END; END-EXEC; 7、Pro C程序的编译 7、Pro C程序的编译#proc.mk,Pro C程序的编译 Makefile,makefile maketest1.mkmake f test1.mk test1#ORACLE_HOME = /oracle/app/oracle/product/8.0.6PROC_PL = $(ORACLE_HOME)/bin/proc parse=FULL release_cursor=no USERID=bill/AC6C69626 sqlcheck=SEMANTICS char_map=STRING ireclen=512 iname=#如果在Pro*C中没有使用存储过程,SQLCHECK可以等于syntaxCCFLAGS = -L$(ORACLE_HOME)/

温馨提示

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

评论

0/150

提交评论