Infoxmix与Oracle的嵌入式SQLC对比.doc_第1页
Infoxmix与Oracle的嵌入式SQLC对比.doc_第2页
Infoxmix与Oracle的嵌入式SQLC对比.doc_第3页
Infoxmix与Oracle的嵌入式SQLC对比.doc_第4页
Infoxmix与Oracle的嵌入式SQLC对比.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

Infoxmix和Oracle的嵌入式SQL/C开发对比ESQLC和PROC的对比 本文档介绍了数据库嵌入式SQL/C语言程序ESQLC和PROC的区别 一基本语法1语法字符ESQLC中既支持$数据库语法,同时也支持“EXEC SQL”,:数据库语法PROC中只支持“EXEC SQL”,:数据库语法 2数据库变量定义ESQLC中支持3种表达方法方法1,$int nValue;$char strValue20;方法2(会有警告,但不影响编译及运行结果),EXEC SQL int nValue;EXEC SQL char strValue20;方法3,EXEC SQL BEGIN DECLARE SECTION;int nValue;char strValue20;EXEC SQL END DECLARE SECTION; PROC中支持2种表达方法方法1,不加任何修饰,即与非数据库变量的定义相同方法2,EXEC SQL BEGIN DECLARE SECTION;int nValue;char strValue20;EXEC SQL END DECLARE SECTION; 3数据库变量的使用ESQLC中对$,:均能支持PROC中只能用: 4基本的SQL语句(查询、插入、删除、修改)ESQLC,sql语句中可以用数据库变量,也可以用常量,如where name= 张三PROC,sql语句中只能用数据库变量,如where name= :m_name ?a) SELECT语句EXEC SQL SELECT field_name1, field_name2 , field_nameNFROMtable_name_list , WHEREcond1ANDcond2GROUPBY field_nameX, field_nameYORDERBY grouplist ;b) DECLARE语句EXEC SQL DECLARE cursor_name FOR SELECTfield_name1, field_name2 , field_nameNFROMtable_name_list , WHEREcond1ANDcond2GROUPBY field_nameX, field_nameYORDERBY grouplist ;c) UPDATE语句EXEC SQL UPDATE table_name SETfield_name1 = :val1 ,field_name2 = :val2 , field_nameN = :valN WHEREcond1ANDcond2 ;d) INSERT语句简单的INSERT语句:EXEC SQL INSERT INTO table_name VALUES (:stru_var) ;复杂的INSERT语句:EXEC SQL INSERT INTO table_name VALUES (:val1, :val2, valN, :valX, . :valY) ;e) FETCH语句简单的FETCH语句:EXEC SQL FETCH curs_name INTO :stru_var ;复杂的FETCH语句:EXEC SQL FETCH curs_name INTO:val1 , ., :valN ,:valX, , :valY ; 5数据库变量的数据类型ESQLC中不支持unsigned类型,对typedef支持也不是很好,虽然在sys/types.h中已经有类型定义,但还是要在程序中再次定义,且必须定义在BEGIN DECLARE/END DECLARE之间PROC中能够支持unsigned类型,也支持typedef,即在sys/types.h中定义的都能够使用数据库日期型的问题:Oracle数据库和informix数据库不同,不支持自1899-12-31以来的long型日期处理。但oracle和informix均支持字符串型的日期处理。 二高级SQL操作(游标等)1数据库打开、关闭操作ESQLC中打开数据库使用database 数据库名,关闭数据库使用database close/*打开数据库*/int open_database(void) EXEC SQL database devp_jxnc; if(sqlca.sqlcode) printf(open_database error:%dn, sqlca.sqlcode); return -1; else return 0; /*关闭数据库*/void close_database(void) EXEC SQL close database;PROC中打开数据库使用CONNECT :username IDENTIFIED BY :password,不用关闭/*打开数据库*/int open_database(void) EXEC SQL BEGIN DECLARE SECTION; char username50; char password50; EXEC SQL END DECLARE SECTION; memset(username, 0, sizeof(username); memset(password, 0, sizeof(password); strcpy(username, posp); strcpy(password, posp); EXEC SQL connect :username identified by :password; if(sqlca.sqlcode) printf(open_database error:%dn, sqlca.sqlcode); return -1; else return 0; PROC也可以这样EXEC SQL CONNECT “username/passworddatabase”; 2事务操作ESQLC中语法打开事务,begin work;提交事务,commit work;回滚事务,rollback work;PROC中语法打开事务,不写提交事务,commit work;回滚事务,rollback;或rollback work;在Oracle中缺省情况下,一个事务的结束就是下一个事务的开始,所以对于一个事务来说,我们只要写commit;即可,不需要明确标出什么时候开始一个事务,而informix需要。 Oracle对于以下类型的语句EXEC SQL create table EXEC SQL drop table EXEC SQL truncate table EXEC SQL drop index 会提交前面数据库处理的事务,请编程时注意。3游标操作游标基本语法定义游标,declare cur名称 cursor for sql语句打开游标,open cur_1或open cur_1 using :con1,:con2Fetch游标,fetch cur_1或fetch cur_1 into :val1,:val2关闭游标,close cur_1释放游标,free cur_1 两平台区别:sql语句区别同基本sql语句,PROC中不能用用常值(where name= 张三),只能用数据库变量(where name= :m_name)。PROC中不能释放游标,而ESQLC中要求释放游标。 三数据库操作运行结果1表达符ESQLC中一般采用SQLCODE,也可采用sqlca.sqlcodePROC中只能用sqlca.sqlcode。 2常用数值含义开发阶段含义Informix,ESQL/COracle,PROC插入时列数不匹配-236(待查)字段不存在-217(待查) 运行阶段含义Informix,ESQL/COracle,PROC找到数据00找不到数据1001403插入时重复-239-1找到记录不唯一(待查)(待查)范围超限(待查)1480找到值为NULL(待查)-1405其他(待续) 四程序的编译及链接1基本命令ESQLC预编译命令esqlPROC预编译命令proc 2编译语法ESQLC中makefile的一般写法CC=ccECC=$(INFORMIXDIR)/bin/esql .SUFFIXES:.ec.SUFFIXES:.c .ec.o: $(ECC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.ec rm -f $*.c.c.o: $(CC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.c PROC中makefile的一般写法CC=ccPROC=proc userid=用户名/密码 sqlcheck=full char_map=string .SUFFIXES:.pc.SUFFIXES:.c .pc.o: $(PROC) $(INCL_FLAG2) iname=$*.pc oname=$*.c $(CC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.c rm -f $*.c rm -f $*.lis.c.o: $(CC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.c 其中:INCL_FLAG=链接头文件目录CFLAGS_1=编译参数,如-q64表示编译成64位,-qcpluscmt表示支持/单行注释 3链接语法ESQLC中,两种方法:$(ECC) -o 可执行文件 应用链接文件1 应用链接文件2 或者$(CC) -o 可执行文件应用链接文件1 应用链接文件2 及Informix静态链接库(可通过esqql libs获知该连接那些库文件,另外再加上$(INFORMIXDIR)/lib/checkapi.o) PROC中:$(CC) -o 可执行文件 应用链接文件1 应用链接文件2 及Oracle静态链接库(可通过cat $ORACLE_HOME/lib/sysliblist 获知应该链接那些库文件,另外要加上-lclntsh)其中链接文件,可以是obj文件,静态库文件,源文件等。 五Makefile文件对比1编译文件mk.ifx#Makefile for informix/oracle #1.定义公共make变量APPDIR=$(HOME)DB_HOME=$(INFORMIXDIR)BIN_DIR=$(APPDIR)/bin #2 informix下的make变量设置INCL_DB=$(DB_HOME)/incl/esqlDB_OBJ=db_ifx.oDBLIB=$(INFORMIXDIR)/lib/esql/checkapi.o -L$(INFORMIXDIR)/lib/esql -L$(INFORMIXDIR)/lib -lixsql -lixasf -lixgen -lixos -lixgls -lnsl_s -lcrypt_i -lsocket -lm -lsuds -lxECC=esqlCFLAGS_1=CFLAGS_2=#informix.设置.end #3.CC变量及includeCC=cc INCL_APP=$(APPDIR)/inclINCL_TUXEDO=$(TUXDIR)/include INCL_FLAG=-I$(INCL_APP) -I$(INCL_DB)INCL_FLAG2=include=$(INCL_APP) include=$(INCL_DB) #4.应用依赖的OBJ设置clean: rm -f *.o TESTAPP=mylib.o #等等 testapp:testapp.o $(LIB_TESTAPP) $(DB_OBJ) $(CC) $(CFLAGS_2) -o $ $? $(DBLIB) mv $ $(BIN_DIR) .SUFFIXES:.c.SUFFIXES:.ec .ec.o: $(ECC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.ec rm -f $*.c.c.o: $(CC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.c 2编译文件mk.ora#Makefile for informxi/oracle#no tuxedo env #1.定义公共make变量APPDIR=$(HOME)DB_HOME=$(ORACLE_HOME)BIN_DIR=$(APPDIR)/bin #2 oracle下的make变量设置INCL_DB=$(DB_HOME)/precomp/publicDB_OBJ=db_ora.oDBLIB=-L$(ORACLE_HOME)/lib -lm -lclntshPROC=proc userid=posp/posp sqlcheck=full char_map=string def_sqlcode=yesCFLAGS_1=-q64 -qcpluscmtCFLAGS_2=-q64#oracle.设置.end #3.CC变量及includeCC=cc INCL_APP=$(APPDIR)/inclINCL_TUXEDO=$(TUXDIR)/include INCL_FLAG=-I$(INCL_APP) -I$(INCL_DB)INCL_FLAG2=include=$(INCL_APP) include=$(INCL_DB) #4.应用所依赖的OBJ设置等clean: rm -f *.o TESTAPP=mylib.o #等等

温馨提示

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

评论

0/150

提交评论