infoxmix与oracle的嵌入式sqlc对比_第1页
infoxmix与oracle的嵌入式sqlc对比_第2页
infoxmix与oracle的嵌入式sqlc对比_第3页
infoxmix与oracle的嵌入式sqlc对比_第4页
infoxmix与oracle的嵌入式sqlc对比_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、Infoxmix和Oracle的嵌入式SQL/C开发对比ESQLC和PROC的对比本文档介绍了数据库嵌入式SQL/C语言程序ESQLC和PROC的区别一. 基本语法1. 语法字符ESQLC中既支持帘数据库语法,同时也支持"EXECSQLJ匸数据库语法 PROC中只支持“EXECSQL”,:数据库语法2. 数据库变号定义ESQLC中支持3种表达方法方法1,$int nValue;$char strValue20;方法2 (会有警告,但不影响编译及运行结果),EXEC SQL int nValue;EXEC SQL char strValue20;方法3,EXEC SQL BEGIN D

2、ECLARE SECTION;int nValue;char strValue20;EXEC SQL END DECLARE SECTION;PROC中支持2种表达方法方法4不加任何修饰,即与非数据库变量的定义相同 方法2,EXEC SQL BEGIN DECLARE SECTION;int nValue;char strValue20;EXEC SQL END DECLARE SECTION;3. 数据库变量的使用ESQLC中对均能支持PROC中只能用宁4. 基本的SQL语句(査询、插入、删除、修改)a) SELECT 语句EXEC SQL SELECT field_namel, field

3、_name2 , field_nameNFROM table_name_list,.WHEREcond 1AND cond2GROUPBY X, YORDERBY grouplist;b) DECLARE 语句EXEC SQL DECLARE cursor_name FOR SELECT field_namel, field_name2 ,. field_nameNFROM table_name_list,.WHEREcond 1AND cond2GROUPBY X, YORDERBY grouplist;c) U

4、PDATE 语句EXEC SQL UPDATE SET field_namel = : val 1 , field_name2 = :va!2,field_nameN = : valNWHERE condlANDcond2;d) INSERT 语句 简单的INSERT语句:EXEC SQL INSERT INTO VALUES (:stni.var); 复杂的INSERT语句:EXEC SQL INSERT INTO VALUES(:vail,:va!2,valN, :valX :valY);e) FETCH 语句简单的FETC

5、H语句:EXEC SQL FETCH curs_name INTO :stmvar;复杂的FETCH语句:EXEC SQL FETCH curs_name INTO:vail ,.,:valN ,:valX.:valY;5. 数据库变量的数据类型ESQLC中不支持unsigned类型,对typedef支持也不是很好,虽然在 sys/types.h中已经有类型定义,但还是要在程序中再次定义,且必须定义在BEGIN DECLARE/END DECLARE 之间PROC中能够支持unsigned类型,也支持typedef,即在sys/types.h中定 义的都能够使用数据库日期型的问题:Oracle

6、数据库和informix数据库不同,不支持自1899-12-31以来的long型日期处理。但oracle和informix均支持字符串型的日期处理。二. 高级SQL操作(游标等)1. 数据库打开、关闭操作ESQLC中打开数据库使用database数据库名,关闭数据库使用database close/*打开数据库*/int open_database(void)EXEC SQL database devpjxnc;if(sqlca.sqlcode)prin tf(nopen_databaseerror:%d nJsqlca.sqlcode);return elsereturn 0;/*关闭数据库

7、*/void close_database(void)EXEC SQL close database;PROC 中打开数据库使用 CONNECT :username IDENTIFIEDBY :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(

8、password);strcpy(user namVposp”);strcpy(password, ”posp”);EXEC SQL conn ect :user name ide ntified by : password;error:%d nJif(sqlca.sqlcode)prin tf("open_database sqlca.sqlcode);return elsereturn 0;也可以这样SQL CONNECT Uusername/passworddatabase;2. 事务操作ESQLC中语法打开事务,begin work;提交事务,commit work; 回滚事

9、务,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. 游标操作游标基本

10、语法定义游标,declare cur名称cursor for sql语句扌开游标,open cur_i或open cur_l using :conlz:con2 Fetch 游标,fetch cur_l或 fetch cur_l into :vall,:val2 关闭游标,close cur_l释放游标,free cur 1两平台区别:sql语句区别同基本sql语句,PROC中不能用用常值(where name='张三'), 只能用数据库变量(where name= :m_name)oPROC中不能释放游标,而ESQLC中要亲释放游标。三. 数据库操作运行结果1-表达符ESQL

11、C 中一般采用 SQLCODE,也可釆用 sqlca.sqlcodePROC 中只能用 sqlca.sqlcodeo2.常用数值含义开发阶段含义Informix, ESQL/COracle, PROC插入时列数不匹配-236(待查)字段不存在-217(待査)运行阶段含义Informix, ESQL/COracle, PROC找到数据00找不到数据1001403插入时重复-239找到记录不唯一(待査)(待査)范围超限(待査)1480找到值为NULL(待查)-1405其他(待续)四. 程序的编译及链接1. 基本命令ESQLC预编译命令esqlPROC预编译命令proc2. 编译语法ESQLC中ma

12、kefile的一般写法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_i)c o $*.o $*.cPROC中makefile的一般写法CC=ccPROC=proc userid=用户名/密码 sqlcheck=full char_map=string.SUFFIXES:.pc.SUFFIXES:.c.pc.o:$(PROC) $(INCL_

13、FLAG2) iname=$*.pc oname=$*.c $(CC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.c rm -f $*.c rm -f.c.o:$(CC) $(INCL_FLAG) $(CFLAGS_i)c o $*.o $*.c其中:INCL_FLAG=链接头文件目录CFLAGS_1=编译参数,如q64表示编译成64位,-qcpluscmt表示支持单 行注释3.链接语法ESQLC中,两种方法:$(ECC) -o可执行文件 应用链接文件1应用链接文件2 .或者$(CC) -o可执行文件应用链接文件i应用链接文件2及Informix静态链 接库

14、(可通过esqql-libs获知该连接那些库文件,另外再加上$(INFORMIXDIR)/lib/checkapi.o)PROC 中:$(CC) -0可执行文件应用链接文件1应用链接文件2及0racle静态链接库 (可通cat $ORACLE_HOME/lib/sysliblist获知应该链接那些库文件,另 外要加上-Iclntsh)其中链接文件,可以是obj文件,静态库文件,源文件等。五.Makefile文件对比 编译文件mk.ifx# Ma kef ile for informix/oracle#i定义公共make变量APPDIR=$(HOME)DB_HOME=$(INFORMIXDIR)

15、 BIN_DIR=$(APPDIR)/bin#2 informix下的make变量设置INCL_DB=$(DB_HOME)/incl/esqlDB_OBJ=dbfx.oDBLIB=$(INFORMIXDIR)/lib/esql/checkapi.o -L$(INFORMIXDIR)/lib/esql L$(INFORMIXDIR)/lib -lixsql -lixasf -lixgen -lixos -lixgls lnsl_s -lcrypt_i -Isocket -Im -Isuds -lx ECC=esqlCFLAGS_1 =CFLAGS_2= #informix 设置.end#3.CC

16、 变量及 includeCC=ccINCL_APP=$(APPDIR)/inclINCL_TUXEDO=$(TUXDIR)/i ncludeINCL_FLAG = -I$(INCL_APP) -I$(INCL_DB) INCL_FLAG2=include=$(INCL_APP) include=$(INCL_DB)#4应用依赖的OBJ设置clean:rm -f *.oTESTAPP=mylib.o #等等testapp:testapp.o $(LIB_TESTAPP) $(DB_OBJ)$(CC) $(CFLAGS_2)o $ $? $(DBLIB)mv $ $(BIN_DIR).SUFFIX

17、ES:.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 $*.c2.编译文件mkoa7乞库止每个人平等地提升口我!#Makefile for informxi/oracle#no tuxedo env#1 定义公共make变量APPDIR=$(HOME)DB_HOME=$(ORACLE_HOME) BIN_DIR=$(APPDIR)/bi n#2 oracle下的make变量设置INCL_DB=$(D

18、B_HOME)/precomp/publicDB_OBJ=db_ora.oDBLIB=-L$(ORACLE_HOME)/lib -Im -IclntshPROC=proc userid = posp/posp sqlcheck=full char_map=stri ng def_sqlcode=yesCFLAGS_1 = q64 -qcpluscmtCFLAGS_2=-q64#oracle.设置.end#3.CC 变量及 includeCC=ccINCL_APP=$(APPDIR)/inclINCL_TUXEDO=$(TUXDIR)/i ncludeINCL_FLAG = -I$(INCL_APP) -I$(INCL_DB)INCL_FLAG2=include = $(INCL_APP) include=$(INCL_DB)#4应用所依赖的OBJ设置等clean:rm -f *.oTESTAPP=myl

温馨提示

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

评论

0/150

提交评论