Proc *C/C++入门--数组变量

来源:互联网 发布:c语言 登录系统 编辑:程序博客网 时间:2024/05/29 14:35

在Pro*C/C++中也支持数组,可以在宿主变量区域声明一个或者多个数组,但是Pro*C/C++对数组有如下要求:

  • Pro*C只支持一维数组
  • Pro*C不支持数组指针,对于字符串数组采用二维数组的形式,但Proc*C只是把二维数组当作一维数组处理,数组中的每个元素都是一个字符串(字符数组)
  • Pro*C所支持数组最大长度是32767,超出此限制将报错
  • 在SQL语句中使用数组变量,只需给出:和变量名称,不要给下标。

示例:

EXEC SQL BEGIN DECLARE SECTION        int A[100];        char B[100];        char C[100][15];EXEC SQL END DECLARE SECTION

错误例子

for(int i = 0;i < 100; i ++){    EXEC SQL SELECT number,name INTO :emp_number[i], :emp_name[i];}
  • Pro*C/C++利用select语句查询数据库并对比varchar类型和char类型的区别:
    • 当数组作为输入的时候,两者没有什么区别;
    • 当作为输出的时候:
      • 对于char类型的数组,Oracle预编译的时候知道了数组长度,结果数据不够填满数组的时候,后面自动填充空格,需要用户手动处理
      • 对于varchar类型的数组,是变长数据类型,所以Oracle会自动填充合适的数组,最后用’\0’结束,不会多出很多空格,推荐使用varchar类型。

#include <stdio.h>#include  <string.h>#include <stdlib.h>#include "sqlca.h"void sqlerr();//先定义宿主变量 (SQL变量)EXEC SQL BEGIN  DECLARE SECTION ;char * serverid = "scott/tiger@orcl";int         deptno[100];char        dname[100][20];char        loc[100][20];int         count;int         deptno2[100];varchar     dname2[100][20]; //varchar类型 和 char 类型的区别. 与编译选项有关系varchar     loc2[100][20];EXEC SQL END  DECLARE SECTION ;int main(){    int ret = 0, i = 0;    EXEC SQL WHENEVER SQLERROR DO sqlerr();    EXEC SQL connect :serverid;    EXEC SQL WHENEVER NOT FOUND CONTINUE;    EXEC SQL select deptno, dname, loc into :deptno, :dname,:loc from dept;    count=  sqlca.sqlerrd[2];    printf("count:%d\n", count);    for (i=0; i<count; i++)    {        printf("%d, %s, %s\n", deptno[i], dname[i], loc[i]);    }    printf("通过varchar获取数据\n");    EXEC SQL select deptno, dname, loc into :deptno2, :dname2,:loc2 from dept;    count=  sqlca.sqlerrd[2];    printf("count:%d\n", count);    for (i=0; i<count; i++)    {        printf("%d, %s, %s\n", deptno2[i], dname2[i].arr, loc2[i].arr);    }    EXEC SQL COMMIT RELEASE; //提交事务断开连接    return ret; }//出错原因void sqlerr(){    EXEC SQL WHENEVER SQLERROR CONTINUE; // 下一步    printf("err reason:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);    //printf("err reason:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);    EXEC SQL ROLLBACK WORK RELEASE;//    exit(1);}

  • Makefile
.PHONY:clean allall:arrayarray:array.pc    proc "$@.pc"    gcc -g "$@.c" -o $@ -I${ORACLE_HOME}/precomp/public -L${ORACLE_HOME}/lib -lclntshclean:    rm array 
oracle@lzj:~$ ./array count:650, 20name             , 中国             10, ACCOUNTING         , NEW YORK           20, RESEARCH           , DALLAS             30, SALES              , CHICAGO            40, OPERATIONS         , BOSTON             61, 中国2            , 中国             通过varchar获取数据count:650, 20name, 中国10, ACCOUNTING, NEW YORK20, RESEARCH, DALLAS30, SALES, CHICAGO40, OPERATIONS, BOSTON61, 中国2, 中国
0 0