Pro*C 基础教程-简化版Vol2 通讯区- 精神后花园- JavaEye技术网站

本系列第二集,主要用于介绍ORACLE通讯区。{zh1}一部分则会体积INCLUDE语句

希望这次的学习计划可以坚持下去,相关笔记的整理也会继续下去。

?

为了取得每个SQL语句执行后的相关状态说明,以便进行错误的后续操作已经跟踪。ORACLE提供两个通讯区:

  • SQL通讯区-SQLCA
  • ORACLE通讯区-ORACA

SQLCA是ORACLE和应用程序的一个接口,主要用于错误诊断和时间处理

执行PRR*C程序时,ORACLE把每一个嵌入SQL状态信息存入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 保留

?

  • 使用EXEC SQL INCLUDE sqlca;
  • 直接使用结构体声明,编写入程序中
  • 当PRO*C程序是几个源文件共用,可以使用extern存储:#define SQLCA_STORAGE_CLASS exterm

?

一个类似SQLCA的数据结构,可以当作为SQLCA的一个辅助通讯区。当需要更加详细的状态信息,则可以使用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被设置的{zg}值
oramoc 记录程序所需要打开的ORACLE光标{zd0}数。如果MAXOPENCURSORS设置的太低,该{zd0}数可能比orahoc大,则强制预编译程序扩大光标缓冲存储器大小
oracoc 记录当前打开的光标数
oranor 该字段记录程序所需要的光标缓冲存储器的再赋值次数。表示光标缓冲存储器中的“重复做”的程度,应使它尽可能低
oranpr 记录程序所需要的SQL语句分析次数
oranex 记录程序锁需要的SQL执行次数,应该尽可能的比oranspr高

?

  • 使用INCLUDE: EXEC SQL INCLUDE ORACA;
  • 将结构体声明直接写入程序中
  • 为了可以使用ORACA,需要在预编译选项中打开其选项:
    • 在命令行上指定ORACA=YES
    • 在程序行上编写如下语句:EXEC ORACLE OPTION(ORACA = YES)

在EXEC SQL DELCARE SECTION之外直接声明

long? SQLCODE;一定要大写

?

  • 可以用于声明通讯区;
  • INCLUDE的相当于将一个文件拷贝到程序内,类似C语言的#include
  • 格式为EXEC SQL INLUCE filename;
  • 如果文件扩展名未指定,则默认为.h文件
  • 对大小写敏感
  • 主要用户INCLUDE其他相关的.pc文件,因为需要进行预编译
郑重声明:资讯 【Pro*C 基础教程-简化版Vol2 通讯区- 精神后花园- JavaEye技术网站】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——