一、前言

我们上面已经了解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 <stdio.h>
#include <string.h> 
#include <stdlib.h>

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(" <ERROR> ");

char oraCN[200];
strcpy(oraCN, "system/ddd@unixdb");

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的内部兼容性问题。相信有时
间能解决这个问题。

原文地址:http://blog.chinaunix.net/uid-10376640-id-2960118.html

ProC第三弹的更多相关文章

  1. 前端学习 第三弹: JavaScript语言的特性与发展

    前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...

  2. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  3. codechef营养题 第三弹

    第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...

  4. 好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!

    原文:好玩的WPF第三弹:颤抖吧,地球!消失吧,地球! 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net ...

  5. 【深度森林第三弹】周志华等提出梯度提升决策树再胜DNN

    [深度森林第三弹]周志华等提出梯度提升决策树再胜DNN   技术小能手 2018-06-04 14:39:46 浏览848 分布式 性能 神经网络   还记得周志华教授等人的“深度森林”论文吗?今天, ...

  6. Java并发必知必会第三弹:用积木讲解ABA原理

    Java并发必知必会第三弹:用积木讲解ABA原理 可落地的 Spring Cloud项目:PassJava 本篇主要内容如下 一.背景 上一节我们讲了程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单? ...

  7. 关于『进击的Markdown』:第三弹

    关于『进击的Markdown』:第三弹 建议缩放90%食用 我与神明画押,赌这弹markdown又双叒叕拖稿了 %%%Markdown!我的CSDN编辑器崩了呜呜呜 各路英雄豪杰,大家好!  我们要开 ...

  8. 关于『HTML』:第三弹

    关于『HTML』:第三弹 建议缩放90%食用 盼望着, 盼望着, 第三弹来了, HTML基础系列完结了!! 一切都像刚睡醒的样子(包括我), 欣欣然张开了眼(我没有) 敬请期待Markdown语法系列 ...

  9. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

随机推荐

  1. 【手撸一个ORM】第五步、Expression(表达式目录树)转换为Where子句

    说明 在SQL中,查询.修改比较常用到WHERE子句,在这里根据使用场景不同,定义了两个类,一个用于查询,一个用于修改(插入)操作.原因是: 查询操作支持一级导航属性查询,如student.Schoo ...

  2. ABP框架和NET CORE实战

    http://www.fishpro.com.cn/2017/09/ ABP实战系列 ABP实战 ABP-第一个Asp.net core 示例(7)AutoMapper的使用 我们为什么需要使用DDD ...

  3. 【Java】 Maven多模块项目上传到Sonar扫描问题合集

    上传到Soanr时,项目有单元测试数,但是覆盖率为0 修改pom.xml <plugin> <groupId>org.apache.maven.plugins</grou ...

  4. GNUPG

    PGP (Pretty Good Privacy) 是由 Phil Zimmermann 于 1991 开发的一个用于数据加密和数字签名的程序,由于被广泛应用以至于后来形成一个开放的标准 OpenPG ...

  5. C++运算符重载讲解与经典实例

    最近在学C++,找到一篇详细讲解运算符重载的文章,贴在这里分享和收藏. C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.例如: class  ...

  6. mysql 5.7.20 在线安装与卸载(yum卸载与rpm卸载方式)

    mysql5.7.20和之前的5.7.16版本不同,解压后没有data文件,需要自己建立 1.把下载的mysql5.7.20放到目录:/usr/local/2.卸载cenos上预装的mysql查看已安 ...

  7. 收集的20个非常有用的Java程序片段

    下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric strin ...

  8. 日常-acm-韩信点兵

    相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排,五人一排,七人一排地变换队形,而他每次只看一眼队伍的排尾就知道人数了.输入包含多组数据,每组数据包含三个非负整数a,b,c,表示 ...

  9. Linux OpenGL 实践篇-16 文本绘制

    文本绘制 本文主要射击Freetype的入门理解和在OpenGL中实现文字的渲染. freetype freetype的官网,本文大部分内容参考https://www.freetype.org/fre ...

  10. 字符编码ANSI和ASCII区别、Unicode和UTF-8区别

    ANSI码ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示 ...