从esqlc移植到proc第二版

上传人:ji****n 文档编号:45272811 上传时间:2018-06-15 格式:DOC 页数:13 大小:81KB
返回 下载 相关 举报
从esqlc移植到proc第二版_第1页
第1页 / 共13页
从esqlc移植到proc第二版_第2页
第2页 / 共13页
从esqlc移植到proc第二版_第3页
第3页 / 共13页
从esqlc移植到proc第二版_第4页
第4页 / 共13页
从esqlc移植到proc第二版_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《从esqlc移植到proc第二版》由会员分享,可在线阅读,更多相关《从esqlc移植到proc第二版(13页珍藏版)》请在金锄头文库上搜索。

1、从从 ESQLCESQLC 移植到移植到 PROCPROC 第二版第二版从 SQLC 移植到 PROC 第二版本文档讲述数据库嵌入式 SQL/C 语言程序从 ESQLC 向 PROC 移植过程中所进行的分析、移 植过程,并讲述如何编写可通用的嵌入式 SQL/C 语言程序。 作者:余军, 2007 年 5 月 9 日,初版,完成差异性分析,移植步骤、通用程序说明。 2007 年 5 月 21 日,修订,对差异性分析增加数据类型的说明,并增加编写了详细的程序 代码及 Makefile 文件。第一部分:第一部分:ESQLC,PROC 差异性分析差异性分析一基本语法一基本语法1语法字符语法字符ESQL

2、C 中既支持$数据库语法,同时也支持“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;

3、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

4、name= :m_name5数据库变量的数据类型数据库变量的数据类型ESQLC 中不支持 unsigned 类型,对 typedef 支持也不是很好,虽然在 sys/types.h 中已经有 类型定义,但还是要在程序中再次定义,且必须定义在 BEGIN DECLARE/END DECLARE 之间 PROC 中能够支持 unsigned 类型,也支持 typedef,即在 sys/types.h 中定义的都能够使用二高级二高级 SQL 操作(游标等)操作(游标等)1数据库打开、关闭操作数据库打开、关闭操作ESQLC 中打开数据库使用 database 数据库名,关闭数据库使用 database

5、 close PROC 中打开数据库使用 CONNECT :username IDENTIFIED BY :password,不用关闭2事务操作事务操作ESQLC 中语法 打开事务,begin work; 提交事务,commit work; 回滚事务,rollback work; PROC 中语法 打开事务,不写 提交事务,commit work; 回滚事务,rollback;3游标操作游标操作游标基本语法 定义游标,declare cur 名称 cursor for sql 语句 打开游标,open cur_1 或 open cur_1 using :con1,:con2 Fetch 游标,

6、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.sqlcode PROC 中只能用 sqlca.sqlcode。2常用数值含义常用数值含义开发阶段含

7、义Informix,ESQL/COracle,PROC插入时列数不匹配-236(待查)字段不存在-217(待查)运行阶段含义Informix,ESQL/COracle,PROC找到数据00找不到数据1001403插入时重复-239-1找到记录不唯一(待查)(待查)范围超限(待查)1480找到值为 NULL(待查)-1405其他(待续) 四程序的编译及链接四程序的编译及链接1基本命令基本命令ESQLC 预编译命令 esql PROC 预编译命令 proc2编译语法编译语法ESQLC 中 makefile 的一般写法 CC=cc ECC=$(INFORMIXDIR)/bin/esql.SUFFIX

8、ES:.ec .SUFFIXES:.c.ec.o:$(ECC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.ecrm -f $*.c .c.o:$(CC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.cPROC 中 makefile 的一般写法 CC=ccPROC=proc userid=用户名/密码 sqlcheck=full char_map=string.SUFFIXES:.pc .SUFFIXES:.c.pc.o:$(PROC) $(INCL_FLAG2) iname=$*.pc oname=$*.c$(CC) $(I

9、NCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.crm -f $*.crm -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

10、 libs 获知该连接那些库文件,另外再加上$(INFORMIXDIR)/lib/checkapi.o)PROC 中,$(CC) -o 可执行文件 应用链接文件 1 应用链接文件 2 及 Oracle 静态链接库(可 通过 cat $ORACLE_HOME/lib/sysliblist 获知应该链接那些库文件,另外要加上-lclntsh) 其中链接文件,可以是 obj 文件,静态库文件,源文件等。第二部分:移植步骤第二部分:移植步骤不同风格的 ESQLC 程序,采用不同的移法,总之越接近 PROC,则越容易移植,这里讲述 与 PROC 风格相差最大的 ESQLC 程序(采用$作为数据库操作标识

11、符)的移植方法。一程序移植一程序移植编辑工具采用 UltraEdit,应用多文件替换操作。1程序修改程序修改步骤 1,先修改操作语句,即将$修改“EXEC SQL ”Informix,ESQL/COracle,PROC“$select “EXEC SQL select “$insert “EXEC SQL insert “$update “EXEC SQL update “$delete “EXEC SQL delete “$prepare “EXEC SQL prepare “$declare “EXEC SQL declare “$open “EXEC SQL open “$fetch “

12、EXEC SQL fetch “$close “EXEC SQL close “$free “EXEC SQL free “或“free_cursor(); /“$begin work“EXEC SQL begin work“或“begin_work()“$commit work“EXEC SQL commit work“$rollback work“EXEC SQL rollback“或“rollback_work()“$database “EXEC SQL database “或“open_database()“$close database “EXEC SQL database “或“c

13、lose_database()“步骤 2,将剩下的$全部替换成: 步骤 3,手工修改各数据库变量定义部分 步骤 4,将打开数据库语句更新成 open_database() 步骤 5,编写相应的函数 open_database(),free_cursor(),begin_work(),rollback_work()等,函 数实体程序根据相应数据库平台的语法即可。 步骤 6,在公共头文件中宏定义#define SQLCODE sqlca.sqlcode 步骤 7,用 PROC 的 makefile 文件,进行重新编译,再细微调整错误的地方。2Makefile 文件的编写文件的编写步骤 1,更改相应

14、的编译变量 $(CC)也改成相应环境下的 C 编译器 $(ECC)=xxx 改成$(PROC)=xxx 步骤 2,修改.ec 到.o 的编译方法 .ec.o:$(PROC) $(INCL_FLAG2) iname=$*.ec oname=$*.c$(CC) $(INCL_FLAG) $(CFLAGS_1) -c -o $*.o $*.crm -f $*.crm -f $*.lis步骤 3,修改连接方法 将$(ECC)修改成$(CC)。二数据库移植二数据库移植1表结构的移植表结构的移植软件工具 powdesinger 步骤 1,利用反向工程,从原来的 INFORMIX 数据库中生成 PDM 图表

15、文件 步骤 2,更改当前数据库连接,新的连接为 ORACLE 数据库 步骤 3,生成 SQL 语句。 步骤 4,将该 SQL 语句在 ORACLE 环境中执行即可。2数据的移植数据的移植不同的数据库之间,采用文本文件移植较为安全方便 步骤 1,从 INFORMIX 库中导出所有表,可以用 dbexport,也可以用 shell 文件执行 unload to xx.txt select * from xx 表 步骤 2,将文本文件传到可以导入 ORACLE 的位置。 步骤 3,编写 ORACLE 的 sqlldr 控制文件,执行即可。第三部分:如何编写两个平台通用的第三部分:如何编写两个平台通用

16、的 C 程序程序在项目实施过程中,一个产品往往流程完全一致,但不同的客户可能数据库平台有区 别,作为软件开发商或供应商,如果同时提供两个版本,很容易造成版本不统一,加大了 维护成本,所以必须找到一个方法使两个版本程序能尽可能的复用。经过本人的实践,最 后采用以下 3 个不同的宏定义或文件实现程序在两个平台间的共用。 aDB_IS_INFORMIX/DB_IS_ORACLE 等宏定义 bdb_ifx.ec/db_ora.ec 数据库操作 cmk.ifx/mk.ora 编译用的 make 文件一程序文件名的统一一程序文件名的统一ESQLC 中只支持扩展名=ec 的 ESQLC 程序,而 PROC 中可支持任意扩展名的 PROC 程序,所 以我们将程序名称统一成 xxx.ec二数据库公共宏定义二数据库公共宏定义/* #define DB_IS_INFO

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号