im rem1x.

我又挪地方了。

Archlinux上使用PRO*C 开发Oracle程序之sqlca (1)

without comments

关于在archlinux上安装oracle客户端,可参考wiki:https://wiki.archlinux.org/index.php/Oracle

访问Oracle数据库的C语言编程接口,比较常见的是PRO*C和oci,前者是一种以C语言作为宿主的预编译语言,后者则是一套现成的数据库访问API。比如,俺们公司的后台的一些重要系统现在主要以Oracle系列数据库为主,开发语言基本是C,pro*c和oci在项目中都有使用。一句话,PRO*C上手容易,编码简单,但受约束;oci直接以API形式调用,效率最高,但学习成本高,一般都会做二次封装(有个C++的封装库:OTL)。

本文主要说明在使用PRO*C时,如果需要定义局部sqlca变量时,该做哪些准备工作。

如果你的程序只使用全局的sqlca变量,那么 #include <sqlca.h> 就完事儿了,文章到此可以直接 return 0 。

SQLCA称为SQL通讯区,用于记录每个SQL语句的执行状态,以便进行错误诊断,它是一个结构体,存在于sqlca.h头文件中:

struct sqlca {
/* ub1 */ char    sqlcaid[8];
/* b4   */ int     sqlabc;
/* b4   */ int     sqlcode;
struct {
/* ub2 */ unsigned short sqlerrml;
/* ub1 */ char           sqlerrmc[70];
} sqlerrm;
/* ub1 */ char    sqlerrp[8];
/* b4   */ int        sqlerrd[6];
/* ub1 */ char    sqlwarn[8];
/* ub1 */ char    sqlext[8];
};

在执行PRO*C程序时,Oracle会把每一个嵌入式SQL语句执行的状态信息保存在SQLCA结构体里,包括错误代码、警告标志设置、诊断文本和处理行数等。因此,在SQL语句执行之后,可以通过SQLCA的信息来判断SQL语句的执行是否成功,出现了什么错误和例外等等。

当proc的mode=oracle(这是默认的模式)时,SQLCA是需要显示说明的,否则proc预编译就会报错,或者是在连接时失败。SQLCA的说明方式有以下两种:

1. 直接把上述 struct sqlca 的代码写到自己的程序文件中(如果选择这种方法,就别 #include <sqlca.h> 了);

2. 显示引用:EXEC SQL INCLUDE SQLCA (是否 #include <sqlca.h> ,都不影响proc的执行);

如果你和我一样,需要在一些情况下定义局部的sqlca变量以分开记录不同SQL语句的通讯信息,那么就选择上面两种方法的其中一种,然后在代码里 struct sqlca var_sqlca 定义自己的sqlca变量吧。

请注意,方法二的语句一般放在文件头部。

Written by rem1x

六月 26th, 2011 at 2:11 下午

Posted in programing

Tagged with , , ,

Leave a Reply