前言
本系列第二集,主要用于介绍ORACLE通讯区。最后一部分则会体积INCLUDE语句
希望这次的学习计划可以坚持下去,相关笔记的整理也会继续下去。
一、通讯区简介
为了取得每个SQL语句执行后的相关状态说明,以便进行错误的后续操作已经跟踪。ORACLE提供两个通讯区:
- SQL通讯区-SQLCA
- ORACLE通讯区-ORACA
二、SQLCA
什么是SQLCA
SQLCA是ORACLE和应用程序的一个接口,主要用于错误诊断和时间处理
执行PRR*C程序时,ORACLE把每一个嵌入SQL状态信息存入SQLCA中,主要有错误代码、警告标致设置、诊断文本和处理行数等。
SQLCA的组成
struct sqlca{
char sqlcaid[8];
long sqlabc;
long sqlcode;
struct{
unsigned short sqlerrml;
char sqlerrmc[70];
}sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlext[8]
};
名称 | 作用 |
sqlid | 用于标识一个SQLCA |
sqlabc | 保留sqlca的长度(字节为单位) |
sqlcode | 保留sql语句处理的代码: 0:正常执行 >0:执行语句发生一个异常 <0:未执行语句便发生异常 |
sqlerrm | 一个子结构 |
sqlerrm.sqlerrml | sqlerrmc的长度 |
sqlerrm.sqlerrmc | 错误代码中的错误信息。如果错误信息超过70个字符,如果需要取得完整的错误信息必须使用SQLGLM ()函数 |
sqlerrp | 保留字,暂时无作用 |
sqlerrd | 一个数组,元素作用如下: 0:保留 1:保留 2:保存当前SQL语句处理的行数,如果SQL执行失败无值定义;如果处理中发生异常,则记录成功的条数;在一个OPEN动作后,值将被归零,在FETCH动作后增加 3:保留 4:保存相对位移,指出SQL语句中哪一个字符开始出现(语法)分析错误,下标从0开始 5:保留 |
sqlwarn | 8个元素用于标识相应的警告标识,被置为W表示发生相应的警告 0:如果有警告标识位,该为就会被标识 1:如果把一个截断的列值赋给宿主变量,则会标识该标识。仅对字符数据菜生效。 2:失效 3:如果查询选择表中的列数不等于SELECT或者FETCH语句的into自子句中的数组个数,则会标识该标识位 4:如果表中的每一个行都没有被WHERE子句(全查)的DELETE和UPDATE处理,则会标识该标识 5:当EXEC SQL CREATE语句由于PL/SQL编译错误而失败时,该标志被设置 6:失效 7:失效 |
sqlext | 保留 |
SQLCA的声明
- 使用EXEC SQL INCLUDE sqlca;
- 直接使用结构体声明,编写入程序中
- 当PRO*C程序是几个源文件共用,可以使用extern存储:#define SQLCA_STORAGE_CLASS exterm
三、ORACA
什么是ORACA
一个类似SQLCA的数据结构,可以当作为SQLCA的一个辅助通讯区。当需要更加详细的状态信息,则可以使用ORACA,ORACA的使用是可选的。
ORACA的组成
struct oraca{
char oracaid[8];
long oracabc;
long oracchf;
long oradbgf;
long orahchf;
long orastxtf;
struct{
unsigned short orastxtl;
char orastxtc[70];
}orastxt;
struct{
unsigned short orasfnml;
char orasfnmc[70];
}orasfnm;
long oraslnr;
long orahoc;
long oramoc;
long oracoc;
long oranor;
long oranpr;
long oranex;
}
名称 | 作用 |
oracaid | 标识一个ORACA |
oracabc | 用于比保存ORACA数据结构的长度(字节为单位) |
oracchf | 如果主DEBUG标致被设置,则该标识会在每个光标操作前,搜集缓冲存储器的统计,并检查光标缓冲存储器的一致性,并将相关错误返回给SQLCA。 相关设置: 0:禁止进行一致性检查(默认) 1:进行一致性检查 |
oradbgf | DEBUG主比标致位 0:禁用(默认) 1:启用 |
orahchf | 如果主DEBGU标识被设置,则每当预编译程序动态分配或释放内存单元时,它通知ORACLE运行库检查堆的一致性。该标识必须在CONNECT命令发出前被设置,一旦被设置就不能被清楚。用于发现破坏内存的程序的错误。 0:禁用(默认) 1:启用 |
orastxtf | 标识当前SQL语句的文本是否被保存,以及如何保存 0:不保存SQL语句(默认) 1:仅对SQLEEROR保存SQL语句文本 2:仅对SQLERROR或SQLWARNING保存文本 3:总是保存SQL语句文本 |
orastxt | 子结构用于保存ORACLE最近分析的SQL语句文本 |
orastxt.orastxtl | 保存当前SQL语句文本的长度 |
orastxt.orastxtc | 保存当前SQL语句的文本。至多保存文本的开始70个字符,由预编译程序所分析的语句不被保存在ORACA中 |
orasfnm | 子结构,用于标识包含当前SQL语句的源文件名。用于多源文件定位出错SQL所在源文件使用 |
orasfnm.orasfnml | 标识orasfnmc的长度 |
orasfnm.orasfnmc | 保存源文件名,至多70个字符 |
oraslnr | 标识当前SQ连语句所在行的行号 |
orahoc | 记录程序运行期间MAXOPENCURSORS被设置的最高值 |
oramoc | 记录程序所需要打开的ORACLE光标最大数。如果MAXOPENCURSORS设置的太低,该最大数可能比orahoc大,则强制预编译程序扩大光标缓冲存储器大小 |
oracoc | 记录当前打开的光标数 |
oranor | 该字段记录程序所需要的光标缓冲存储器的再赋值次数。表示光标缓冲存储器中的“重复做”的程度,应使它尽可能低 |
oranpr | 记录程序所需要的SQL语句分析次数 |
oranex | 记录程序锁需要的SQL执行次数,应该尽可能的比oranspr高 |
ORACA的声明
- 使用INCLUDE: EXEC SQL INCLUDE ORACA;
- 将结构体声明直接写入程序中
- 为了可以使用ORACA,需要在预编译选项中打开其选项:
- 在命令行上指定ORACA=YES
- 在程序行上编写如下语句:EXEC ORACLE OPTION(ORACA = YES)
三、SQLCODE声明
在EXEC SQL DELCARE SECTION之外直接声明
long SQLCODE;一定要大写
四、INCLUDE语句
- 可以用于声明通讯区;
- INCLUDE的相当于将一个文件拷贝到程序内,类似C语言的#include
- 格式为EXEC SQL INLUCE filename;
- 如果文件扩展名未指定,则默认为.h文件
- 对大小写敏感
- 主要用户INCLUDE其他相关的.pc文件,因为需要进行预编译