Oracle pro*c/c++ scrollable cursor



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlca.h"
//申明库函数
extern sqlgls(char * , size_t *, size_t * );
extern sqlglmt(void *,char *,size_t *,size_t *);
typedef char dnameType[20];
typedef char locType[20];

EXEC SQL BEGIN DECLARE SECTION;
	EXEC SQL TYPE dnameType is string(20);
	EXEC SQL TYPE locType is string(20);
	char 	*serverid = "c##scott/root";
	
	int				deptno;
	dnameType		dname; //string 数据类型  
	short 			dname_ind;
	locType 		loc;
	short 			loc_ind;	
EXEC SQL END DECLARE SECTION;
void connet();
void sqlerr02();

int main()
{
	int ret = 0;	
	int i = 0;

	EXEC SQL WHENEVER SQLERROR DO sqlerr02();
	connet();
	//1 定义游标  declare cursor  在为某一次查询
	EXEC SQL DECLARE my_cur SCROLL CURSOR FOR 
		select deptno, dname, loc from dept;
	//2 打开游标 open cursor 
	EXEC SQL OPEN my_cur ;
	//3 获取数据 fetch data
		//查询最后一条数据
		EXEC SQL FETCH LAST my_cur  INTO :deptno, :dname:dname_ind, :loc:loc_ind;
		printf("%d\t %s\t %s \n", deptno, dname, loc );
	
		//查询第一条数据
		EXEC SQL FETCH FIRST my_cur  INTO :deptno, :dname:dname_ind, :loc:loc_ind;
		printf("%d\t %s\t %s \n", deptno, dname, loc );
		
		//查询第3条数据
		EXEC SQL FETCH ABSOLUTE 2 my_cur  INTO :deptno, :dname:dname_ind, :loc:loc_ind;
		printf("%d\t %s\t %s \n", deptno, dname, loc );
		
		//查询相对第3条数据 
		EXEC SQL FETCH RELATIVE 2 my_cur  INTO :deptno, :dname:dname_ind, :loc:loc_ind;
		printf("%d\t %s\t %s \n", deptno, dname, loc );
		
		//查询下一条
		EXEC SQL FETCH NEXT my_cur  INTO :deptno, :dname:dname_ind, :loc:loc_ind;
		printf("%d\t %s\t %s \n", deptno, dname, loc );
		
		//查询前一条
		EXEC SQL FETCH PRIOR  my_cur  INTO :deptno, :dname:dname_ind, :loc:loc_ind;
		printf("%d\t %s\t %s \n", deptno, dname, loc );

	//4 关闭游标 close data
	EXEC SQL CLOSE my_cursor ;	
	EXEC SQL COMMIT WORK RELEASE;
	return ret ;
}

void connet()
{
	int ret = 0;
	//连接数据库
	EXEC SQL connect :serverid;
	if (sqlca.sqlcode != 0)
	{
		ret = sqlca.sqlcode;
		printf("sqlca.sqlcode: err:%d \n", sqlca.sqlcode);
		return ;
	}
	else
	{
		printf("connect ok...\n");
	}
}
 void sqlerr02()
{
	char	stm[120];
	size_t	sqlfc, stmlen=120;
	unsigned int ret = 0;
	
	//出错时,可以把错误SQL语言给打印出来
	EXEC SQL WHENEVER SQLERROR CONTINUE;
	
	ret = sqlgls(stm, &stmlen, &sqlfc);	
	printf("出错的SQL:%.*s\n", stmlen, stm);
	printf("出错原因:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
	//printf("出错原因:%.70s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
	EXEC SQL ROLLBACK WORK RELEASE;
	exit(1);
}   






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值