您的位置:首页 > 数据库 > Oracle

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

2011-11-13 08:03 609 查看
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 c sql struct 存储 insert