Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1166948
  • 博文数量: 146
  • 博客积分: 6619
  • 博客等级: 准将
  • 技术积分: 1621
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-29 14:06
文章分类

全部博文(146)

文章存档

2020年(1)

2019年(4)

2018年(3)

2017年(5)

2015年(5)

2014年(7)

2013年(5)

2012年(11)

2011年(15)

2010年(13)

2009年(14)

2008年(63)

分类: Oracle

2011-03-21 20:59:49

一、前言

我们上面已经了解Windows和Linux下的ProC开发环境,这里我们更进一步去
简要介绍下ProC的预编译参数。

二、什么是预编译

预编译过程中,Pro*C/C++会自动生成C或者C++的代码,去替代你原来的嵌入SQL,
生成的代码包含了一些数据结构,其中声明了数据类型,长度,变量地址以及SQLLIB需
要的一些其他信息。生成的代码还包括了执行嵌入SQL操作的一些SQLLIB调用。

SQLLIB Windows下名是 "orasql9.lib" ,Linux下是"libclntsh.so.9.0" 。这方面知识可以参
考先前的文章:
《Oracle数据库开发(一).Windows下配置使用ProC》
《Oracle数据库开发(二).Linux下配置使用ProC》

三、使用预编译选项

预编译选项可以控制编译资源的使用,错误提示,标准化输入输出以及管理游标。
在Windows下,多数人倾向于使用“procui.exe”(Oralce菜单里的ProC*C++工具)进行
预编译,可以通过Options菜单选择编译选项。当我们使用Linux平台时,一般会在命
令行下指定参数,例如:
$ proc parse=none iname=main.pc

不管是Windows还是Linux,开发人员可以都键入“proc ?”获取更多的信息。

在Oracle中,关于参数的使用有不少的方法,如:

系统参数文件
用户参数文件
命令行
inline

ProC安装后都会存在唯一的系统参数文件“pcscfg.cfg”,所在路径为“$ORACLE_HOME/precomp/admin”。
用户的参数文件,我们可以手工指定。命令行很容易理解,上面已有相关说明。“inline”
的意思是在原始pc文件中通过“EXEC SQL”显式声明,不过不是所有的参数可以使用
这种方式声明。

关于这些优先级的说明,在Oracle相关的官方文档已经说得很明确。具体内容可
参看《Pro*C/C++开发指南》,这里不再赘述。

四、一些比较重要的参数

CONFIG,PARSE 和 SYS_INCLUDE

在命令行下输入“proc ?”,简单浏览下显示信息,你会发现CONFIG的默认值是空。
ORACLE一直使用的是系统的参数文件,除非你手工去指定config选项。
在Linux环境下,默认的系统参数文件“pcscfg.cfg”中含有“SYS_INCLUDE”的选项,
但是如果“PARSE=NONE",这个“SYS_INCLUDE”的选项会被忽略。所以你可以使用
“proc parse=none iname=main.pc”(上篇文章)轻松编译。

不过当我们指定PARSE值为FULL时,你就必须正确定义“SYS_INCLUDE”,这时可
以在ProC的源文件.pc中,直接使用C语法规则定义宿主变量。可以看下面的例子:


#include "sqlca.h"
#include
#include
#include

void sql_error(char *msg)
{
printf(" %s %s ", msg,(char *)sqlca.sqlerrm.sqlerrmc);
//EXEC SQL ROLLBACK RELEASE;
exit(0);
}

void main() {

EXEC SQL INCLUDE sqlca;
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
EXEC SQL WHENEVER SQLERROR DO sql_error(" ");

char oraCN[200];
strcpy(oraCN, "");

EXEC SQL CONNECT :oraCN;
printf(" [OK Connected!] ");

}

在Windows下,“SYS_INCLUDE"的值类似于“E:Program FilesMicrosoft Visual StudioVC98Include”,
即Vc6.0的头文件目录,编辑“pcscfg.cfg”,然后预编译源代码,程序运行没有任何问题。

在Linux下,可能要稍微复杂一些。

$ pwd
/home/ora/ora9/oracle/precomp/admin
$ cat pcscfg.cfg
sys_include=(/usr/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include)
ltype=short

$ proc parse=full iname=main.pc
$ gcc -g -o main main.c -I/home/ora/ora9/oracle/precomp/public -L/home/ora/ora9/oracle/lib -lclntsh

依上编译,也没有问题。

------------------------------------------------------
Oracle 参考

PARSE=NONE
所有宿主变量必须定义在声明段中。只有在声明段中的预编译指令才会
识别。
PARSE=PARTIAL
可以识别所有的预编译指令,所有宿主变量必须定义在声明段中。如果
CODE=CPP,这个是默认选项。
PARSE=FULL
可以识别所有的预编译指令,可以直接使用C语法定义宿主变量,不必
定义在声明段中。

五、后记

在我使用“PARSE=FULL”选项时,发现“EXEC SQL INCLUDE sqlca;” 和 “EXEC SQL ROLLBACK RELEASE; ”
不能同时使用。不知道是为什么,估计可能是SQLCA的内部兼容性问题。相信有时
间能解决这个问题。

阅读(8665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~