关于在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称为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
2. 显示引用:EXEC SQL INCLUDE SQLCA (是否 #include
如果你和我一样,需要在一些情况下定义局部的sqlca变量以分开记录不同SQL语句的通讯信息,那么就选择上面两种方法的其中一种,然后在代码里 struct sqlca var_sqlca 定义自己的sqlca变量吧。
请注意,方法二的语句一般放在文件头部。