Oracle pro*c/c++动态sql(方法三示例)

方法三

这种方法可以包含select查询语句,但是处理选择列表项(select查询出来的结果列数固定) 和 输入宿主变量个数一定。可以理解为:
1.输入宿主变量个数固定 查询条件固定
2.输出宿主变量个数固定 返回结果固定
可以结合游标使用

  • demo3

查询部门号等于**的信息

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlca.h"
#include "oraca.h"

typedef char mydname[20];
typedef char myloc[20];
extern sqlgls(char * , size_t *, size_t * );
extern sqlglmt(void *,char *,size_t *,size_t *);
//定义宿主变量
EXEC SQL BEGIN DECLARE SECTION;
	EXEC SQL TYPE mydname is string(20);
	EXEC SQL TYPE myloc is string(20);
	char 	*logname = "c##cott";
	char 	*pwd = "root";
	char *serverid = "c##scott/root"; 
	
	int				deptno;
	mydname 		dname; 
	myloc  			loc;
	//指示变量
	short 			dname_ind;
	short 			loc_ind;	

	char 			mySql[512];
	char 			*pSql;
EXEC SQL END DECLARE SECTION;
int connet();
void doerr();
int main()
{
	int 	ret = 0;	
	char    inputchar;
	memset(mySql, 0, sizeof(mySql));
	pSql = NULL;
	
	EXEC SQL WHENEVER SQLERROR DO doerr();
	connet();

	//循环处理sql语言
	for(;;)
	{
		printf("\n请输入查询的部门编号 ");
		scanf("%d", &deptno);
	
		//准备动态sql
		EXEC SQL PREPARE my_pre FROM 'select deptno, dname, loc from dept where deptno =:a';
		
		//定义游标
		EXEC SQL DECLARE mycursor CURSOR FOR my_pre;
		
		//打开游标
		EXEC SQL OPEN mycursor USING :deptno;
			
		//提取数据
		EXEC SQL WHENEVER NOT FOUND DO break;  //==错误号if (1403  ||| 1000)
		
		for (;;)
		{
			EXEC SQL FETCH mycursor INTO :deptno, :dname,:loc:loc_ind;
				
			printf("%d\t %s\t %s \n", deptno, dname, loc); 
			
		}
		EXEC SQL CLOSE mycursor;
		
	
		EXEC SQL COMMIT;
		
		
		printf("\n键入 n 退出, 其他继续? ");
		scanf("%c", &inputchar);
		fflush(stdin);
		
		if (inputchar=='n' || inputchar=='N')
		{
			break;
		}
	}

	EXEC SQL COMMIT WORK RELEASE;
	return ret ;
}	


int connet()
{
	int ret = 0;
	//连接数据库
	EXEC SQL connect :serverid;
	if (sqlca.sqlcode != 0)
	{
		ret = sqlca.sqlcode;
	}
	else
	{
		printf("connect ok...\n");
	}
	return  ret;
}
void doerr()
{
	char	szerrbuf[120];
	size_t	outputlen, inputlen = 120;
	unsigned int ret = 0;

	//出错时,可以把错误SQL语言给打印出来
	EXEC SQL WHENEVER SQLERROR CONTINUE;

	ret = sqlgls(szerrbuf, &inputlen, &outputlen);
	printf("SQL:%.*s\n", inputlen, szerrbuf);
	printf("提示:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
	EXEC SQL ROLLBACK WORK RELEASE;
	exit(1);
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值