c oracle语句,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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值