数据库 proc编程六

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"

//指示变量:用来对宿主变量做说明
//指示变量作输入:表示宿主变量是空值
//指示变量做输出:当值-1,表示返回的变量是空值
//语法格式:宿主变量 [indicator] 指示变量            其中indicator关键字可加可不加
//eg::name1 indicator :name_ind

EXEC SQL BEGIN DECLARE SECTION;
    char *serverid="scott/123456@orcl";

    int ida1[10];
    int idb1[10];
    varchar name1[10][20];
    short name_ind[10];//定义指示变量,必须是short宿主类型

    int ida2;
    int idb2;
    varchar name2[20];
    short name2_ind;//定义指示变量,做输入
EXEC SQL END DECLARE SECTION;

int sqlgls(void *,void *,void *);

//错误处理升级函数
void sqlerr()
{
    int ret=0;
    char stn[120];
    //sqlfc:SQL语句的实际长度
    size_t sqlfc,stmlen=120;
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    ret=sqlgls(stn,&stmlen,&sqlfc);
    if(ret!=0)
    {
        printf("sqlgls() failed ! err code: %d
",ret);
        return ;
    }
    printf("出错的SQL语句是:%.*s
",stmlen,stn);
    printf("err reason:%.*s
",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
    EXEC SQL ROLLBACK WORK RELEASE;
}

void main()
{
    EXEC SQL WHENEVER SQLERROR DO sqlerr();
    EXEC SQL connect:serverid ;
    printf("connect ok!
");
    //指示变量做输入,插入空值数据
    ida2=34;
    idb2=12;
    //注意:就算设置了指示变量的值不是-1,宿主变量也会变成空值存入数据库
    name2_ind=10;
    exec sql insert into t2 values(:ida2,:idb2,:name2:name2_ind);
    //提交事务
    EXEC SQL COMMIT;
    getchar();
    EXEC SQL WHENEVER NOT FOUND CONTINUE;
    //指示变量做输出
    EXEC SQL select ida,idb,name into :ida1,:idb1,:name1:name_ind from t2;
    //sqlca.sqlerrd[2]获取SQL语句查询到的记录数
    int count=sqlca.sqlerrd[2];
    //终端打印数据
    int i=0;
    for(i=0;i<count;i++)
    {
        if(name_ind[i]==-1)
        {
            printf("第%d条:ida1=%d,idb1=%d,name1=%s
",i,ida1[i],idb1[i],"空值");
        }else
        {
            printf("第%d条:ida1=%d,idb1=%d,name1=%s
",i,ida1[i],idb1[i],name1[i].arr);
        }
        
    }
    //提交断开连接
    EXEC SQL COMMIT RELEASE;
    system("pause");
}
原文地址:https://www.cnblogs.com/zhanggaofeng/p/6282391.html