PROC是ORACLE数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具体的例子,介绍PROC编程的一些经验及应注意的地方。 例子程序: <code> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlda.h> #include <sqlcpr.h> EXEC SQL INCLUDE sqlca; /*RELEASE_CURSOR=YES 使PROC 在执行完后释放与嵌入SQL有关资源*/ EXEC ORACLE OPTION (RELEASE_CURSOR = YES); EXEC SQL BEGIN DECLARE SECTION; varchar vc_user[20]; long al_empno=0; char ac_ename[11]=""; char ac_hiredate[20]=""; double af_sal=0; EXEC SQL VAR ac_ename IS STRING(11); EXEC SQL VAR ac_hiredate IS STRING(20); EXEC SQL END DECLARE SECTION; /*错误处理函数*/ void sql_error(char *msg) { printf("\n%s,%ld,%s\n", msg,sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK RELEASE; exit(-1); } main() { EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE ERROR: "); /*连接数据库*/ strcpy(vc_user.arr,"scott/tiger@DEMO"); vc_user.len=16; exec sql connect :vc_user; EXEC SQL DECLARE cur_emp CURSOR FOR SELECT EMPNO, ENAME,to_char(HIREDATE,'yyyy/mm/dd hh24:mi:ss'),SAL FROM EMP; EXEC SQL OPEN cur_emp; while(1) { al_empno=0; strcpy(ac_ename,""); strcpy(ac_hiredate,""); af_sal=0; EXEC SQL FETCH cur_emp INTO :al_empno, :ac_ename:ename_ind, :ac_hiredate:hiredate_ind, :af_sal:sal_ind; if( sqlca.sqlcode == 1403) { break; } printf("empno=%ld,ename=%s,hiredate=%s,sal=%lf\n",al_empno,ac_ename,ac_hiredate,af_sal); } EXEC SQL CLOSE cur_emp; EXEC SQL ROLLBACK WORK RELEASE; } </code> 1、宿主变量的声明 在PROC中,在SQL语句中用到的变量称为宿主变量。他们应在EXEC SQL BEGIN DECLARE SECTION;与EXEC SQL EDN DECLARE SECTION; 之间声明,如上面所示.在声明宿主变量时应注意以下几点: (1) 在数据库表中定义为VARCHAR2,VARCHAR,CHAR的字段,在PROC中可声明为CHAR,但长度应为它们在表中定义的长度加1,因为PROC中 CHAR型变量用做结尾。 如:ENAME在表中的定义为ename varchar2(10),在PROC中可定义为: EXEC SQL BEGIN DECLARE SECTION; char ename[11]; EXEC SQL END DECLARE SECTION; 常见错误说明: 如果插入的字符串长度大于10,如:EXEC SQL INSERT INTO EMP(ENAME) VALUES('12345678901');会出现以下错误: error:ORA-01480: STR 赋值变量缺少空后缀。 如果定义为: EXEC SQL BEGIN DECLARE SECTION; char ename[15]; EXEC SQL END DECLARE SECTION; 当插入的字符串长度大于10,小于15时,如:EXEC SQL INSERT INTO EMP(ENAME) VALUES('12345678901');会出现以下错误:
上一篇:Oracle调优(入门及提高篇)
下一篇:Oracle9i数据库设计指引全集二
|