Oracle Pro*c 中sqlca以及oraca的定义和说明

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];
};
struct sqlca sqlca;


sqlcaid:是字符串变量,它被初始化为sqlca。它被用于标识一个SQL通讯区
sqlabc:是一个整型变量,用于保留SQL通讯区的长度(以字节为单位)
sqlcode:是一个整型变量,用于保留最近执行的SQL语句的状态码。这些状态码指明SQL语句的操作结果,可能是下列值之一:
0:表示该SQL语句被正确执行,没有发生错误和例外。
>0:意味着ORACLE执行了该语句,但遇到一个例外。当ORACLE未找到满足WHERE子句检索条件的行时,或者SELECT或FETCH未有行返回时,就出现例外。
<0:表示由于数据库、系统、网络或应用程序的错误,ORACLE未执行该SQL语句。当出现这类错误时,当前事务一般应回滚。
sqlerrm:是个子结构,它包含如下两个元素:
sqlerrml:保留存储在sqlerrmc中的信息文本长度。
sqlerrmc:保留与sqlcode中的错误代码相对应的错误信息文本。信息文本的最大长度不超过70个字符。要取得长于70个字符的完整信息文本,必须用SQLGLM()函数。只有sqlcode中的代码为负时,才引用sqlerrmc中的信息。如果当sqlcode中的代码为0时引用了sqlerrmc,则取出的是与前面的SQL语句有关的信息。
sqlerrp:该字段目前尚未使用,保留将来使用。
sqlerrd:它是一个数组,有六个元素:
sqlerrd[0]:留待将来使用
sqlerrd[1]:留待将来使用
sqlerrd[2]:保存当前SQL语句处理的行数。但是,如果当前的SQL语句失败,则sqlerrd[2]中的值无定义。如果在处理中间出现错误,则sqlerrd[2]a给出成功处理的行数。在OPEN语句执行后,sqlerrd[2]被置成0,在FETCH后增值。对于EXECUTE,INSERT、UPDATE、DELETE和SELECT INTO 语句,该计数反映成功处理的行数。
sqlerrd[3]:留待将来使用
sqlerrd[4]:保存相对位移,它指出在那个字符位置开始出现(语法)分析错误。其中第一个字符的相对位移是0。
sqlerrd[5]:留待将来用
sqlwarn:是字符型数组,有8个元素,被用作警告标志。如果在执行SQL语句时有例外发生,则相应的元素置“W”标志。各元素描述如下:
sqlwarn[0]:如果其它警告标志被设置的话,该元素就被设置
sqlwarn[1]:如果把一个截短的列值赋给一个输出宿主变量的话,则设置该标志。仅对字符数据截短时,才设置该标志;对于数字数据的截短并不设置该标志,也不返回负的sqlcode码。为了发现是否有截短发生,以及按多长截短;可检查输出宿主变量所对应的指示器变量,该指示器变量中的正值是列的原始长度。
sqlwarn[2]:该标志不再使用
sqlwarn[3]:如果查询选择表中
sqlwarn[4]:如果表中的每一行都被未有WHERE子句的DELETE或UPDATE语句处理,则设置该标志。
sqlwarn[5]:当EXEC SQL CREATE{PROCEDURE|FUNCTION|PACKAGE|PACKAGEBODY}语句由于PL/SQL编译错误而失败时,该标志被设置。
sqlwarn[6]、sqlwarn[7]:不再使用
sqlext:该串字段保留将来使用。


main()
{
  char msg_buf[100];
  int buf_size = 100;
  int mag_len ;
  EXEC SQL WHENEVER SQLERROR GOTO  sqlerror
;
sqlerror:
  sqlglm(msg_buf,&buf_size,&msg_len);
  msg_buf[msg_len]='\0';
  printf("\n%s\n",msg_buf);
}


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 lornor;
  long oranpr;
  long oranex;
};
struct oraca oraca;


oracaid:
它被初始化为"ORACA",用于标识一个ORACLE通讯区。
oarcabc:
用于保存ORACA数据结构的长度(以字节为单位)。
oracchf:
如果主DEBUG标志(oradbgf)被设置,则该标志能在每个光标操作之前,搜集缓冲存储器的统计,并检查光标缓冲存储器的一致性。ORACLE运行库做该一致性检查,并把发出的错误信息返回给SQLCA。这个标志有下列设置:
0:禁止光标缓冲存储器一致性检查(缺省)。
1:能进行光标缓冲存储器一致性检查。
oradbgf:
这是DEBUG的主标志字段,根据它决定是否选择DEBUG操作。它有以下两个设置:
0:禁止所有的DEBUG操作(缺省)
1:允许进行所有的DEBUG操作。
oarhchf:
它也是一个标志字段。如果主DEBUG标志(oradbgf)被设置,则每当预编译程序动态分配或释放内存单元时,它通知ORACLE运行库检查堆一致性。该标志必须在CONNECT命令发出之前设置,并且一旦设置,就不能被清除,它不靠虑后续的变更要求。该标志对于发现破坏内存的程序错误是有用的。它有如下两个设置:
0:禁止堆一致性检查(缺省)
1:允许堆一致性检查。
orastxtf:
该标志字段指定当前的SQL语句文本是否被保存,以及如何保存。它有如下设置:
0:不保存SQL语句文本(缺省)。
1:仅对SQLERROR保存SQL语句文本。
2:仅对SQLERROR或SQLWARNING保存语句文本。
3:总是保存SQL语句文本。
SQL语句文本被保存在命名为orastxt的子结构中。
以下的变量有助于迅速定位错误。                                               
oarstxt:
这是一个子结构吗,它有两个成员。用它来帮助发现错误的SQL语句。该结构保存ORACLE最近所分析的SQL语句文本。该结构的两个成员描述如下:
oarstxtl:保存当前SQL语句的长度。
oarstxtc:保存当前SQL语句的文本。至多保存文本的开始70个字符。
由预编译程序所分析的语句不保存在ORACA中。
oarsfnm:
这是一个子结构,它用来标识包含当前SQL语句的源文件名。当一个应用由多个源文件组成时,用这个子结构帮助发现当前出错的SQL语句时处于哪个源文件内。该结构包含如下两个字段:
oarsfnml:标识存放在orasfnmc中的文件名的长度。
orasfnmc:保存源文件名,至多70个字符。
oraslnr:
标识当前SQL语句所在行的行号
如果主DEBUG标识(oradbgf)和光标缓冲存储器标志被设置,下边所叙述的变量能使你搜集光标缓冲存储器统计。这些变量由程序中所发的每一个COMMIT或ROLLBACK命令自动设置。在内部,对于每个连接的数据库都有一组这样的变量,ORACA中的当前值从属于该数据库,最近的COMMIT或ROLLBACK相对于这些值被执行。
orahoc
它记录程序运行期间MAXOPENCURSORS被设置的最高值
oramoc
它记录程序所需要打开的ORACLE光标的最大数。如果MAXOPENCURSORS被设置得太低,该最大数可能比orahoc大,则强制预编译程序光标缓冲存储器。
oracoc
该字段记录程序当前打开的ORACLE光标数
oarnor
该字段记录程序所需要的光标缓冲存储器的再赋值次数。该数说明在光标缓冲存储器中“重复做”的程度,应使它尽可能低。
oarnpr
该整型字段记录程序所需要的SQL语句分析次数。
oranex
该整型字段记录程序所需要的SQL语句执行次数,该数与oranpr数的比率应尽可能高。换句话说,就是要避免不必要的再分析。


PROCEDURE create_dept
(new_dname IN CHAR(14),
new_loc IN CHAR(13),
new_deptno OUT NUMBER(2)) IS
BEGIN
  SELECT deptno_sql.NEXTVAL INTO new_deptno FROM dual;
  INSERT INTO dept VALUSE(new_deptno,new_dname,new_loc);
END create_dept;


PACKAGE  emp_actions IS
  PROCEDURE hire_employee(empno NUMBER,emame CHAR,...);
  PROCEDURE fire_employee(emp_id NUMBER);
END emp_actions;


PACKAGE BODY emp_actions IS
  PROCEDURE hire_employee(empno NUMBER,enmae CHAR,...)IS
  BEGIN
    INSERT INTO emp VALUES(empno,ename,...);
  END hire_employee;
  PROCEDURE fire_employee(emp_id NUMBER) IS
  BEGIN
    DELETE FROM emp WHERE empno=emp_id;
  END fire_employee;
END emp_actions;







你可能感兴趣的:(Oracle Pro*c 中sqlca以及oraca的定义和说明)