ProC第三弹
一、前言
我们上面已经了解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第三弹的更多相关文章
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
- 『PyTorch』第三弹重置_Variable对象
『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...
- codechef营养题 第三弹
第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...
- 好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!
原文:好玩的WPF第三弹:颤抖吧,地球!消失吧,地球! 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net ...
- 【深度森林第三弹】周志华等提出梯度提升决策树再胜DNN
[深度森林第三弹]周志华等提出梯度提升决策树再胜DNN 技术小能手 2018-06-04 14:39:46 浏览848 分布式 性能 神经网络 还记得周志华教授等人的“深度森林”论文吗?今天, ...
- Java并发必知必会第三弹:用积木讲解ABA原理
Java并发必知必会第三弹:用积木讲解ABA原理 可落地的 Spring Cloud项目:PassJava 本篇主要内容如下 一.背景 上一节我们讲了程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单? ...
- 关于『进击的Markdown』:第三弹
关于『进击的Markdown』:第三弹 建议缩放90%食用 我与神明画押,赌这弹markdown又双叒叕拖稿了 %%%Markdown!我的CSDN编辑器崩了呜呜呜 各路英雄豪杰,大家好! 我们要开 ...
- 关于『HTML』:第三弹
关于『HTML』:第三弹 建议缩放90%食用 盼望着, 盼望着, 第三弹来了, HTML基础系列完结了!! 一切都像刚睡醒的样子(包括我), 欣欣然张开了眼(我没有) 敬请期待Markdown语法系列 ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
随机推荐
- 8.对于.NET的初步理解和介绍
好久没写博客了,最近心情比较low,不知道为什么.很流行的一个问题叫做:如果你明天就挂了,那么你最后悔的事情将会是什么.我想了两个月,答案是不知道,无所谓.这样不好,那这个问题先放一边吧,我们开始这一 ...
- Java中的日志框架
日志框架的介绍和使用 常见的日志框架:JUL(Java.util.logging),JCL(jakarta commons logging),SLF4J,jboss-logging,Log4j,Log ...
- Android Doze模式源码分析
科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...
- 【extjs6学习笔记】1.2 初始:MVC MVVM
模型 这表示数据层.该模型可以包含数据验证和逻辑来保持数据.在 ext js 中, 大多数模型都与一个数据存储一起使用. 视图 这表示用户界面. 是用户在屏幕上看到的组件. 在每次互动的用户与应用程序 ...
- Java抽象类、接口和内部类
1.抽象方法.抽象类 1)抽象方法: 由abstract修饰 只有方法的定义,没有方法的具体实现(连{}都没有) 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个 ...
- 【TensorFlow入门完全指南】模型篇·最近邻模型
最近邻模型,更为常见的是k-最近邻模型,是一种常见的机器学习模型,原理如下: KNN算法的前提是存在一个样本的数据集,每一个样本都有自己的标签,表明自己的类型.现在有一个新的未知的数据,需要判断它的类 ...
- ABAP system landscape和vue项目webpack构建的最佳实践
基于Netweaver的ABAP transport route一般都有dev,test和prod三种类型的系统. 而Vue前端项目的webpack build设置也类似. 以SAP成都研究院数字创新 ...
- 如何处理VirtualBox启动错误消息:The vboxdrv kernel module is not loaded
我在启动minikube时,遇到如下错误消息: Starting local Kubernetes v1.10.0 cluster... Starting VM... E1010 03:27:37.9 ...
- vue 修改端口
- Logistic回归,梯度上升算法理论详解和实现
经过对Logistic回归理论的学习,推导出取对数后的似然函数为 现在我们的目的是求一个向量,使得最大.其中 对这个似然函数求偏导后得到 根据梯度上升算法有 进一步得到 我们可以初始化向量为0,或者随 ...