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

在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 all
all:array
array:array.pc
    proc "$@.pc"
    gcc -g "$@.c" -o $@ -I${ORACLE_HOME}/precomp/public -L${ORACLE_HOME}/lib -lclntsh
clean:
    rm array 

oracle@lzj:~$ ./array 
count:6
50, 20name             , 中国             
10, ACCOUNTING         , NEW YORK           
20, RESEARCH           , DALLAS             
30, SALES              , CHICAGO            
40, OPERATIONS         , BOSTON             
61, 中国2            , 中国             
通过varchar获取数据
count:6
50, 20name, 中国
10, ACCOUNTING, NEW YORK
20, RESEARCH, DALLAS
30, SALES, CHICAGO
40, OPERATIONS, BOSTON
61, 中国2, 中国
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值