Pro*C 基础教程-简化版 Vol2 通讯区

前言

本系列第二集,主要用于介绍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.sqlerrmlsqlerrmc的长度
sqlerrm.sqlerrmc错误代码中的错误信息。如果错误信息超过70个字符,如果需要取得完整的错误信息必须使用SQLGLM ()函数
sqlerrp保留字,暂时无作用
sqlerrd一个数组,元素作用如下:
0:保留
1:保留
2:保存当前SQL语句处理的行数,如果SQL执行失败无值定义;如果处理中发生异常,则记录成功的条数;在一个OPEN动作后,值将被归零,在FETCH动作后增加
3:保留
4:保存相对位移,指出SQL语句中哪一个字符开始出现(语法)分析错误,下标从0开始
5:保留
sqlwarn8个元素用于标识相应的警告标识,被置为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:进行一致性检查
oradbgfDEBUG主比标致位
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文件,因为需要进行预编译
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值